在Docker中运行的jenkins构build/推送图像

我有两个docker集装箱 – 一个运行jenkins和一个运行dockerregistry。 我想build立/推图像从jenkinsdockerregistry。 我如何以一种简单而安全的方式实现这一点(意味着没有黑客)?

最简单的方法是确保jenkins容器和registry容器位于同一主机上。 然后,您可以将Docker套接字安装到jenkins容器上,并使用主机中的dockerd将图像推送到registry中。 /var/run/docker.sockdockerd正在监听的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>:2375unix:///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