如何配置Jenkins Docker流水线使用DinD容器作为Docker Host?
Jenkins DinD 流水线配置问题修复指南
一、先修正你的 Docker Compose 配置
当前配置存在两个关键问题:
- 同一网络下
dind和jenkins服务的 network alias 均设为docker,会导致 DNS 解析冲突 dind服务挂载了/var/jenkins_home卷,DinD 容器完全不需要这个目录
修正后的docker-compose.yml:
version: '3.9' networks: jenkins: volumes: jenkins_data: # 重命名卷名,职责更清晰 docker_certs: services: dind: image: docker:dind privileged: true restart: unless-stopped networks: jenkins: aliases: - dind-docker # 设置唯一别名,避免DNS冲突 volumes: - docker_certs:/certs/client environment: - DOCKER_TLS_CERTDIR=/certs ports: - 2376:2376 jenkins: image: jenkins/jenkins:lts-jdk17 container_name: jenkins restart: unless-stopped networks: jenkins: volumes: - jenkins_data:/var/jenkins_home - docker_certs:/certs/client:ro environment: - DOCKER_TLS_VERIFY=1 - DOCKER_HOST=tcp://dind-docker:2376 # 指向DinD服务的唯一别名 - DOCKER_CERT_PATH=/certs/client # 修正变量名,原配置的变量名错误 ports: - 8080:8080 - 50000:50000
二、修正 Jenkins 流水线代码
你的流水线有两个核心问题:
options块不支持直接嵌套environment,属于语法错误golang:1.17-alpine镜像未预装 Docker 客户端,无法执行docker build命令
修正后的流水线代码:
pipeline { agent { docker { image 'golang:1.17-alpine' // 传递Docker连接所需的环境变量到agent容器 args '-e DOCKER_TLS_VERIFY=1 -e DOCKER_HOST=tcp://dind-docker:2376 -e DOCKER_CERT_PATH=/certs/client' // 挂载证书卷,让Docker客户端能读取TLS证书 volumes '/certs/client:/certs/client:ro' } } environment { GOPATH = '/go' PATH = "${GOPATH}/bin:${PATH}" } stages { stage('Verify Go Installation') { steps { sh 'go version' } } stage('Install Docker Client') { steps { // Alpine镜像需手动安装Docker CLI sh ''' apk add --no-cache docker-cli ''' } } stage('Build Docker Image') { steps { script { // 确保代码根目录存在Dockerfile,否则需指定路径 docker.build("my-golang-app:${BUILD_NUMBER}") } } } } post { always { cleanWs() } } }
三、关键修改点说明
Docker Compose 部分
- 给 DinD 服务设置唯一 network alias,避免 DNS 解析冲突
- 修正 Jenkins 环境变量中的
DOCKER_CERT_PATH(原配置变量名错误) - 拆分 Jenkins 数据卷与 Docker 证书卷,职责划分更清晰
流水线部分
- 移除错误的
options > environment块,改用docker agent的args传递环境变量 - 添加
Install Docker Client阶段,补充 Alpine 镜像缺失的 Docker CLI - 挂载证书卷到 agent 容器,保证 Docker 客户端能通过 TLS 连接 DinD 服务
- 移除错误的
四、额外排查提示
- 确保代码仓库根目录存在
Dockerfile,否则需在docker.build中指定路径,例如docker.build("my-golang-app:${BUILD_NUMBER}", "./docker") - 若连接失败,可在流水线中添加测试步骤
sh 'docker info',检测 DinD 服务的连通性 - DinD 服务必须开启
privileged: true,你的配置已满足此要求
内容的提问来源于stack exchange,提问作者mailman
相关产品推荐
相关产品推荐

