gpt4 book ai didi

docker - 在非 root 用户作为 Jenkinsfile 代理的 docker 容器中使用 docker 命令(托管)

转载 作者:行者123 更新时间:2023-12-04 15:38:26 27 4
gpt4 key购买 nike

作为构建管道的一部分,我有一个包含用于多个项目的构建工具的容器。我的一个项目包含构建和发布容器的构建步骤,该步骤是在构建工具容器内完成的。我启用了 docker 的 jenkins-slaves 被配置为拥有用户 jenkins谁在群里docker .我使用 -v 来挂载 docker 二进制文件和 scoket。这可以通过以下任一方式实现/重现:

  • 在构建工具的 Dockerfile 中添加用户 (jenkins) 和组 (docker) 并将它们设置为主机 UID 和 GID
  • 使用 -u 选项启动容器,提供 UID 和 GUID(根据文档,用户和组不需要存在于容器中)。

  • 第一个策略的问题是多台构建机器上的用户和组 ID 不同。我可以通过将所有构建机器的 UID 和 GID 更改为相同的值来解决这个问题,但是 docker 不是要独立运行而不对环境/上下文有很多依赖吗?这对我来说不是正确的解决方案。
    第二种策略在命令行上工作得很好,但是,似乎无法将 UID 和 GID 传递给 Jenkinsfile 中的代理命令。 args参数不支持脚本或变量,如 $(id -u) .

    我希望不是第一个遇到这个问题的人,但是,我自己、搜索机器和堆栈溢出都无法找到解决方案。我应该使用“准备好的”构建奴隶还是有办法让第二种策略起作用?

    .

    -编辑-
    我了解以 root 身份运行容器的选项,并在启动后切换(例如使用入口点)。但是,这需要我的 Jenkins slave 以 root 身份连接,这对我来说是 Not Acceptable 。另一个找到的替代方案是所有资源的 chmod777,它完全违背了不以 root 用户身份运行 Jenkins slave 的安全方面。我更喜欢对容器使用 -u 选项,但是在从 Jenkinsfile 中启动 docker 代理( docker run 命令)之前,我找不到确定 jenkins 从站上的 UID 和 GID 的方法。

    最佳答案

    一个简单的解决方案

    实际上,我相信使用 docker 可以轻松实现您对解决方案的第一个想法,而无需以 root 身份运行任何 Jenkins slave。

    考虑这个命令:

    docker run --rm -it -v /etc/passwd:/etc/passwd:ro -v /etc/shadow:/etc/shadow:ro -v /etc/group:/etc/group:ro debian:10 /bin/su linux-fan -c /bin/bash

    这将创建一个新容器并将用户从主机映射到容器中。然后,在该容器内,它立即落入用户 linux-fan哪个(仅)需要在外部系统上定义。

    是否以 root 运行此命令或作为 docker 中的任何用户group 没有任何区别(请注意,关于 docker group = root 访问权限的评论非常正确!)

    此外,以这种方式在容器内映射事物(已经在使用 docker 套接字这样做时......)实际上放弃了容器提供的大部分隔离。因此,考虑运行任何需要访问主机的 Docker 守护进程的命令以直接在主机上运行或在隔离程度较低的环境(如 chroot)中运行是明智的。 ?当然,调用 Docker 的简单性可能还是比这里没有隔离更重要。

    替代解决方案

    没有主机访问权限的解决方案可以很容易地解决这个问题:使用 docker-in-docker,即在构建容器内运行一个新的 docker 守护进程而不是访问主机将它们彼此隔离,这样主机的用户和组 ID 就无关紧要了。

    关于docker - 在非 root 用户作为 Jenkinsfile 代理的 docker 容器中使用 docker 命令(托管),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58545483/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com