[使用绑定安装的主机目录和容器之间的Docker文件权限不匹配

问题描述 投票:1回答:1

问题

我的docker-compose堆栈由'postgresql','redis'和'Python api服务器'以及其他一些像opentracing等组成,但是问题区域仅限于上述内容。

  1. 我的撰写文件中的入口点是一个Shell脚本,它通过读取环境变量以及其他应做的事情来动态创建一些文件和文件夹。现在,这些文件的创建就像一个超级按钮一样,但是这些动态生成的文件的文件和文件夹权限变得很有趣。在macOS上,这些动态生成的文件和文件夹由运行docker-compose up的非root用户拥有。但是,在运行Ubuntu 19.01的Linux机器上,尽管Dockerfile明确对整个项目的文件夹执行了root并将活动的USER设置为chown non-root-user:non-root-group

  2. ,但这些文件和文件夹仍归non-root-user所有
  3. Postgres容器将自身安装到给定的路径上,但是该目录的所有者不再是谁创建的,而是一些奇怪的systemd-coredump我猜这是因为Postgres Dockerfile上的userID和group映射到我的Linux服务器上的该用户名?如果是,建议如何避免这种情况?

由于运行docker-compose up的非root用户无法在主机上保留文件和文件夹权限,因此Im遇到permission denied问题。尽管chmod 777有助于解决问题,但我相信chmod 777从未真正解决任何问题。

重申所有这些仅在Linux计算机上是一个问题。在运行Docker-For-Mac的Macos上,既有的动态生成的文件/文件夹都将非root用户登录为所有者,并在容器内,Dockerfile中的指定USER仍为所有现有的所有者(那些通过COPY)和新生成的动态文件/文件夹进行传输。

示例

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

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容器卷安装位置的所有权。

postgresql docker docker-compose file-permissions permission-denied
1个回答
0
投票

由于要在docker-compose中绑定安装python容器,因此Dockerfile文件和现有权限无关。在运行时,它将pwd挂载到/ PROTON,因此/ PROTON处映像中的所有内容均被隐藏,并且容器仅在主机上看到pwd

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

© www.soinside.com 2019 - 2024. All rights reserved.