如何在K8s环境的Jenkins流水线中使用Kaniko构建的镜像?
在Kubernetes Jenkins流水线中用Kaniko替代Docker完成构建-测试-推送流程
核心思路
Kaniko构建后生成镜像tar包,在Kubernetes环境下要避免DinD,需通过共享卷传递tar包,再用容器运行时工具(如ctr)将tar包导入本地存储,最后基于导入的镜像执行测试。
完整流水线示例
pipeline { agent { kubernetes { volumes { // 定义共享卷,存储Kaniko生成的镜像tar包 emptyDirVolume(mountPath: '/kaniko-output', name: 'kaniko-output') } } } stages { stage('Build Image with Kaniko') { steps { container('kaniko') { script { sh ''' /kaniko/executor \ --tar-path=/kaniko-output/myimage.tar \ --context . \ --no-push \ --destination myregistry:tag ''' } } } } stage('Run Tests in Built Image') { steps { // 使用带containerd客户端工具的镜像 container('containerd-cli') { script { sh ''' // 导入tar包到本地containerd存储 ctr images import /kaniko-output/myimage.tar // 启动容器执行测试,--rm确保测试后自动清理容器 ctr run --rm myregistry:tag test-container pipenv run test ''' } } } } stage('Push Image with Crane') { steps { container('crane') { script { sh ''' crane push /kaniko-output/myimage.tar myregistry:tag ''' } } } } } }
关键细节说明
- 共享卷配置:通过
emptyDirVolume让Kaniko与后续测试、推送容器共享镜像tar包,避免跨容器文件传递的复杂操作 - 测试容器选择:需使用包含
ctr(containerd客户端)的镜像,可自行构建基础镜像安装containerd.io包,或直接使用官方containerd:latest镜像(注意调整命令路径) - 镜像导入与测试运行:
ctr images import将tar包导入本地镜像存储ctr run --rm启动容器执行测试命令,测试完成后自动销毁容器
- 镜像推送:
crane push直接读取共享卷中的tar包推送到目标仓库,无需额外转换
替代方案(用skopeo)
若偏好skopeo工具,可将tar包导入临时OCI存储后运行测试:
stage('Run Tests with Skopeo') { steps { container('skopeo') { script { sh ''' // 创建临时OCI存储目录 mkdir -p /tmp/oci-store // 导入tar包到OCI存储 skopeo copy docker-archive:/kaniko-output/myimage.tar oci:/tmp/oci-store/myimage // 用podman运行镜像执行测试 podman run --rm oci:/tmp/oci-store/myimage pipenv run test ''' } } } }
内容的提问来源于stack exchange,提问作者Rapolas K.
相关产品推荐
相关产品推荐

