【问题标题】:docker build inside official jenkins containerdocker build 在官方詹金斯容器内
【发布时间】:2017-03-24 17:34:03
【问题描述】:
我在 docker 上运行官方 Jenkins 容器。我需要构建 docker 映像作为成功构建的后期操作,但 Jenkins 容器没有 docker 二进制文件。
我看到了几个选项,首先是从官方镜像派生我自己的 Jenkins 容器,并提供 docker 二进制文件。第二种选择是使用带有 docker 和其他必要运行时的专用 Jenkins slave。第三种选择是为 Jenkins 服务器提供 ansible。我想在容器上运行所有东西,因为它干净、简单且易于重复。
你是如何解决这个问题的?从长远来看,哪个是更好的解决方案,为什么?我的首要任务是能够使用单个 ansible 命令配置、配置和引导整个 CI 基础架构。此外,构建的 docker 容器将被推送到注册表等,因此组件之间的连接应该是最佳的,具有最小的复杂性或手动配置。
【问题讨论】:
标签:
jenkins
docker
build
continuous-integration
ansible
【解决方案1】:
在容器中安装 docker 不是一个好主意。
related article
但是,您可以通过安装 docker 套接字来访问在您的主机上运行的 docker 守护程序。
它应该有利于测试目的,但不要在生产模式下这样运行,因为它会产生安全问题。
related article
您当然可以找到一个更简洁的解决方案,直接从您的主机监控您的 Jenkins 容器的退出状态来管理您的部署/构建过程。
【解决方案2】:
我们现在与 GoCD 有类似的设置,其中 GoCD 代理在 docker 容器中运行,并且必须在成功的管道上构建图像。
tl;dr 仍然是一种 hacky 方式,但这是最好的行为选择:使用从容器到运行 Jenkins 的 docker 主机的 TCP 连接。请注意@Raphayol 提到的安全隐患。
这是我们尝试过的:
1) 在 docker 内运行 docker
不是一个好主意。导致 IO 子系统只是吠叫并需要重新启动的各种挂起情况。
2) 基于 swarm 构建
Swarm 集群或任何其他 docker 集群意味着运行容器而不是构建它们。旧的容器会被推回为最新的,因为构建和推送不能保证在同一个节点上执行。
3) 专用构建主机
虽然这比工作节点的目的和自动扩展变得棘手。
4) 挂载 docker 套接字
一些工作,但在重负载时它会产生随机 IO 锁,并且需要重新启动 docker 守护进程
5) 通过 TCP 连接回来
这个选项现在可以工作几个月,虽然如果你的 jenkins 构建服务器被很好地隔离,这不是一个明确的解决方案,你可以忍受这个。
[root@ip-10-10-10-10 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e3630d84909e registry.backbase.com/gocd-agent "/sbin/my_init" 2 minutes ago Up 2 minutes 0.0.0.0:9040-9045->9040-9045/tcp docker_agent_1
[root@ip-10-10-10-10 ~]# docker exec -it e3 env|grep DOCKER
DOCKER_TLS_VERIFY=yes
DOCKER_HOST=tcp://10.10.10.10:2376
DOCKER_CERT_PATH=/var/go/docker-certs