如何通过Jenkins在远程宿主机使用Dockerfile构建Docker容器
问题根因
groovy.lang.MissingMethodException报错:docker.withServer语法使用错误,该方法要求所有操作目标Docker服务的逻辑必须放入其闭包作用域内,单独调用一行会因参数匹配失败报错docker: not found报错:Jenkins容器内缺少Docker CLI客户端,即使调用远程Docker服务,也需要本地有docker二进制文件发送请求- 现有Jenkinsfile存在语法缺陷:
node块未闭合,构建逻辑未放入withServer闭包内
前置配置检查
- 确认Jenkins容器内已安装Docker CLI:进入Jenkins容器执行
docker -v验证,如未安装可选两种方案:- Debian系Jenkins镜像可直接执行安装命令:
apt update && apt install -y docker.io - 启动Jenkins容器时挂载宿主机Docker二进制:启动参数添加
-v /usr/local/bin/docker:/usr/local/bin/docker
- Debian系Jenkins镜像可直接执行安装命令:
- 确认宿主机2376端口连通性:在Jenkins容器内执行
telnet 192.168.178.26 2376验证网络连通正常 - 确认socat配置正确:socat容器需正确将2376端口流量转发到宿主机
/var/run/docker.sock,启动参考参数:docker run -d -p 2376:2375 -v /var/run/docker.sock:/var/run/docker.sock alpine/socat tcp-listen:2375,fork,reuseaddr unix-connect:/var/run/docker.sock
修正后Jenkinsfile
node { // 拉取代码仓库 checkout scm // 所有远程Docker操作必须放入withServer的闭包内 docker.withServer('tcp://192.168.178.26:2376') { // 构建镜像 def customImage = docker.build("my-image:${env.BUILD_ID}") // 如不需要测试运行容器可删除以下inside块,原示例的make test需替换为你实际的测试命令 customImage.inside { sh 'python test.py' } } }
内容的提问来源于stack exchange,提问作者muhackl
相关产品推荐
相关产品推荐

