【问题标题】:Docker, why the user and group are different?Docker,为什么用户和组不同?
【发布时间】:2021-12-02 15:47:35
【问题描述】:

我在下面创建了一个 Dockerfile

FROM nvidia/cuda:10.1-cudnn7-runtime-ubuntu18.04

ENV CUDA_PATH /usr/local/cuda
ENV CUDA_INCLUDE_PATH /usr/local/cuda/include
ENV CUDA_LIBRARY_PATH /usr/local/cuda/lib64

RUN apt update -yq 

RUN apt install -yq curl wget unzip git vim cmake zlib1g-dev g++ gcc sudo build-essential libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev openssh-server

RUN adduser --disabled-password --gecos '' docker && \
    adduser docker sudo && \
    echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

RUN mkdir -p /.cache/pip
RUN mkdir -p /.local/share
RUN mkdir -p /.local/lib
RUN mkdir -p /.local/bin
RUN chown -R docker:docker /.cache/pip
RUN chown -R docker:docker /.local
RUN chown -R docker:docker /.local/lib
RUN chown -R docker:docker /.local/bin

# Configure SSHD.
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
RUN mkdir /var/run/sshd
RUN bash -c 'install -m755 <(printf "#!/bin/sh\nexit 0") /usr/sbin/policy-rc.d'
RUN ex +'%s/^#\zeListenAddress/\1/g' -scwq /etc/ssh/sshd_config
RUN ex +'%s/^#\zeHostKey .*ssh_host_.*_key/\1/g' -scwq /etc/ssh/sshd_config
RUN RUNLEVEL=1 dpkg-reconfigure openssh-server
RUN ssh-keygen -A -v
RUN update-rc.d ssh defaults
RUN ln -s /lib/x86_64-linux-gnu/libc.so.6 /lib64/libc.so.6
RUN ln -s /lib/x86_64-linux-gnu/libc.so.6 /lib/libc.so.6

# Configure sudo.
RUN ex +"%s/^%sudo.*$/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/g" -scwq! /etc/sudoers

USER docker
RUN ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519

WORKDIR /home/docker/

RUN chmod a+rwx /home/docker/ && \
    wget https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.3-Linux-x86_64.sh && \
    bash Miniconda3-py37_4.10.3-Linux-x86_64.sh -b && rm Miniconda3-py37_4.10.3-Linux-x86_64.sh

ENV PATH /home/docker/.local/bin:$PATH
ENV PATH /home/docker/miniconda3/bin:$PATH

ENV which python3.7

RUN mkdir -p /home/docker/.local/
RUN chown -R docker:docker /home/docker/.local/
RUN chmod -R 777 /home/docker/.local/
RUN chmod -R 777 /.local/lib
RUN chmod -R 777 /.local/bin
RUN chmod -R 777 /.cache/pip/

RUN python3.7 -m pip install pip -U
RUN python3.7 -m pip install tensorflow-gpu==2.5.0 ray[rllib] gym[atari] torch==1.7.1 torchvision==0.8.2 scikit_learn==0.23.1 sacred==0.8.1 PyYAML==5.4.1 tensorboard_logger

# ENV PYTHONPATH "${PYTHONPATH}:/home/docker/.local/lib/python3.7/site-packages/"

RUN sudo ln -s $(which python3.7) /usr/bin/python
RUN ls $(python3.7 -c "import site; print(site.getsitepackages()[0])")
RUN python3.7 -m pip list
RUN python3.7 -m pip uninstall -y enum34
USER docker
RUN mkdir -p /home/docker/app
RUN chown -R docker:docker /home/docker/app
WORKDIR /home/docker/app

然后我建立了一个图像。之后,我使用这张图片运行。

NV_GPU=1 nvidia-docker run -i \
    --name $name \
    --user docker \
    -v `pwd`:/home/docker/app \
    -t MyImage:1.0 \
    ${@:2}

我使用 Dockerfile 中定义的用户 docker 并将当前文件挂载到工作目录。但是,它显示docker 用户无权创建任何文件

PermissionError: [Errno 13] Permission denied

还有/home/docker/app中的文件

docker@109c5e6b269a:~/app$ ls -l
total 64
-rw-rw-r--  1 1002 1003 11342 Oct 13 12:50 LICENSE
-rw-rw-r--  1 1002 1003  4831 Oct 14 05:49 README.md
drwxrwxr-x  3 1002 1003  4096 Oct 14 08:12 docker
-rwxrw-r--  1 1002 1003   225 Oct 14 08:36 run_train.sh
drwxrwxr-x 11 1002 1003  4096 Oct 14 03:46 src
drwxrwxr-x  4 1002 1003  4096 Oct 13 12:50 third-party

显示用户和组不是docker。我尝试将所有者更改为docker,但我的本地文件系统发生了一些错误。

我该如何解决这个PermissionError 问题?

谢谢。

【问题讨论】:

  • 假设您有两台 PC。其中之一是用户docker。另一方面也有。但在一个id -u docker 是1002,但在另一个不是。
  • 文件和目录的文件所有权在映射卷时不会改变。 ls -l 列出的数字 ID 对应于在您的主机上拥有相应文件或目录的用户和组的 ID。检查id
  • 顺便说一句,mkdirchown 都接受一个 list 参数,就像 Unix 上的所有文件和目录实用程序一样。您不必多次调用它们来创建或操作无数目录。
  • 如果你删除docker run -v选项,Docker会使用镜像中内置的代码,Dockerfile中的设置和权限会达到预期的效果。我建议保留 root 用户拥有的代码,将文件写入专用数据目录,并更改该目录的权限以仅允许其他用户。如果需要持久化数据,可以将容器的用户设置为匹配主机用户的数字用户ID; docker run -u $(id -u) -v "$PWD/data:/home/docker/app/data".

标签: linux docker docker-compose


【解决方案1】:

您正在将某个目录 (pwd) 映射到一个卷。问题是您的本地目录属于具有UID=1002 的用户,但在容器内,用户docker 映射到不同的UID(可能是1000)。

一个简单的解决方案是在创建用户时编辑 Dockerfile 以指定 UID,使其与您的本地目录匹配。

如果您希望您的图像被其他人使用,一个很好的解决方案是创建一个入口点脚本,以便在容器创建时根据环境变量修改用户的 UID。

【讨论】:

猜你喜欢
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 2014-08-25
相关资源
最近更新 更多