在Jenkins中使用ECR作为Docker构建缓存后端的报错排查
Jenkins流水线用ECR做远程缓存时提示builder不存在的问题
背景
在Jenkins上搭了构建Docker镜像的CI流水线,因为代理是临时实例,想靠ECR远程缓存提高缓存命中率。已经按要求创建了用docker-container驱动的自定义Docker Builder(默认驱动不支持ECR缓存),docker buildx ls能看到builder已经在运行,但执行docker.build()时却报错。
当前代码实现
dockerBuilder = 'ecr-caching-builder' pipeline { // ... stages { // ... stage('...') { steps { script { // 不存在则创建docker builder sh """ docker buildx inspect ${dockerBuilder} || \ docker buildx create \ --driver=docker-container \ --name=${dockerBuilder} """ // 确认builder存在 sh 'docker buildx ls' // 构建的镜像从ECR拉取基础镜像 docker.withRegistry("https://${ECR_REGISTRY}", "ecr:${REGION}:${ECR_SECRET_ID}") { // 参考AWS文档构建镜像 docker.build("${DOCKER_IMAGE_NAME}_${BRANCH_NAME}_${env.BUILD_NUMBER}", "--builder ${dockerBuilder} \ --cache-to mode=max,image-manifest=true,oci-mediatypes=true,type=registry,ref=${ECR_REGISTRY}/${DOCKER_IMAGE_NAME}:cache \ --cache-from type=registry,ref=${ECR_REGISTRY}/${DOCKER_IMAGE_NAME}:cache \ ." ) } } } } } }
报错信息
ERROR: no builder "ecr-caching-builder" found
解决办法
激活创建的builder:
docker buildx create创建后不会自动激活,需要加上--use参数,或者单独执行激活命令。修改创建脚本:docker buildx inspect ${dockerBuilder} || \ docker buildx create \ --driver=docker-container \ --name=${dockerBuilder} \ --use或者在script块里单独加一行:
sh "docker buildx use ${dockerBuilder}"验证builder运行状态:创建后执行
docker buildx inspect ${dockerBuilder}确认builder处于运行状态,若未运行,执行启动命令:docker buildx inspect ${dockerBuilder} --bootstrap改用
docker buildx build直接执行:Jenkins的docker.build()方法对buildx参数支持有限,换成直接调用shell命令的方式更可靠:sh """ docker buildx build \ --builder ${dockerBuilder} \ --cache-to mode=max,image-manifest=true,oci-mediatypes=true,type=registry,ref=${ECR_REGISTRY}/${DOCKER_IMAGE_NAME}:cache \ --cache-from type=registry,ref=${ECR_REGISTRY}/${DOCKER_IMAGE_NAME}:cache \ -t ${DOCKER_IMAGE_NAME}_${BRANCH_NAME}_${env.BUILD_NUMBER} \ . """注:如果需要推送到ECR,要先通过Jenkins的ECR凭证插件生成并执行登录命令。
内容的提问来源于stack exchange,提问作者Ivan Rubinson
相关产品推荐
相关产品推荐

