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

Maven 以非root用户身份运行docker或以root用户身份在tomcat上运行jenkins,maven,tomcat,jenkins,docker,devops,Maven,Tomcat,Jenkins,Docker,Devops,我正在尝试使用docker maven插件构建docker映像,并计划使用jenkins执行mvn命令。我在tomcat实例上部署了jenkins.war,而不是作为非root用户运行的独立应用程序。 问题是docker需要以root用户的身份运行,因此maven命令需要以root用户的身份运行,因此jenkins/tomcat需要以root用户的身份运行,这不是一个好的实践(尽管我的非root用户也是sudoer,所以我想不会太重要) 所以,归根结底,我看到了两种解决方案:要么以非root用户

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

所以,归根结底,我看到了两种解决方案:要么以非root用户的身份运行docker(并且需要如何做到这一点的帮助) 或 需要以root用户身份运行jenkins(不确定如何实现,因为我更改了环境变量/config,但仍然没有切换到root用户)

对于选择哪种解决方案以及如何实施,您有什么建议吗

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

不,docker运行可以使用来完成,以便在容器中使用非root用户

以非root用户身份运行docker

。然后您可以与该用户一起运行docker服务

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

  • “”
  • “”
最后一个链接以以下结果结束:

  • 如果容器中的进程执行的是一个已知的uid,那么可以简单地限制对主机系统的访问,以便容器中的uid具有有限的访问权限
  • 更好的解决方案是使用
    --user
    启动具有已知uid的容器(您也可以使用用户名,但请记住,这只是从主机的用户名系统提供uid的更友好的方式),然后限制对主机上的uid的访问,您已经决定容器将作为运行
  • 由于UID和用户名(以及GID和组名)如何从容器映射到主机,因此指定容器化进程运行的用户可能会使该进程看起来由容器内外的不同用户拥有

关于最后一点,您现在有了(从docker 1.10开始,但我会建议17.06,因为)。

我还被困在如何设置docker build server上

这就是我现在看到的地面真相

  • Docker命令需要根权限

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

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


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

通过上周大量的搜索和研究调试这个问题

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

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

从docker run容器上的系统commmand参数添加以下内容,将正确的卷装载到mvn映像中,以允许主机非根用户在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服务器上失败

请参阅此链接

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


希望这能帮助那些在这个问题上陷入困境的人,并为他们节省几个小时的工作时间。

作为“docker”组的成员确实会授予对docker命令的访问权限,但这实际上与使用户成为root用户(似乎是我的回答)是一样的。我想如果所讨论的用户已经是sudoer,(根据OP)这都是毫无意义的,但我反对将“docker”组作为一个快速解决方案来推广。@Ryan这两个问题是不同的。无论是否是docker组,您仍然可以使用-u参数运行,以确保容器中的用户不是root用户。第二个问题确实存在(,)最后一个链接包括推荐。@Ryan我已经编辑了答案,提出了备选方案。谢谢。我想它已经很好了。--user选项很好,但它只保护主机不受构建不良的容器的影响。它不保护主机不受本地用户任意docker命令的影响(他们可以选择不使用它),这正是他的詹金斯守护进程所需要的。