【问题标题】:Running docker as non-root user OR running jenkins on tomcat as root user以非 root 用户身份运行 docker 或以 root 用户身份在 tomcat 上运行 jenkins
【发布时间】:2016-01-11 03:21:31
【问题描述】:

我正在尝试使用 docker-maven 插件构建 docker 映像,并计划使用 jenkins 执行 mvn 命令。我将 jenkins.war 部署在 tomcat 实例上,而不是作为非 root 用户运行的独立应用程序上。 问题是 docker 需要以 root 用户身份运行,因此 maven 命令需要以 root 用户身份运行,因此 jenkins/tomcat 需要以 root 用户身份运行,这不是一个好习惯(尽管我的非 root 用户是也 sudoer 所以我想这没什么大不了的)。

所以最重要的是,我看到了两种解决方案:要么以非 root 用户身份运行 docker(并且需要有关如何执行此操作的帮助) 或者 需要以 root 身份运行 jenkins(并且不确定如何实现,因为我更改了环境变量 /config 并且仍然没有切换到 root)。

关于选择哪种解决方案以及如何实施它有什么建议吗?

【问题讨论】:

    标签: maven tomcat jenkins docker devops


    【解决方案1】:

    问题是docker需要以root用户运行,所以maven命令需要以root用户运行,

    不,可以使用-u (--user) parameter 完成 docker run,以便在容器内使用非 root 用户。

    以非 root 用户身份运行 docker

    Your user (on the host) needs to be part of the docker group。然后,您可以使用该用户运行 docker 服务。

    正如评论的那样,这不是很安全。
    见:

    最后一个链接以以下发现结束:

    • 如果容器内的进程正在执行一个已知的 uid,它可以像限制对主机系统的访问一样简单,以便容器中的 uid 具有有限的访问权限。
    • 更好的解决方案是使用--user 以已知的 uid 启动容器(您也可以使用用户名,但请记住,这只是从主机的用户名系统提供 uid 的一种更友好的方式), 然后限制对您决定容器运行的主机上的 uid 的访问
    • 由于 uid 和用户名(以及 gid 和组名)如何从容器映射到主机,指定运行容器化进程的用户可以使进程看起来由容器内部和外部的不同用户拥有。

    关于最后一点,您现在拥有 user namespace (userns) remapping(从 docker 1.10 开始,但我建议 17.06,因为 issue 33844)。

    【讨论】:

    • 作为“docker”组的成员确实授予对 docker 命令的访问权限,但它实际上也与使用户成为 root 相同(似乎是我的回应)。我想如果有问题的用户已经是 sudoer,(根据 OP)这一切都没有实际意义,但我反对将“docker”组作为快速修复来推广。
    • @Ryan 这两个问题是不同的。 docker 组与否,您仍然可以使用 -u 参数运行,确保容器内的用户不是 root。第二个问题确实存在(github.com/chrisfosterelli/dockerrootpleasemedium.com/@mccode/…)最后一个链接包括推荐。
    • @Ryan 我已经编辑了答案以提出替代方案。
    • 谢谢。尽我所能。 --user 选项一切都很好,但这只能保护主机免受构建不良的容器的影响。它不能保护主机免受本地用户的任意 docker 命令(他们可以选择不使用它),这是他的 jenkins 守护进程所需要的。
    【解决方案2】:

    我还纠结于如何设置 docker 构建服务器。

    这是我现在看到基本事实的地方......

    • Docker 命令需要 root 权限

      • 这是因为如果可以运行任意 docker 命令,则您在主机上拥有与 root 相同的权限。 (您可以在内部构建一个以 root 身份运行的容器,并将文件系统挂载到主机上的任何位置,从而允许任何 root 操作。)
    • “码头工人”组是一个大谎言恕我直言。这实际上与使成员成为 root 相同。

    • 我能看到的唯一方法是使用任何类型的安全性包装 docker 以供非 root 用户使用,即构建自定义 bash 脚本以启动非常特定的 docker 命令,然后到 仔细审核这些命令的安全隐患,然后将这些脚本添加到 sudoers 文件(向非 root 用户授予无密码 sudo)。

    在我们将 docker 集成到开发管道的世界中(例如,将 docker 命令放入 Maven 构建中或允许开发人员对 docker 构建服务器的构建定义进行任意更改),我知道您如何维护任何安全性。

    【讨论】:

      【解决方案3】:

      上周通过大量搜索和研究调试此问题。

      我发现以非 root 身份运行 maven docker 容器会传递用户标志 例如 -u 1000

      但要使其正常工作,用户需要位于图像的 /passwd 目录中 要解决此问题,您可以将主机 (Jenkins) /etc/passwd 目录添加到 docker 映像并使用非 root 用户。

      从 docker run 容器上的系统命令参数添加以下内容以将正确的卷挂载到 mvn 映像,以允许主机非 root 用户在 maven 容器内映射。

      -v /share:/share -v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro -v "$HOME/.m2":/var/maven/.m2:z -w /usr/src/mymaven -e MAVEN_CONFIG=/var/maven/.m2 -e MAVEN_OPTS="-Duser.home=/var/maven"

      我知道这可能不是最有用的答案,但它应该可以以非 root 身份运行 mvn 容器,专门运行 otj-embedded-pg 以进行在本地通过但在 Jenkins 服务器上失败的集成测试。

      查看此链接OTJ_EMBEDDED_RUN_IN_CI_SERVER

      由于该线程上的大多数海报都建议创建一个新映像,因此无需这样做,您可以使用上面列出的命令运行最新的 maven docker 映像,它应该可以正常工作

      希望这可以帮助可能会遇到此问题的人,并为他们节省几个小时的工作时间。

      【讨论】:

        猜你喜欢
        • 2019-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-08
        • 2017-06-22
        • 1970-01-01
        • 2015-04-01
        • 1970-01-01
        相关资源
        最近更新 更多