运行 docker 作为非 root 用户或 运行 jenkins 在 tomcat 作为 root 用户

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,所以我想这并不重要)。

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

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

The problem is that docker needs to be run as root user, so maven commands need to be run as root user,

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

Either run docker as non-root user

Your user (on the host) needs to be part of the docker group。然后你可以运行那个用户的docker服务。

如评论所述,这不是很安全。
参见:

最后一个链接以以下结果结尾:

  • If there’s a known uid that the process inside the container is executing as, it could be as simple as restricting access to the host system so that the uid from the container has limited access.
  • The better solution is to start containers with a known uid using the--user (you can use a username also, but remember that it’s just a friendlier way of providing a uid from the host’s username system), and then limiting access to the uid on the host that you’ve decided the container will run as.
  • Because of how uids and usernames (and gids and group names) map from a container to the host, specifying the user that a containerized process runs as can make the process appear to be owned by different users inside vs outside the container.

关于最后一点,您现在有 user namespace (userns) remapping (since docker 1.10, but I would advice 17.06, because of issue 33844)。

我也被困在如何设置 docker 构建服务器上。

这是我现在看到的真实情况...

  • Docker 命令需要 root 权限

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

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

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

上周对这个问题进行了大量的搜索和研究调试。

我发现 运行 一个 maven docker 容器,因为非 root 将传递用户标志 例如-u 1000

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

从 docker 运行 容器上的系统命令参数添加以下内容以将正确的卷挂载到 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 服务器上失败。

看到这个linkOTJ_EMBEDDED_RUN_IN_CI_SERVER

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

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