我在docker上运行官方Jenkins容器。我需要构建docker镜像作为成功构建的post动作,但Jenkins容器没有docker binary。
我看到了几个选项,首先是从官方图像中获取我自己的Jenkins容器,并提供docker binary。第二个选项是使用具有docker和其他必要运行时的专用Jenkins slave。第三种选择是为Jenkins服务器提供ansible。我想在容器上运行所有东西,因为它干净,简单且易于重复。
你是如何解决这个问题的?从长远来看哪个是更好的解决方案,为什么?我的首要任务是能够使用单个ansible命令配置,配置和引导整个CI基础结构。此外,构建的docker容器将被推送到注册表等,因此组件之间的连接应该是最佳的,复杂性最低或手动配置。
答案 0 :(得分:3)
在一个容器中安装docker不是一个好主意。
但是,您可以通过安装docker socket来访问在主机上运行的docker守护程序。 它应该适用于测试目的,但不要在生产模式下运行,因为它会产生安全问题。
您当然可以直接从主机上找到一个更清晰的解决方案来管理您的部署/构建过程,并查看Jenkins容器的退出状态。
答案 1 :(得分:0)
我们现在使用GoCD进行类似的设置,其中GoCD代理在docker容器中运行,并且必须在成功的管道上构建映像。
tl; dr 仍然是一种hacky方式,但这是最好的行为选项:使用从容器到Docker主机的TCP连接运行Jenkins。请注意@Raphayol提到的安全隐患。
以下是我们尝试的内容:
1)在docker中运行docker
不是个好主意。导致IO子系统咆哮并重启的各种悬挂情况都是必要的。
2)建立群体
Swarm集群或任何其他docker集群意味着运行容器不构建它们。旧容器最新推回,因为不能保证在同一节点上执行构建和推送。
3)专用构建主机
虽然这可以胜过工作节点的目的,但自动缩放变得棘手。
4)安装码头插座
工作类型但在重负载下会产生随机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