【发布时间】:2018-01-13 02:14:41
【问题描述】:
我创建了一个 OpenSuse 42.3 docker 容器镜像,它有一个用户,我们称之为“streamuser”。每当有人从我的图像创建容器时,我希望它成为活跃的用户。我已将主机的主目录挂载到 streamuser 的主目录。我遇到的问题是,如果我在 Linux 主机上运行 Docker 容器,streamuser 无法向主机目录写入任何内容。这是因为 streamuser 不与主机共享相同的 UID 和 GID。有没有一种干净的方法来解决这个问题,避免我将图像中的默认用户帐户设置为 root 帐户?如果我在容器中以 root 身份登录,那么我可以写入 linux 主机,但这是不可取的。
我的码头工人电话是:
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
我看到有人使用 --volume 选项将主机密码、sudoers 等文件传递给容器的解决方案。我不喜欢这个选项,因为它会覆盖我在容器中精心设计的环境,而且它看起来像是一个笨拙的解决方案。
我的 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
【问题讨论】:
-
如何将容器内的streamuser的Gid改成属于容器内的根组?
-
@Ayushya 我曾想过这样做,但我认为将用户添加到根组通常是不受欢迎的。
-
没错,我提出了这个解决方案,但即使我同意“用户不应该被添加到根组”
标签: linux docker file-permissions opensuse