Jenkins流水线推送镜像至AWS ECR安全扫描报UNSUPPORTED_IMAGE错误
报错根因
ECR返回UNSUPPORTED_IMAGE错误,本质是推送的镜像不符合ECR安全扫描支持的格式要求,结合你的配置和节点环境,具体诱因有两点:
- 你当前使用的Jenkins Docker云代理镜像内置Docker版本过旧,默认构建生成Docker schema v1格式的镜像manifest,AWS ECR目前所有安全扫描能力都已停止支持v1格式,仅兼容Docker schema v2、OCI标准格式的镜像
- 流水线配置存在疏漏:
repo变量未提前声明,构建步骤没有显式指定构建上下文路径和格式兼容参数,旧版Docker客户端会直接沿用默认配置生成不兼容的镜像格式。
修复步骤
1. 调整节点Docker配置
优先把Jenkins Docker从节点的Docker版本升级到20.10及以上稳定版,新版Docker默认构建生成schema v2格式镜像,天然兼容ECR扫描要求。如果暂时无法替换节点基础镜像,构建时可以通过开启BuildKit强制输出兼容格式的镜像。
2. 修正流水线配置
补全缺失的变量定义、修正语法缩进问题、显式指定构建参数,调整后的参考配置如下:
def customTag = 'thisiscustomTag' // 提前定义ECR相关配置,替换为你实际的账号、区域、仓库名 def awsAccountId = '000000000000' def awsRegion = 'eu-central-1' def ecrRegistry = "${awsAccountId}.dkr.ecr.${awsRegion}.amazonaws.com" def repoName = '替换为你的实际ECR仓库名称' def fullImageAddr = "${ecrRegistry}/${repoName}" pipeline { agent { label 'docker' } stages { stage('Checkout') { steps { git branch: 'master', credentialsId: 'test-credentials', url: 'https://test.repo.git' } } stage('Building image') { steps { script { // 开启BuildKit强制构建兼容v2/OCI格式的镜像 withEnv(['DOCKER_BUILDKIT=1']){ docker.withRegistry( "https://${ecrRegistry}", "ecr:${awsRegion}:${awsAccountId}") { // 显式指定镜像地址、Dockerfile路径和构建上下文 myImage = docker.build(fullImageAddr, "--pull -f Dockerfile .") } } } } } stage('Pushing to ECR') { steps { script { docker.withRegistry( "https://${ecrRegistry}", "ecr:${awsRegion}:${awsAccountId}") { // 推送自定义标签镜像 myImage.push(customTag) // 业务需要的话可以额外推送latest标签 // myImage.push("latest") } } } } } }
3. 结果验证
重新执行流水线推送镜像后,可在ECR控制台查看对应镜像标签的manifest格式:如果类型为application/vnd.docker.distribution.manifest.v2+json或OCI标准格式,即可正常触发安全扫描,不会再触发UNSUPPORTED_IMAGE报错。
特殊场景排查:如果Dockerfile使用
FROM scratch作为基础镜像且没有构建任何有效文件层,也会触发同类报错,常规业务镜像只要格式符合要求就不会出现该问题。
内容的提问来源于stack exchange,提问作者zeus.atr
相关产品推荐
相关产品推荐

