让非root用户写入Docker中的linux主机

我有一个OpenSuse 42.3docker容器的图像,我创build了一个用户,我们称之为“streamuser”。 我希望这是每当有人从我的图像创build容器时处于活动状态的用户。 我已经将主机的主目录挂载到streamuser的主目录。 我遇到的麻烦是,如果我在Linux主机上运行Docker容器,streamusercan不会向主机目录写任何东西。 这是因为streamuser与主机不共享相同的UID和GID。 有没有一种干净的方式来解决这个问题,避免我设置图像的默认用户帐户到root帐户? 如果我在容器中以root身份login,那么我可以写入到Linux主机,但这是不可取的。

我的docker电话是:

docker run -it -d --name ${containerName} --user="streamuser" \ --workdir="/home/streamuser" --volume="${home}:/home/streamuser" \ ${imageName} /bin/bash -rcfile /opt/Codebase/image_env_setup_v206.sh 

我已经看到一个解决scheme,有人使用–volume选项将主机passwd,sudoers等文件传递给容器。 我不喜欢这个选项,因为它覆盖了我制作的容器内的环境,而且看起来像是一个蹩脚的解决scheme。

我的dockerfile是:

 FROM opensuse:42.3 RUN zypper update -y && \ zypper install -y \ sudo \ vim \ gcc-fortran \ infinipath-psm-devel \ openmpi \ openmpi-devel \ openmpi-libs \ hdf5-openmpi \ blas-devel \ blas-devel-static \ lapack-devel \ which RUN echo "root:streamuser_2017" | chpasswd RUN useradd -m streamuser RUN passwd -d streamuser CMD /bin/bash RUN mkdir -p -m0755 \ /opt/codeA/lib \ /opt/codeA/bin \ /opt/codeB/lib \ /opt/codeC/lib \ /opt/codeC/bin \ /opt/petsc/lib USER streamuser WORKDIR /home/streamuser RUN source $HOME/.bashrc COPY ./Docker/critical_dependencies/codeA_lib/* /opt/codeA/lib/ COPY ./Docker/critical_dependencies/codeA_bin/* /opt/codeA/bin/ COPY ./Docker/critical_dependencies/codeB_lib/* /opt/codeB/lib/ COPY ./Docker/critical_dependencies/petsc_lib/* /opt/petsc/lib/ COPY ./lib/* /opt/codeC/lib/ COPY ./bin/* /opt/codeC/bin/ COPY ./Docker/image_env_setup_v206.sh /opt/codeC RUN source /opt/codeC/image_env_setup_v206.sh 

您可以在Dockerfile图像中添加fixuid (通过Caleb Lloyd )。
参见moby/moby问题7198 :

我们已经为此问题创build了一个解决方法,将在构build时将Docker容器的用户/组和文件权限更改为在运行时启动容器的UID / GID。

项目和安装说明位于: https : //github.com/boxboat/fixuid

例:

  • Docker容器是使用user / group dockeruser:dockergroup作为UID / GID 1000:1000 dockeruser:dockergroup
  • 主机以UID / GID 1001:1002
  • 图像运行docker run -u 1001:1002

fixuid将:

  • 将dockeruser UID更改为1001
  • 将dockergroup GID更改为1002
  • 将旧的dockeruser:dockergroup所有文件权限更改为1001:1002
  • 更新容器中的$HOME到dockeruser $HOME
  • 现在容器和主机UID / GID匹配,并且主机装载上的容器中创build的文件将匹配。

它可以作为ENTRYPOINT运行,也可以作为启动脚本的一部分运行。 它作为一个由setuid位拥有的二进制文件安装在容器中,并升级权限以进行相应的更改。 它只能用在开发容器中。