在Docker中运行的jenkins构build/推送图像
我有两个docker集装箱 – 一个运行jenkins和一个运行dockerregistry。 我想build立/推图像从jenkinsdockerregistry。 我如何以一种简单而安全的方式实现这一点(意味着没有黑客)?
最简单的方法是确保jenkins容器和registry容器位于同一主机上。 然后,您可以将Docker套接字安装到jenkins容器上,并使用主机中的dockerd将图像推送到registry中。 /var/run/docker.sock
是dockerd
正在监听的unix套接字。
通过安装Docker套接字,从该容器运行的任何docker
命令都会执行,就好像它是主机一样。
$ docker run -dti --name jenkins -v /var/run/docker.sock:/var/run/docker.sock jenkins:latest
我在Jenkins docker容器中使用这种types的工作stream程,好消息是它不需要任何hackery来完成。 有些人使用docker工人来完成这个任务,但是如果这是你想要去的路线,我不能帮你,因为我没有经验。 我将在这里概述的是如何使用现有的docker服务(运行jenkins容器的服务)来进行构build。
我会做一些假设,因为你没有指定你的设置是什么样的:
- 您在同一主机上运行两个容器
- 你并没有使用docker-compose
- 你没有运行docker群(或群模式)
- 你在Linux上使用docker
如果上述任何一个条件都不正确,可以很容易地修改,但是我需要一个基线。
您将需要以下内容:
- 从Jenkins容器访问主机上运行的docker
- 从Jenkins容器访问registry容器
先决条件/设置
设置起来非常简单。 在让Jenkins访问主机上正在运行的docker服务的情况下,可以通过以下两种方法之一来完成。 1)通过TCP和2)通过docker unix套接字。 如果你已经有docker监听TCP,你只需要记下主机的IP地址和默认docker的TCP端口号(2375或2376取决于你是否使用TLS)以及你可能拥有的TLSconfiguration。
如果您不想启用Docker TCP服务,则稍微牵涉一点,但可以在/var/run/docker.sock
使用UNIX套接字。 这要求你绑定套接字到Jenkins容器。 您在运行jenkins时将下列内容添加到运行命令中:
-v /var/run/docker.sock:/var/run/docker.sock
您还需要在主机系统上使用与容器中的jenkins用户相同的UID创buildjenkins用户,然后将该用户添加到docker组。
jenkins
您现在需要一个Docker构build/发布插件,如CloudBees Docker构build和发布插件或其他插件,具体取决于您的需求。 您需要注意以下configuration项目:
- 根据我们如何进行上述设置,Docker URI / URL将会是
tcp://<HOST_IP>:2375
或unix:///var/run/docker.sock
。 如果您使用TCP和TLS作为Docker服务,则需要将Jenkins实例的TLS客户端证书作为“Docker主机证书身份validation”上传到Jenkins中常见的证书部分。 - DockerregistryURL将是registry容器的URL,而不是localhost。 这可能是类似于
http://<HOST_IP>:32768
或类似取决于您的configuration。 您也可以链接容器,但如果稍后将容器移动到单独的主机,则容器不会轻松缩放。 您还需要添加用于login到registry的凭据,作为相应凭证部分中的用户名/密码对。
我已经完成了这个确切的设置,所以我会给你一个“tl; dr”版本,因为深入这里的方式超出了StackOverflow的范围:
- 在容器中安装PID1处理程序文件(即
tini
)。 你需要这个来处理信令和进程收割。 这将是你的入口点。 - 安装一些过程控制服务(即
supervisord
)包。 通常不build议在容器中运行多个服务,但在这种情况下,您的select非常有限。 - 安装Java / Jenkins软件包或从DockerHub映像中创build映像。
- 添加一个dind(Docker-in-Docker)包装器脚本。 这是我基于我的configuration。
- 创build过程控制服务的configuration来启动Jenkins(作为jenkins用户)和dind包装(作为root)。
- 将jenkins用户添加到Dockerfile中的docker组
- 用
--privileged
标志运行--privileged
容器(DinD需要它)。 - 你完成了!
感谢您的input! 经过一番实验,我想出了这个。
docker run -d \ -p 8080:8080 \ -p 50000:50000 \ --name jenkins \ -v
pwd
/data/jenkins:/var/jenkins_home \ -v /Users/.../.docker/machine/machines/docker:/Users/.../.docker/machine/machines/docker \ -e DOCKER_TLS_VERIFY="1" \ -e DOCKER_HOST="tcp://192.168.99.100:2376" \ -e DOCKER_CERT_PATH="/Users/.../.docker/machine/machines/docker" \ -e DOCKER_MACHINE_NAME="docker" \ johannesw/jenkins-docker-cli