You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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()
        }
    }
}

三、关键修改点说明

  1. Docker Compose 部分

    • 给 DinD 服务设置唯一 network alias,避免 DNS 解析冲突
    • 修正 Jenkins 环境变量中的DOCKER_CERT_PATH(原配置变量名错误)
    • 拆分 Jenkins 数据卷与 Docker 证书卷,职责划分更清晰
  2. 流水线部分

    • 移除错误的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 01:55:19