繁体   English   中英

以非 root 用户身份运行 docker 或以 root 用户身份在 tomcat 上运行 jenkins

[英]Running docker as non-root user OR running jenkins on tomcat as root user

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

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

关于选择哪种解决方案以及如何实施的任何建议?

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

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

以非 root 用户身份运行 docker

您的用户(在主机上)需要成为docker group 的一部分 然后您可以使用该用户运行 docker 服务。

正如所评论的,这不是很安全。
看:

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

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

关于最后一点,您现在有用户命名空间 (userns) 重新映射(从 docker 1.10 开始,但我建议使用 17.06,因为问题 33844 )。

我也坚持如何设置 docker 构建服务器。

这是我现在看到的基本事实……

  • Docker 命令需要 root 权限

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

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

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

从上周的大量搜索和研究中调试这个问题。

我发现运行一个 maven docker 容器,因为非 root 将传递用户标志,例如 -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 图像,它可以正常工作

希望这可以帮助可能陷入此问题的人并节省他们几个小时的工作时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM