Kubernetes 1.24版本下Jenkins镜像构建部署方案咨询
解决方案:EKS 1.24下Jenkins无Docker镜像构建方案
EKS 1.24移除dockershim后,节点不再运行Docker守护进程,挂载/var/run/docker.sock的方式彻底失效。以下是针对Jenkins Kubernetes Pod Agent场景的几种成熟无Docker构建方案:
1. Kaniko(推荐优先使用)
Kaniko是Google开源的无daemon镜像构建工具,直接在容器内完成镜像构建与推送,适配Kubernetes环境,无需特权模式。
修改Jenkins Pod Agent配置
替换原有docker容器为Kaniko容器,无需挂载docker sock:
agent { kubernetes { defaultContainer 'jnlp' yaml ''' apiVersion: v1 kind: Pod metadata: labels: component: ci spec: serviceAccountName: jenkins containers: - name: kaniko image: gcr.io/kaniko-project/executor:latest command: ["sleep"] args: ["infinity"] volumeMounts: - name: kaniko-config mountPath: /kaniko/.docker volumes: - name: kaniko-config emptyDir: {} ''' } }
镜像构建阶段代码
stage('Create & Tag Image') { steps { container('kaniko') { sh ''' # 生成ECR认证配置 aws ecr get-login-password --region eu-central-1 | docker login --username AWS --password-stdin <AWS ECR URL> --config /kaniko/.docker/config.json # 执行构建并推送 /kaniko/executor \ --context "$PWD" \ --dockerfile "$PWD/Dockerfile" \ --destination "<AWS ECR URL>:latest" \ --network host ''' } } }
2. Buildah
Buildah是Red Hat开源的OCI镜像构建工具,支持镜像创建、修改、推送等全生命周期操作,灵活性强,但需要特权模式。
修改Jenkins Pod Agent配置
agent { kubernetes { defaultContainer 'jnlp' yaml ''' apiVersion: v1 kind: Pod metadata: labels: component: ci spec: serviceAccountName: jenkins containers: - name: buildah image: quay.io/buildah/stable:latest command: ["sleep"] args: ["infinity"] securityContext: privileged: true ''' } }
镜像构建阶段代码
stage('Create & Tag Image') { steps { container('buildah') { sh ''' # 登录ECR aws ecr get-login-password --region eu-central-1 | buildah login --username AWS --password-stdin <AWS ECR URL> # 构建镜像 buildah bud --tag "<AWS ECR URL>:latest" . # 推送镜像 buildah push "<AWS ECR URL>:latest" ''' } } }
3. BuildKit
BuildKit是Docker官方的下一代构建引擎,支持并行构建、缓存优化,适合大型项目。通过工具可直接在Kubernetes集群内启动BuildKit服务。
修改Jenkins Pod Agent配置
agent { kubernetes { defaultContainer 'jnlp' yaml ''' apiVersion: v1 kind: Pod metadata: labels: component: ci spec: serviceAccountName: jenkins containers: - name: buildkitd image: moby/buildkit:latest command: ["buildkitd"] args: ["--addr", "tcp://0.0.0.0:1234"] securityContext: privileged: true - name: buildkit-cli image: alpine/k8s:latest command: ["sleep"] args: ["infinity"] env: - name: BUILDKIT_HOST value: tcp://buildkitd:1234 ''' } }
镜像构建阶段代码
stage('Create & Tag Image') { steps { container('buildkit-cli') { sh ''' # 登录ECR aws ecr get-login-password --region eu-central-1 | docker login --username AWS --password-stdin <AWS ECR URL> # 启动构建并推送 buildctl build \ --frontend dockerfile.v0 \ --local context=. \ --local dockerfile=. \ --output type=image,name="<AWS ECR URL>:latest",push=true ''' } } }
方案选型参考
- Kaniko:无特权需求、配置简单,适合绝大多数Jenkins CI场景,优先推荐。
- Buildah:镜像操作灵活,适合需要修改现有镜像、多阶段复杂构建的场景。
- BuildKit:构建性能优异,支持缓存加速,适合大型项目或高频构建场景。
内容的提问来源于stack exchange,提问作者Theo
相关产品推荐
相关产品推荐

