以非root用户身份运行docker或以root用户

时间:2016-01-11 03:21:32

标签: maven tomcat jenkins docker devops

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

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

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

3 个答案:

答案 0 :(得分:4)

  

问题是docker需要以root用户身份运行,因此maven命令需要以root用户身份运行,

不,可以使用-u (--user) parameter进行泊坞窗运行,以便在容器内使用非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)。

答案 1 :(得分:1)

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

现在我在这里看到地面真相......

  • Docker命令需要root权限

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

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

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

答案 2 :(得分:0)

在过去一周的大量搜索和研究调试中,

我发现以非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容器,特别是针对在本地通过但在Jenkins服务器上失败的集成测试运行otj-embedded-pg。

查看此链接OTJ_EMBEDDED_RUN_IN_CI_SERVER

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

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