从docker中运行的jenkins生成/推送映像
我有两个docker容器——一个运行jenkins,一个运行docker注册表。我想从jenkins创建/推送图像到docker注册表。如何以简单安全的方式实现这一点(意味着没有黑客攻击)?最简单的方法是确保jenkins容器和registry容器位于同一主机上。然后,您可以将docker套接字装载到jenkins容器上,并使用主机上的docker将映像推送到注册表从docker中运行的jenkins生成/推送映像,docker,jenkins,docker-registry,Docker,Jenkins,Docker Registry,我有两个docker容器——一个运行jenkins,一个运行docker注册表。我想从jenkins创建/推送图像到docker注册表。如何以简单安全的方式实现这一点(意味着没有黑客攻击)?最简单的方法是确保jenkins容器和registry容器位于同一主机上。然后,您可以将docker套接字装载到jenkins容器上,并使用主机上的docker将映像推送到注册表/var/run/docker.sock是dockerd正在侦听的unix套接字 通过安装docker套接字,从该容器运行的任何do
/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容器中使用这种工作流,好消息是它不需要任何黑客来完成。有些人使用“docker in docker”来实现这一点,但如果这是你想走的路线,我也帮不了你,因为我没有这样做的经验。这里我将概述如何使用现有的docker服务(运行jenkins容器的服务)进行构建 我将做一些假设,因为您没有指定设置的外观:
- 您正在同一主机上运行两个容器
- 您没有使用docker compose
- 您没有运行docker swarm(或swarm模式)
- 您正在Linux上使用docker
- 从Jenkins容器访问主机上运行的docker
- 从Jenkins容器访问注册表容器
/var/run/docker.sock
。这需要将套接字绑定到Jenkins容器。在运行jenkins时,您可以通过将以下内容添加到run命令来完成此操作:
-v/var/run/docker.sock:/var/run/docker.sock
您还需要在主机系统上创建一个jenkins用户,其UID与容器中的jenkins用户相同,然后将该用户添加到docker组
Jenkins
您现在需要一个Docker构建/发布插件,如或其他插件,具体取决于您的需要。您需要注意以下配置项:
- Docker URI/URL将类似于
或tcp://:2375
取决于我们如何进行上述设置。如果对docker服务使用TCP和TLS,则需要将Jenkins实例的TLS客户端证书作为“docker主机证书身份验证”上载到Jenkins中的常用凭据部分unix:///var/run/docker.sock
- Docker注册表URL将是指向注册表容器的URL,而不是localhost。它可能类似于http://:32768或类似的内容,具体取决于您的配置。您还可以链接容器,但如果稍后将容器移动到单独的主机,则无法轻松扩展。您还需要在相应的凭据部分添加登录到注册表的凭据,作为用户名/密码对李>
- 在容器中安装PID1处理程序文件(即
)。你需要这个来处理信号和处理收割。这将是你的入口点tini
- 安装一些过程控制服务(即
)软件包。通常不建议在容器中运行多个服务,但在这种特殊情况下,您的选项非常有限supervisord
- 安装Java/Jenkins软件包或从DockerHub映像创建映像
- 添加一个dind(Docker中的Docker)包装脚本。是我配置的基础
- 创建流程控制服务的配置,以启动Jenkins(作为Jenkins用户)和dind包装器(作为root用户)
- 将jenkins用户添加到Dockerfile中的docker组
- 使用
标志运行docker容器(DinD需要它)--privileged
- 你完了李>
- 谢谢您的意见!我在做了一些实验后想出了这个
如果您使用管道,您可以安装此Docker插件, 在Jenkins上创建凭据资源,以访问Docker注册表,并在管道中执行此操作:docker run-d\ -p 8080:8080\ -p 50000:50000\ --名字叫詹金斯\ -v
/data/jenkins:/var/jenkins\u home\ -v/Users/...docker/machine/machines/docker:/Users/...docker/machine/machines/docker\ -e DOCKER\u TLS\u VERIFY=“1”\ -e DOCKER_主机=”tcp://192.168.99.100:2376" \ -e DOCKER_CERT_PATH=“/Users/...DOCKER/machine/machines/DOCKER”\ -e DOCKER\u MACHINE\u NAME=“DOCKER”\ johannesw/jenkins docker clipwd
stage("Build Docker image") { steps { script { docker_image = docker.build("myregistry/mynode:latest") } } } stage("Push images") { steps { script { withDockerRegistry(credentialsId: 'registrycredentials', url: "https://myregistry") { docker_image.push("latest") } } } }
完整示例位于:此答案仅部分正确,因为它a)是一个安全漏洞,b)容器和主机上必须具有相同的docker版本。