You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:55:06