【问题标题】:Docker compose file ownershipDocker 撰写文件所有权
【发布时间】:2016-01-26 07:26:58
【问题描述】:

我使用 Docker Compose 创建了 Django 项目:

Dockerfile

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 所有权?

【问题讨论】:

  • 您需要在您的 dockerfile 中创建一个将被分配所有权的新用户,然后将 /app 文件夹分配给该用户。
  • 我用有问题的代码添加用户,但新文件仍以 root 作为所有者创建。我从非root用户制作docker-compose up。我可以将此用户设置为所有新文件的所有者吗?

标签: django docker-compose file-ownership


【解决方案1】:

如果您的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"]

【讨论】:

  • 我尝试了你的两个食谱,但都没有帮助。当我使用命令 docker-compose run django-project makemigrations example 创建新迁移时,新迁移的文件以 root 作为所有者。
  • 这又是不同的东西...尝试查看文档:docs.docker.com/compose/reference/run ...使用-u 标志运行
  • 我尝试使用我的主机用户名和在容器用户中创建的用户名。在这两种情况下都出现错误“无法找到用户...”。
  • 你需要在构建镜像的时候创建用户,在dockerfile中有RUN useradd,还有docker-compose run -u <user from dockerfile>
  • 是的。当我写作时,我尝试了容器中的用户名,我的意思是我在容器中构建它。这个案子对我没有帮助。我收到错误“无法找到用户用户”
猜你喜欢
  • 2019-03-25
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
相关资源
最近更新 更多