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

问题描述 投票:0回答:2

我创建了一个 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 选项将主机 passwd、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
linux docker file-permissions opensuse
2个回答
5
投票

您可以在 Dockerfile 镜像中添加 fixuid(由 Caleb Lloyd)。
请参阅

moby/moby
第7198期

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

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

示例:

  • Docker 容器是使用用户/组
    dockeruser:dockergroup
    作为 UID/GID
    1000:1000
    构建的。
  • 主机作为 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 匹配,并且在主机挂载上的容器中创建的文件也将匹配。

它可以作为

ENTRYPOINT
或作为启动脚本的一部分运行。它作为
root
拥有的二进制文件安装在容器中,并带有
setuid
位,并升级权限以进行适当的更改。它只能在开发容器中使用。


0
投票

在 Windows Docker Desktop 用户中:

docker run --user 0  -d ImageName
© www.soinside.com 2019 - 2024. All rights reserved.