使用Spring Boot Maven插件推送Docker镜像至GHCR失败求助
问题分析与解决方案
环境信息
- Spring Boot 3.4.2
- Java 23
- Maven 3.9.9
- 现象:
mvn clean spring-boot:build-image可成功构建镜像,但通过build-image-no-fork推送GHCR时失败,报错Execution default of goal org.springframework.boot:spring-boot-maven-plugin:3.4.2:build-image-no-fork failed: Error response received when pushing image: unsupported,手动推送镜像正常。
解决方案
1. 完善插件的注册表配置(核心修复)
当前pom.xml中仅配置了推送token,未指定GHCR的注册表地址,插件默认会指向Docker Hub,导致与GHCR的API不兼容,触发unsupported错误。需补充注册表地址:
修改pom.xml中<docker>节点:
<docker> <publishRegistry> <registry>ghcr.io</registry> <token>${env.TOKEN}</token> <username>${env.GITHUB_ACTOR}</username> </publishRegistry> </docker>
2. 复用GitHub Actions的Docker登录状态(简化配置)
你已通过docker/login-action完成GHCR登录,Spring Boot插件可直接复用本地Docker客户端的认证信息,无需在插件中单独配置token:
- 移除pom.xml中的
<docker>配置块 - 移除GitHub Actions中mvn命令的
TOKEN环境变量,修改后的步骤:
- run: mvn clean package -Poci -DskipTests env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} PINECONE_API_KEY: ${{ secrets.PINECONE_API_KEY }}
3. 切换插件目标为build-image
build-image-no-fork在部分环境下可能存在Docker交互兼容性问题,尝试改用标准的build-image目标:
修改pom.xml中的execution配置:
<executions> <execution> <goals> <goal>build-image</goal> </goals> </execution> </executions>
4. 验证Java版本兼容性
Spring Boot 3.4.2配套的Buildpacks对Java 23的支持可能不够完善,可临时切换到LTS版本Java 21验证:
- 修改pom.xml中的
BP_JVM_VERSION:
<env> <BP_JVM_VERSION>21</BP_JVM_VERSION> </env>
- 调整GitHub Actions的Java版本配置:
- uses: actions/setup-java@v4 with: java-version: '21' distribution: 'liberica' cache: 'maven'
原因说明
unsupported报错本质是容器注册表API版本不兼容:手动推送时Docker CLI已正确识别GHCR的地址和认证规则,但Spring Boot插件默认使用Docker Hub的API规范,未指定GHCR地址时会触发接口不兼容问题。
内容的提问来源于stack exchange,提问作者user3465651
相关产品推荐
相关产品推荐

