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

如何在EKS Fargate中挂载Docker.sock以支持Jenkins构建Docker镜像?

在EKS Fargate中用Jenkins构建Docker镜像的可行方案

首先得把核心问题说透:你之前尝试挂载EC2上的docker.sock到Fargate任务里的思路走不通,根源是Fargate的架构特性——它是完全托管的无服务器容器运行时,用户容器和底层宿主机完全隔离,你根本没法访问到宿主机的Docker daemon;而且EC2上的docker.sock对应的是EC2本地的Docker服务,和Fargate任务的运行环境完全不兼容,所以挂载过去自然没法用。

下面给你两个经过验证的可行方案:

方案一:用Kaniko替代Docker daemon构建镜像

Kaniko是Google开源的工具,它可以在没有Docker daemon的环境下直接构建Docker镜像,完全不需要依赖docker.sock,非常适配Fargate这种隔离环境。

具体步骤:

  1. 集成Kaniko到你的Jenkins Agent镜像:把Kaniko的二进制文件(或者直接基于官方gcr.io/kaniko-project/executor镜像扩展)加入到你的自定义Jenkins镜像里,确保镜像同时包含Jenkins agent所需工具和Kaniko。
  2. 配置Jenkins容器模板:在Kubernetes Jenkins插件的容器模板中,使用这个集成了Kaniko的镜像,不需要挂载任何docker.sock。
  3. 编写Jenkins Pipeline代码:用Kaniko执行构建,示例代码如下:
pipeline {
  agent {
    kubernetes {
      yaml '''
        apiVersion: v1
        kind: Pod
        spec:
          containers:
          - name: kaniko-agent
            image: your-custom-kaniko-jenkins-agent:latest
            command:
            - cat
            tty: true
            volumeMounts:
            - name: docker-config
              mountPath: /kaniko/.docker
          volumes:
          - name: docker-config
            secret:
              secretName: docker-registry-secret # 提前创建好镜像仓库的凭证Secret
      '''
    }
  }
  stages {
    stage('Build Docker Image') {
      steps {
        sh '''
          /kaniko/executor \
            --context=./ \
            --dockerfile=Dockerfile \
            --destination=your-registry/your-image:latest \
            --cache=true \ # 开启缓存提升构建速度
            --cache-repo=your-registry/kaniko-cache
        '''
      }
    }
  }
}

方案二:在Fargate中运行Docker-in-Docker(DinD)

如果你一定要用原生Docker命令构建,可以在Fargate的Jenkins Agent容器中运行Docker daemon(即DinD模式),不过需要注意Fargate的资源限制和配置要求。

具体步骤:

  1. 确认自定义镜像包含Docker工具:你的镜像已经安装了Docker及相关工具,这一步你已经完成了。
  2. 配置Jenkins容器模板为特权模式:在Kubernetes Jenkins插件的容器模板中,开启特权模式(Fargate目前支持特权模式),并分配足够的资源(建议至少2vCPU + 4GB内存):
    • 在容器模板的高级设置中,勾选"Privileged"选项
    • 设置CPU请求为2,内存请求为4Gi
  3. 启动Docker daemon并执行构建:在Jenkins任务中,先启动Docker daemon,再执行docker build命令,示例步骤:
stage('Build with DinD') {
  steps {
    sh '''
      # 后台启动Docker daemon
      dockerd --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2376 &
      # 等待Docker daemon启动完成
      sleep 10
      # 验证Docker连接
      docker info
      # 执行构建命令
      docker build -t your-registry/your-image:latest .
      docker push your-registry/your-image:latest
    '''
  }
}

注意:DinD模式会消耗较多资源,而且每次任务结束后缓存会丢失,如果需要缓存,可以挂载EFS到/var/lib/docker目录来持久化缓存。

额外注意事项

  • Fargate存储优化:如果需要持久化构建缓存或依赖,可以挂载EFS到Jenkins Agent容器的对应目录(比如Kaniko的缓存目录或Docker的/var/lib/docker)。
  • 镜像仓库凭证配置:无论用哪种方案,都需要提前在EKS集群中创建镜像仓库的Secret,并在Jenkins Pod模板中挂载,确保构建完成后可以顺利推送到仓库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:12:38