Docker 撰写文件所有权

Docker compose file ownership

我用 Docker Compose 创建了 Django 项目:

Docker文件

FROM python:2.7

ENV PYTHONUNBUFFERED 1

RUN mkdir /code
WORKDIR /code
ADD . /code/

RUN pip install -r requirements.txt

WORKDIR /code/example
ENTRYPOINT ["python", "manage.py"]

docker-compose.yml

postgres:
  image: postgres
  ports:
  - '5432:5432'

django-project:
  build: .
  command: runserver 0.0.0.0:8000
  volumes:
  - .:/code
  ports:
  - '8000:8000'
  links:
  - postgres

效果很好。 但是通过容器 'django-project' 创建的所有新文件都有 root 所有者和组。

我尝试在容器 django-project 的 Compose 配置中添加 user: user。 但是出现异常 User user not found.

我尝试在容器中添加 user,代码为:

ENV HOME_USER user
ENV HOME_PASS password

RUN useradd -m -s /bin/bash ${HOME_USER} && \
    echo "${HOME_USER}:${HOME_PASS}"|chpasswd && \
    adduser ${HOME_USER} sudo && \
    echo ${HOME_USER}' ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers

但异常仍然存在。

我如何为将通过 docker 容器创建的所有新文件应用非 root 所有权?

如果您的 useradd 有效,那么最后一块拼图是在构建容器时切换到 Dockerfile 中的该用户以 运行 特定命令:
https://docs.docker.com/engine/reference/builder/#user

请注意,在 docker-compose.yml 中指定 user: user 只会影响启动容器时的最终进程 运行(即 ENTRYPOINTCMD)
https://docs.docker.com/engine/reference/run/#user

所以你需要:

FROM python:2.7

ENV PYTHONUNBUFFERED 1

ENV HOME_USER user
ENV HOME_PASS password

RUN useradd -m -s /bin/bash ${HOME_USER} && \
    echo "${HOME_USER}:${HOME_PASS}"|chpasswd && \
    adduser ${HOME_USER} sudo && \
    echo ${HOME_USER}' ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers

USER user

RUN mkdir /code
WORKDIR /code
ADD . /code/

RUN pip install -r requirements.txt

WORKDIR /code/example
ENTRYPOINT ["python", "manage.py"]

或者,您可以 运行 作为 root 用户的所有内容,但 chown 所有文件作为 Dockerfile 中的 RUN 步骤:

FROM python:2.7

ENV PYTHONUNBUFFERED 1

ENV HOME_USER user
ENV HOME_PASS password

RUN useradd -m -s /bin/bash ${HOME_USER} && \
    echo "${HOME_USER}:${HOME_PASS}"|chpasswd && \
    adduser ${HOME_USER} sudo && \
    echo ${HOME_USER}' ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers

RUN mkdir /code
WORKDIR /code
ADD . /code/

RUN chown -R user /code

RUN pip install -r requirements.txt

WORKDIR /code/example
ENTRYPOINT ["python", "manage.py"]