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

EKS部署的Jenkins Pipeline用dockerTool遇Docker守护进程连接错误求助

解决方案

1. 挂载宿主机Docker Socket(最简方案)

Jenkins agent Pod本身未运行Docker daemon,dockerTool仅安装了Docker客户端。通过挂载宿主机的/var/run/docker.sock,让客户端直接调用宿主机的Docker daemon。

配置步骤:

  • 在Jenkins的Kubernetes插件Pod模板中添加卷挂载:
    • 新增HostPath卷:路径填/var/run/docker.sock,卷名设为docker-sock
    • 在容器的卷挂载配置中,将docker-sock挂载到容器内的/var/run/docker.sock
  • 调整容器的SecurityContext,让Jenkins默认用户(UID 1000)加入宿主机的docker组(通常GID为999):
    securityContext:
      runAsUser: 1000
      runAsGroup: 999
      supplementalGroups: [999]
    

配置完成后,你的现有Pipeline代码无需修改,docker build即可正常调用宿主机Docker服务。

2. 使用Docker-in-Docker(DinD)隔离构建

如果需要独立的Docker构建环境,可在Jenkins agent Pod中以sidecar容器形式运行Docker daemon。

Pipeline示例:

pipeline {
    agent {
        kubernetes {
            yaml '''
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: jenkins-agent
    image: jenkins/inbound-agent:latest
    command: ["sleep", "infinity"]
    securityContext:
      privileged: true
    volumeMounts:
    - name: docker-sock
      mountPath: /var/run/docker.sock
  - name: dind
    image: docker:dind
    securityContext:
      privileged: true
    volumeMounts:
    - name: docker-graph-storage
      mountPath: /var/lib/docker
  volumes:
  - name: docker-sock
    emptyDir: {}
  - name: docker-graph-storage
    emptyDir: {}
            '''
        }
    }
    tools {
        go 'go-1.21'
        dockerTool 'docker-latest'
    }
    environment {
        GO111MODULE='on'
        DOCKER_HOST='tcp://localhost:2375'
    }
    stages {
        stage('Test') {
            steps {
                git 'https://github.com/AdminTurnedDevOps/GoWebAPI.git'
                sh 'go test ./...'
            }
        }
        stage('Building our image') {
            steps {
                sh 'docker build -t adminturneddevops/go-webapp-sample .'
            }
        }
    }
}
  • 注意:DinD模式需要开启privileged: true,需确保EKS集群允许Pod使用特权模式。

3. 使用Kaniko替代Docker build(Kubernetes原生方案)

Kaniko无需依赖Docker daemon,可直接在容器内构建镜像并推送到仓库,更适配Kubernetes环境,且无需特权权限。

Pipeline示例:

pipeline {
    agent any
    tools {
        go 'go-1.21'
    }
    environment {
        GO111MODULE='on'
        REGISTRY='docker.io'
        IMAGE_NAME='adminturneddevops/go-webapp-sample'
        IMAGE_TAG='latest'
        // 需在Jenkins中配置Docker仓库凭证,ID设为docker-registry
        DOCKER_CREDS = credentials('docker-registry')
    }
    stages {
        stage('Test') {
            steps {
                git 'https://github.com/AdminTurnedDevOps/GoWebAPI.git'
                sh 'go test ./...'
            }
        }
        stage('Building our image') {
            steps {
                container('kaniko') {
                    sh '''
                        echo "${DOCKER_CREDS_PSW}" | kaniko \
                        --dockerfile=./Dockerfile \
                        --context=./ \
                        --destination=${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} \
                        --skip-tls-verify
                    '''
                }
            }
        }
    }
}

配置说明:

  • 在Jenkins的Kubernetes Pod模板中添加Kaniko容器,镜像使用gcr.io/kaniko-project/executor:latest
  • 在Jenkins凭证管理中添加Docker仓库的用户名密码凭证,ID与代码中credentials('docker-registry')对应

内容的提问来源于stack exchange,提问作者Reid123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:35:00