Docker Compose文件的所有权

3

我使用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”创建的所有新文件都具有根所有者和组。

我尝试在Compose配置中为容器“django-project”添加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文件夹的所有权赋予该用户。 - Burhan Khalid
1
我按照问题中的代码添加了用户,但新文件仍然以root作为所有者创建。我从非root用户执行docker-compose up。我能将此用户设置为所有新文件的所有者吗? - petrikoz
1个回答

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 用户运行,但是在 Dockerfile 中的 RUN 步骤中使用 chown 更改所有文件的所有权:

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。 - petrikoz
那又是另一回事了...尝试查看文档:https://docs.docker.com/compose/reference/run/ ...使用-u标志运行 - Anentropic
我尝试使用我的主机用户名和在容器中创建的用户名。两种情况下都出现了“无法找到用户”的错误。 - petrikoz
жӮЁйңҖиҰҒеңЁжһ„е»әй•ңеғҸж—¶дҪҝз”ЁRUN useraddеңЁDockerfileдёӯеҲӣе»әз”ЁжҲ·пјҢ并且иҝҳйңҖиҰҒдҪҝз”Ёdocker-compose run -u <Dockerfileдёӯзҡ„з”ЁжҲ·>гҖӮ - Anentropic
是的。当我写到尝试从容器中使用用户名时,我指的是我在容器中构建它。但这种情况并没有帮助我。我收到了“无法找到用户user”的错误。 - petrikoz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接