如何配置 Jenkins 作业以使用 Docker 构建?
How to configure Jenkins job to build with Docker?
我正在尝试使用 Jenkins 和 'docker in the docker' 容器从 src 构建一个容器。
我在这里定义 Docker 云实例:
是否应该提供一个额外的选项卡,使作业能够使用上面的 Docker 云实例设置?
作业是一个多分支流水线:
但是当我尝试配置一个使用 docker 云实例的作业时,上面配置的 docker 构建选项不可用:
构建日志包含:
time="2021-04-04T14:27:16Z" level=error msg="failed to dial gRPC:
cannot connect to the Docker daemon. Is 'docker daemon' running on
this host?: dial unix /var/run/docker.sock: connect: no such file or
directory" error during connect: Post
http://%2Fvar%2Frun%2Fdocker.sock/v1.40/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&session=vgpahcarinxfh05klhxyk02gg&shmsize=0&t=ron%2Fml-services&target=&ulimits=null&version=1:
context canceled [Pipeline] } [Pipeline] // stage [Pipeline] }
[Pipeline] // node [Pipeline] End of Pipeline [Bitbucket] Notifying
commit build result [Bitbucket] Build result notified ERROR: script
returned exit code 1 Finished: FAILURE
这表明构建正在与 Jenkins 相同的主机上搜索 Docker,但我试图在不同的主机上使用 Docker 进行构建?
我是否正确配置了 Jenkins Docker?
我的 Jenkinsfile
包含:
node {
def app
stage('Clone repository') {
checkout scm
}
stage('Build image') {
app = docker.build("ron/services")
}
stage('Push image') {
docker.withRegistry('https://registry.hub.docker.com', 'git') {
app.push("${env.BUILD_NUMBER}")
app.push("latest")
}
}
}
更新:
单击 Expose DOCKER_HOST
处的复选标记,重建包含错误:
+ docker build -t ron/services .
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
[Bitbucket] Notifying commit build result
[Bitbucket] Build result notified
ERROR: script returned exit code 1
Finished: FAILURE
docker cli 尝试使用 /var/run
中的 docker 套接字进行连接。这意味着没有配置外部守护进程,例如使用环境变量 DOCKER_HOST
。
尝试单击 Expose DOCKER_HOST
处的复选标记。
不清楚这是否是您想要做的,但是配置 Docker 云会告诉您的 Jenkins 在 10.241.0.198(客户端)上启动一个容器,并且 运行 您的 jenkins 工作在那个容器里。要完成这项工作,需要检查几件事:
- 确保jenkins服务器上的jenkins用户可以访问客户端的2371端口,即'Test Connection'returns成功
- 如果要在容器中使用docker,请打开'Expose DOCKER_HOST'
- 配置 ssh 以便 jenkins 服务器上的 jenkins 用户可以在客户端 运行ning 时通过 ssh 连接到容器 (CMD ["/usr/sbin/sshd", "-D" ] 在 Docker 文件中)
- 在Docker代理模板中:配置一个标签;打开 'enabled';在容器中配置 docker 图像到 运行;设置远程文件系统根目录:/home/jenkins
- 在容器设置中:(非常重要!!)添加 /var/run/docker.sock:/var/run/docker.sock 到 Volumes
要使您的管道作业在 docker 图像上 运行,请将代理标签设置为您在第 4 步中提供的标签。
在容器中创建 运行 图像时的几个问题:
- 同时安装 openssh-clients 和 openssh-server
- 安装java
- 安装您可能需要的任何其他构建工具,例如 git
- 安装 docker 如果你想要 docker docker 支持
- 在 /etc/ssh/sshd_config 中配置 sftp,例如,添加
# override default of no subsystems
Subsystem sftp /usr/lib/openssh/sftp-server
Match group sftp
X11Forwarding no
AllowTCPForwarding no
ForceCommand internal-sftp
我正在尝试使用 Jenkins 和 'docker in the docker' 容器从 src 构建一个容器。
我在这里定义 Docker 云实例:
是否应该提供一个额外的选项卡,使作业能够使用上面的 Docker 云实例设置?
作业是一个多分支流水线:
但是当我尝试配置一个使用 docker 云实例的作业时,上面配置的 docker 构建选项不可用:
构建日志包含:
time="2021-04-04T14:27:16Z" level=error msg="failed to dial gRPC: cannot connect to the Docker daemon. Is 'docker daemon' running on this host?: dial unix /var/run/docker.sock: connect: no such file or directory" error during connect: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&session=vgpahcarinxfh05klhxyk02gg&shmsize=0&t=ron%2Fml-services&target=&ulimits=null&version=1: context canceled [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline [Bitbucket] Notifying commit build result [Bitbucket] Build result notified ERROR: script returned exit code 1 Finished: FAILURE
这表明构建正在与 Jenkins 相同的主机上搜索 Docker,但我试图在不同的主机上使用 Docker 进行构建?
我是否正确配置了 Jenkins Docker?
我的 Jenkinsfile
包含:
node {
def app
stage('Clone repository') {
checkout scm
}
stage('Build image') {
app = docker.build("ron/services")
}
stage('Push image') {
docker.withRegistry('https://registry.hub.docker.com', 'git') {
app.push("${env.BUILD_NUMBER}")
app.push("latest")
}
}
}
更新:
单击 Expose DOCKER_HOST
处的复选标记,重建包含错误:
+ docker build -t ron/services .
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
[Bitbucket] Notifying commit build result
[Bitbucket] Build result notified
ERROR: script returned exit code 1
Finished: FAILURE
docker cli 尝试使用 /var/run
中的 docker 套接字进行连接。这意味着没有配置外部守护进程,例如使用环境变量 DOCKER_HOST
。
尝试单击 Expose DOCKER_HOST
处的复选标记。
不清楚这是否是您想要做的,但是配置 Docker 云会告诉您的 Jenkins 在 10.241.0.198(客户端)上启动一个容器,并且 运行 您的 jenkins 工作在那个容器里。要完成这项工作,需要检查几件事:
- 确保jenkins服务器上的jenkins用户可以访问客户端的2371端口,即'Test Connection'returns成功
- 如果要在容器中使用docker,请打开'Expose DOCKER_HOST'
- 配置 ssh 以便 jenkins 服务器上的 jenkins 用户可以在客户端 运行ning 时通过 ssh 连接到容器 (CMD ["/usr/sbin/sshd", "-D" ] 在 Docker 文件中)
- 在Docker代理模板中:配置一个标签;打开 'enabled';在容器中配置 docker 图像到 运行;设置远程文件系统根目录:/home/jenkins
- 在容器设置中:(非常重要!!)添加 /var/run/docker.sock:/var/run/docker.sock 到 Volumes
要使您的管道作业在 docker 图像上 运行,请将代理标签设置为您在第 4 步中提供的标签。
在容器中创建 运行 图像时的几个问题:
- 同时安装 openssh-clients 和 openssh-server
- 安装java
- 安装您可能需要的任何其他构建工具,例如 git
- 安装 docker 如果你想要 docker docker 支持
- 在 /etc/ssh/sshd_config 中配置 sftp,例如,添加
# override default of no subsystems
Subsystem sftp /usr/lib/openssh/sftp-server
Match group sftp
X11Forwarding no
AllowTCPForwarding no
ForceCommand internal-sftp