【问题标题】:How to run docker image as a non-root user?如何以非 root 用户身份运行 docker 镜像?
【发布时间】:2015-04-27 08:44:17
【问题描述】:

我是 docker 新手。当我使用命令运行像 ubuntu 镜像这样的 docker 镜像时,

sudo docker run -i -t ubuntu:14.04

默认情况下,它是像这样以root身份进入容器的。

我对此进行了搜索,但我无法以非 root 用户身份启动 docker 映像,因为我完全是该主题的初学者。

如果有人举例说明如何以非 root 用户身份运行 docker 映像,那就太好了。

【问题讨论】:

    标签: docker


    【解决方案1】:

    docker run 命令具有-u parameter 允许您指定不同的用户。在您的情况下,假设您的 docker 映像中有一个名为 foo 的用户,您可以运行:

    sudo docker run -i -t -u foo ubuntu:14.04 /bin/bash
    

    注意:-u 参数等效于 Dockerfile 的 USER 指令。

    【讨论】:

    • 您的意思是将用户添加到 docker 组吗?
    • 我们在运行的 docker 容器中是否需要这个用户(英国)?否则图像将如何识别该用户?正如 Adrian 所问的,您指的是 docker group 吗?
    • 同样会抛出错误,FATA[0000] Error response from daemon: Cannot start container acbd05873a7a22fdd538c931f9e6ee54184ff5f3ac6c281d732bbde1823cb731: [8] System error: Unable to find user uk
    • @Udhayakumar;是的,您需要事先在图像中创建用户。
    • 请不要将您的用户添加到 docker 组。事实上,你永远不应该将任何用户添加到 docker 组,除非在非常非常特殊的情况下(我还想不到)。 docker 组是根等效的。一旦进入 docker 组,用户就可以免费执行权限提升。这在互联网上有记录,Docker documentation 中甚至还有免责声明。
    【解决方案2】:

    这无疑是 hacky,但对于那些你开始快速测试一些东西的快速小容器很有用:

    #!/bin/bash
    
    set -eu
    
    NAME=$1
    IMG=$2
    
    #UID=$(id -u)
    USER=$(id -un)
    GID=$(id -g)
    GROUP=$(id -gn)
    
    docker run -d -v /tmp:/tmp -v "/home/$USER:/home/$USER" -h "$NAME" --name "$NAME" "$IMG" /bin/bash
    
    docker exec "$NAME" /bin/bash -c "groupadd -g $GID $GROUP && useradd -M -s /bin/bash -g $GID -u $UID $USER"
    

    我在这里使用的脚本的完整版本:

    https://github.com/ericcurtin/staging/blob/master/d-run

    【讨论】:

    • 您可以通过在旧镜像的基础上创建一个新的 docker 镜像来使这个 hack 更加正式,docker 文件包含更正用户配置的步骤。请注意,在基于 busybox 的 docker 上,您必须使用 deluser 和 delgroup,因为没有 usermod。
    • 是的,但这并不困扰我,因为这些步骤需要几毫秒,我必须为我使用它的每个图像编写一个新的 dockerfile(在我的工作中,这是很多 dockerfile !)
    【解决方案3】:

    udocker 是 docker 的基本变体,在用户空间中运行:

    udocker 是一个基本的用户工具,可以在用户空间执行简单的 docker 容器,无需 root 权限。在 docker 不可用的 Linux 系统中,允许非特权用户下载和执行 docker 容器。它可用于在 Linux 批处理系统和交互式集群中拉取和执行 docker 容器,这些集群由其他实体管理,例如网格基础设施或外部管理的批处理或交互式系统。

    【讨论】:

      【解决方案4】:

      不建议在没有 sudo 的情况下运行 docker,因为 Docker 没有内置审计或日志记录,而 sudo 有。 如果你想让 docker 访问非 root 用户,Red Hat 建议设置 sudo。 在 /etc/sudoers 中添加如下条目。

      dwalsh        ALL=(ALL)       NOPASSWD: /usr/bin/docker
      

      现在,在 ~/.bashrc 中设置一个别名来运行 docker 命令:

      alias docker="sudo /usr/bin/docker"
      

      现在,当用户以非 root 身份执行 docker 命令时,它将被允许并获得正确的日志记录。

      docker run -ti --privileged -v /:/host fedora chroot /host
      

      查看日志或 /var/log/messages。

      journalctl -b | grep docker.*privileged
      Aug 04 09:02:56 dhcp-10-19-62-196.boston.devel.redhat.com sudo[23422]:   dwalsh : TTY=pts/3 ; PWD=/home/dwalsh/docker/src/github.com/docker/docker ; USER=root ; COMMAND=/usr/bin/docker run -ti --privileged -v /:/host fedora chroot /host
      

      【讨论】:

      • 用户询问是否在容器内以非 root 用户身份运行,而您正在谈论以非 root 用户身份在容器外运行。非常不同的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 2018-10-23
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多