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
- 新增HostPath卷:路径填
- 调整容器的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
相关产品推荐
相关产品推荐

