gpt4 book ai didi

linux - 使用绑定(bind)挂载的主机目录和容器之间的 Docker 文件权限不匹配

转载 作者:行者123 更新时间:2023-12-02 18:01:58 26 4
gpt4 key购买 nike

The problem



我的 docker-compose 堆栈由“postgresql”、“redis”和“Python api server”以及其他一些如 opentracing 等组成,但问题区域仅限于前面提到的。
  • 我的 compose 文件中的入口点是一个 shell 脚本,它通过读取环境变量以及它应该做的其他事情来动态创建一些文件和文件夹。现在,这些文件的创建就像一个魅力,但这些动态生成的文件的文件和文件夹权限变得有趣。在 macOS 上,这些动态生成的文件和文件夹归运行 docker-compose up 的非 root 用户所有。 .但是,在运行 Ubuntu 19.01 的 linux 机器上,这些文件和文件夹归 root 所有。尽管 Dockerfile 明确地做了 chown non-root-user:non-root-group到整个项目的文件夹并将事件用户设置为 non-root-user
  • postgres 容器将自己挂载到给定路径上,但该目录的所有者不再是创建它的人,而是一些奇怪的 systemd-coredump我猜这是因为 Postgres 的 Dockerfile 上的用户 ID 和组映射到我的 linux 服务器上的这个用户名?如果是,避免这种情况的推荐方法是什么?

  • 由于运行 docker-compose up 的非 root 用户无法保留主机上的文件和文件夹权限,我遇到了 permission denied问题。虽然 chmod 777有助于摆脱问题,我相信 chmod 777 从来没有真正解决任何问题。

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

    Example



    文件和文件夹所有权更改的示例:
    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
    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:
    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用户拥有的目录。尽管如此,当有动态生成的文件/文件夹时,它们会得到 root作为他们的主人。而且,这只发生在linux上。

    Win



    就像在 MacOS 中一样,我希望 linux 机器上的非 root 主机保留所有预先存在的和动态生成的文件/文件夹的所有权,因此不会导致任何“权限被拒绝”问题。

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

    最佳答案

    由于您在 docker-compose 中绑定(bind)挂载 python 容器,因此 Dockerfile 文件和现有权限无关紧要。在运行时,它会挂载 pwd到/PROTON,因此/PROTON 图像中的任何内容都被隐藏,容器只能看到 pwd在主机上。

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

    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 的友好名称,所以只要确保它们在主机用户和容器使用之间匹配,你就会很好。

    无关提示:
  • 您可以change the user that compose starts your container with , 使用 user: username ,但如果它是你用 USER 放入 Dockerfile 的那个,那么在这种情况下就不需要了。
  • 您的 Dockerfile COPY command can use chown内联,为您节省图像中的步骤和空间:
  • COPY --chown=1000:1000 . /PROTON, 或
  • COPY --chown=proton:proton . /PROTON
  • 关于linux - 使用绑定(bind)挂载的主机目录和容器之间的 Docker 文件权限不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58966732/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com