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

EKS中运行的Jenkins容器无法连接Docker守护进程,导致Docker镜像构建流水线失败

EKS中运行的Jenkins容器无法连接Docker守护进程,导致Docker镜像构建流水线失败

嘿,我来帮你搞定这个头疼的问题!你遇到的Cannot connect to the Docker daemon错误,核心原因很简单:你的Jenkins容器里只装了Docker客户端(CLI),但没有运行Docker守护进程(daemon)——像docker ps这类命令必须和daemon通信才能正常工作,而默认情况下容器里不会自带正在运行的daemon进程。

下面给你三种可行的解决方案,你可以根据自己的场景选择:

方案一:挂载宿主机的Docker套接字(快速临时方案,需注意安全)

这种方式是让Jenkins容器直接复用EKS节点上的Docker daemon,不用在容器里单独跑daemon。

  1. 修改Jenkins的K8s部署配置,添加volume挂载,把宿主机的/var/run/docker.sock挂载到容器内的同一路径:
    volumes:
      - name: docker-sock
        hostPath:
          path: /var/run/docker.sock
          type: Socket
    containers:
      - name: jenkins
        volumeMounts:
          - name: docker-sock
            mountPath: /var/run/docker.sock
    
  2. 调整Dockerfile权限:确保Jenkins用户有权限访问这个套接字。你需要先在EKS节点上用getent group docker查看宿主机docker组的ID,然后在Dockerfile里把jenkins用户加入对应组:
    ARG DOCKER_GID=999 # 这里替换成你实际查到的组ID
    RUN usermod -aG docker jenkins
    

⚠️ 注意:这种方式有安全风险——容器内的进程能直接控制宿主机的Docker daemon,若Jenkins被攻破,攻击者可以直接接管整个节点,所以不推荐在生产环境使用。

方案二:使用Docker-in-Docker(DinD,适合需要完整Docker环境的场景)

这种方式是在Jenkins Pod里额外运行一个Docker daemon(可以作为sidecar容器),让Jenkins CLI连接这个内部的daemon。

  1. 修改Jenkins的Pod配置,添加DinD sidecar容器:
    containers:
      - name: dind
        image: docker:dind
        securityContext:
          privileged: true # DinD必须启用特权模式
        volumeMounts:
          - name: docker-storage
            mountPath: /var/lib/docker
      - name: jenkins
        image: your-custom-jenkins-image
        env:
          - name: DOCKER_HOST
            value: tcp://localhost:2375 # 让CLI连接到sidecar的daemon
    volumes:
      - name: docker-storage
        emptyDir: {} # 也可以换成持久化存储避免重启丢失镜像
    

⚠️ 注意:特权模式同样存在安全风险,而且emptyDir存储会在Pod重启后丢失所有构建的镜像,生产环境使用建议配合持久化卷。另外要确保Jenkins容器里的Docker CLI版本和DinD镜像的daemon版本兼容。

方案三:使用Kaniko(K8s环境最佳实践,安全无特权)

这是Google推出的工具,不需要Docker daemon就能直接构建镜像并推送到容器注册表,完全适配Kubernetes环境,没有安全风险,也不需要特权模式,是生产环境的首选。

你可以在Jenkins流水线里用Kaniko容器来完成镜像构建:

pipeline {
  agent {
    kubernetes {
      yaml '''
        apiVersion: v1
        kind: Pod
        spec:
          containers:
          - name: kaniko
            image: gcr.io/kaniko-project/executor:latest
            command: ["sleep"]
            args: ["999999"]
            volumeMounts:
              - name: docker-config
                mountPath: /kaniko/.docker
          volumes:
            - name: docker-config
              secret:
                secretName: docker-registry-secret # 提前创建好的注册表凭据Secret
      '''
    }
  }
  stages {
    stage('Build & Push Image') {
      steps {
        container('kaniko') {
          sh '/kaniko/executor --context=./ --dockerfile=./Dockerfile --destination=your-registry/your-image:v1.0'
        }
      }
    }
  }
}

使用前需要先在EKS集群里创建一个包含容器注册表用户名、密码的Secret,Kaniko会用这个Secret来完成镜像推送。

备注:内容来源于stack exchange,提问作者user2051904

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 08:25:31