首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用绑定挂载的主机dir和容器之间的Docker文件权限不匹配

使用绑定挂载的主机dir和容器之间的Docker文件权限不匹配
EN

Stack Overflow用户
提问于 2019-11-21 03:14:58
回答 1查看 10K关注 0票数 6

问题所在

我的停靠-撰写堆栈由'postgresql‘、'redis’和'Python服务器‘以及其他一些类似开放竞赛等组成,但是问题区域仅限于前面提到的。

  1. 我编写的文件中的入口点是一个shell脚本,它通过读取环境变量以及它应该做的其他事情动态地创建几个文件和文件夹。现在,创建这些文件就像一种魅力,但是这些动态生成的文件的文件和文件夹权限变得有趣了。在macos上,这些动态生成的文件和文件夹属于运行docker-compose up的非根用户。但是,在运行Ubuntu19.01的linux机器上,这些文件和文件夹由root拥有,尽管Dockerfile显式地对整个项目的文件夹执行chown non-root-user:non-root-group操作,并将活动用户设置为这个non-root-user
  2. postgres容器将自己装载到给定的路径上,但是该目录的所有者不再是创建它的人,而是一些奇怪的systemd-coredump --我猜这是因为userID和Postgres‘Dockerfile上的组映射到我的linux服务器上的这个用户名?如果是,建议避免这种情况的方法是什么?

因为运行docker-compose up的非根用户无法在主机上保留文件和文件夹权限,所以我遇到了permission denied问题。虽然chmod 777有助于解决问题,但我相信chmod 777从未真正解决过任何问题。

重申所有这些都只是Linux机器上的一个问题。在运行Dockerfile的Macos上,预先存在和动态生成的文件/文件夹都保留非根登录用户作为其所有者和容器内部,Dockerfile中的指定用户仍然是所有预先存在的(通过COPY传输的文件/文件夹)和新生成的动态文件/文件夹的所有者。

示例

文件和文件夹所有权更改的示例:

代码语言:javascript
复制
drwxrwxr-x 13 sparkle_deployment_2 sparkle_deployment_2 4096 Nov 21 01:00 PROTON/
drwx------ 19 systemd-coredump     docker               4096 Nov 21 01:00 proton_db/

从上面看,proton_db应该安装在Postgres上。这个文件夹最初是由用户- sparkle_deployment_2创建的。在docker-compose up之后,所有者和组分别更改为system-coredumpdocker

这是我的一片: docker-compose.yaml

代码语言:javascript
复制
version: "3.4"
services:
  pg:
    container_name: proton_postgres
    restart: always
    image: postgres
    environment:
      - POSTGRES_USER=${PG_USERNAME}
      - POSTGRES_PASSWORD=${PG_PASSWORD}
      - POSTGRES_DB=${PG_TARGET_DB}
    volumes:
      - ${PROTON_POSTGRES_VOLUME_MOUNT}:/var/lib/postgresql/data
    ports:
      - ${PG_TARGET_PORT}:${PG_TARGET_PORT}
  redis:
    container_name: proton_redis
    restart: always
    image: redis
    volumes:
      - ${PROTON_REDIS_VOLUME_MOUNT}:/data
    ports:
      - ${REDIS_TARGET_PORT}:${REDIS_TARGET_PORT}
  proton:
    container_name: proton
    restart: always
    image: proton_stretch
    ports:
      - ${PROTON_TARGET_PORT}:${PROTON_TARGET_PORT}
    expose:
      - ${PROTON_TARGET_PORT}
    volumes:
      - .:/PROTON
      - ${PROTON_SQLITE_VOLUME_MOUNT}:/PROTON/proton-db
    depends_on:
      - pg
      - redis
    entrypoint: ["./proton.sh"]

下面是我的API服务器的Dockerfile:

代码语言:javascript
复制
FROM python:3.7.3-stretch

RUN apt-get update
RUN apt-get install bash
RUN apt-get install -y gcc g++ unixodbc-dev

RUN groupadd -g proton_user_group
RUN useradd -G proton_user_group default_proton_user

RUN mkdir -p /PROTON
WORKDIR /PROTON
COPY . /PROTON

RUN python3 -m pip install -r requirements.txt --no-cache-dir

RUN chown -R default_proton_user:proton_user_group /PROTON
USER default_proton_user

EXPOSE 3000/tcp

正如您所看到的,我正在做一个chown来显式地让非根用户拥有这个目录。尽管如此,当有动态生成的文件/文件夹时,它们将root作为其所有者。而且,这种情况只发生在linux上。

与MacOS一样,我希望linux机器上的非根主机保留对所有预先存在和动态生成的文件/文件夹的所有权,从而不会导致任何“拒绝权限”问题。

加上linux机器上相同的非根主机,以保留Postgres容器卷被安装到的位置的所有权。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-21 08:58:40

因为您正在绑定-将python容器挂载在Dockerfile中,所以Dockerfile文件和现有权限是无关的。在运行时,它将pwd挂载到/PROTON,因此/PROTON图像中的任何内容都是隐藏的,容器只看到主机上的pwd

容器中的用户是与主机匹配的简单UID和GID号。例如,在主机上使用id命令获取UID和GID。对我来说,它们是1000和1000。您只需要确保在容器中运行的用户和组是相同的UID/GID。

代码语言:javascript
复制
RUN groupadd --gid 1000 proton \
  && useradd --uid 1000 --gid proton --create-home proton

现在主机用户和容器用户UID/GID是相同的,您将注意到在pwd中创建的文件与每个用户的用户名匹配。主机上的Linux将查找UID 1000并看到它的主机用户(对我来说是bret),如果您执行docker-compose exec proton ls -al /PROTON,您应该注意到它会在容器中查找用户1000并看到proton用户名只是ID的友好名称,所以只要确保它们在主机用户和容器使用之间匹配,您就会很好。

不相关的提示:

  • 您可以使用更改撰写文件的用户,使用,使用user: username,但是如果您将它与用户一起放入Dockerfile中,则在本例中不需要。
  • 您的Dockerfile复制命令可以使用chown内联,以节省图像中的步骤和空间:
    • COPY --chown=1000:1000 . /PROTON,或
    • COPY --chown=proton:proton . /PROTON

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58966732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档