我有两个docker容器 - 一个运行jenkins,另一个运行docker注册表。我想构建/推送从jenkins到docker注册表的图像。我如何以一种简单安全的方式实现这一目标(意味着没有黑客攻击)?
答案 0 :(得分:0)
最简单的方法是确保jenkins容器和注册表容器位于同一主机上。然后,您可以将docker socket安装到jenkins容器上,并使用主机中的dockerd将映像推送到注册表。 /var/run/docker.sock
是dockerd
正在监听的unix套接字。
通过安装docker socket,从该容器运行的任何docker
命令就像它是主机一样执行。
$ docker run -dti --name jenkins -v /var/run/docker.sock:/var/run/docker.sock jenkins:latest
答案 1 :(得分:0)
如果您使用管道,则可以安装此Docker插件https://plugins.jenkins.io/docker-workflow, 在Jenkins上创建凭据资源,以访问Docker注册表,并在您的管道中执行此操作:
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")
}
}
}
}
完整示例,位于:https://pillsfromtheweb.blogspot.com/2020/06/build-and-push-docker-images-with.html
答案 2 :(得分:-1)
我在Jenkins docker容器中使用这种类型的工作流,好消息是它不需要任何hackery来完成。有些人在docker"中使用#14; docker要做到这一点,但如果这是你想要去的路线我无法帮助你,因为我没有经验这样做。我将在这里概述如何使用现有的docker服务(运行jenkins容器的服务)来进行构建。
我会做一些假设,因为你没有指定你的设置是什么样的:
如果上述任何条件都不成立,可以轻松修改,但我需要一个基线来开始。
您需要以下内容:
<强>先决条件/设置强>
设置它非常简单。如果让Jenkins访问主机上正在运行的docker服务,您可以采用以下两种方式之一。 1)通过TCP和2)通过docker unix socket。如果您已经在Dock上监听TCP,您只需记下主机的IP地址和默认的docker TCP端口号(2375或2376,具体取决于您是否使用TLS)以及您可能拥有的TLS配置。
如果您不想启用docker TCP服务,它会涉及更多,但您可以在/var/run/docker.sock
使用UNIX套接字。这需要您将套接字绑定到Jenkins容器。您可以通过在运行jenkins时将以下内容添加到运行命令来执行此操作:
-v /var/run/docker.sock:/var/run/docker.sock
您还需要在主机系统上使用与容器中jenkins用户相同的UID创建一个jenkins用户,然后将该用户添加到docker组。
<强>詹金斯强>
您现在需要一个Docker构建/发布插件,如CloudBees Docker Build and Publish plugin或其他一些插件,具体取决于您的需求。您需要注意以下配置项:
tcp://<HOST_IP>:2375
或unix:///var/run/docker.sock
,具体取决于我们如何进行上述设置。如果您使用TCP和TLS作为docker服务,则需要上传Jenkins实例的TLS客户端证书作为&#34; Docker主机证书身份验证&#34;到Jenkins的通常证件部分。http://<HOST_IP>:32768
或类似,具体取决于您的配置。您也可以链接容器,但如果稍后将容器移动到单独的主机,则不容易扩展。您还需要在相应的凭据部分中添加用于登录到注册表的凭据作为用户名/密码对。 答案 3 :(得分:-1)
我已经完成了这个确切的设置,所以我会给你一个“tl; dr”版本,因为深入到这里是远远超出了StackOVerflow的范围:
tini
)。您需要这个来处理信号和过程收获。这将是你的入口点。supervisord
)包。通常在容器中运行多个服务不,但在这种特殊情况下,您的选项非常有限。--privileged
标记运行docker容器(DinD需要它)。答案 4 :(得分:-1)
感谢您的投入!经过一些实验,我想出了这个。
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