使用Jib+GitHub流水线上传镜像至AWS ECR时遇I/O错误求助
问题:GitHub Actions + Jib 上传AWS ECR时报NoHttpResponseException
我通过GitHub Actions流水线用Jib构建镜像并上传至AWS ECR,一直失败。AWS环境变量已配置正确,在Actions步骤中执行以下命令能成功登录ECR并列出镜像:
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <repo-url>
build.gradle中的Jib配置如下:
jib { var tag2 = "latest" var snapshotImageUcrUri = "xxx.dkr.ecr.us-east-1.amazonaws.com/yyy/demo-image-0.0.1-snapshot" from { image = "docker.io://amazoncorretto:17" } to { image = "$snapshotImageUcrUri" tags = [tag2] } container { jvmFlags = ['-Xms512m', '-Xdebug'] mainClass = 'com.example.demo.DemoApplication' ports = ['9000', '9001'] labels = [version: "0.0.1-snapshot"] } }
执行./gradlew jib时,系统已从Docker配置文件获取到凭证,但无法上传数据块,反复出现重试提示:
POST https://xxx.dkr.ecr.us-east-1.amazonaws.com/v2/yyy/demo-image-0.0.1-snapshot/blobs/uploads/ failed and will be retried
最终报错信息:
I/O error for image [xxx.dkr.ecr.us-east-1.amazonaws.com/yyy/demo-image-0.0.1-snapshot]: org.apache.http.NoHttpResponseException The target server failed to respond
解决方法
让Jib直接使用AWS凭证,不依赖Docker登录
Jib支持直接通过AWS凭证认证,无需依赖Docker的登录配置。可以在build.gradle中添加认证配置,或者确保GitHub Actions中已设置AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY环境变量,Jib会自动读取:jib { // 保留原有配置 to { image = "$snapshotImageUcrUri" tags = [tag2] auth { username = System.getenv("AWS_ACCESS_KEY_ID") password = System.getenv("AWS_SECRET_ACCESS_KEY") } } }也可以直接跳过docker login步骤,避免凭证冲突。
调整Jib的HTTP超时参数
NoHttpResponseException多与连接或传输超时有关,在build.gradle中增加超时配置:jib { // 保留原有配置 http { timeout = 300000 // 5分钟,单位毫秒 connectTimeout = 10000 // 连接超时10秒 } }检查ECR权限与网络
- 确认GitHub Actions运行环境的IP在ECR仓库的访问白名单内(如果设置了白名单)
- 验证AWS IAM用户/角色拥有以下ECR权限:
ecr:BatchCheckLayerAvailability、ecr:CompleteLayerUpload、ecr:InitiateLayerUpload、ecr:PutImage、ecr:UploadLayerPart
清理Docker凭证缓存
有时候Docker的旧凭证会干扰Jib,在执行./gradlew jib前清理Docker配置:rm -rf ~/.docker/config.json
内容的提问来源于stack exchange,提问作者user959671
相关产品推荐
相关产品推荐

