如何为Spring Boot构建linux/amd64与linux/arm64多架构原生镜像?
为Spring Boot应用构建多架构原生镜像并通过GitHub Action推送至Docker Hub
核心思路
借助Spring Boot的spring-boot:build-image命令结合GraalVM原生镜像能力,搭配GitHub Action的多平台运行环境与Docker Buildx,分别构建linux/amd64、linux/arm64架构的原生镜像,最后合并推送至Docker Hub。
步骤1:确认项目原生构建配置
确保项目pom.xml中已激活native Profile,Spring Boot Starter Parent默认集成了GraalVM相关依赖,只需保证Profile可正常启用即可。
步骤2:编写GitHub Action工作流
在项目根目录创建.github/workflows/build-native-images.yml文件,内容如下:
name: Build Multi-Arch Native Spring Boot Images on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 配置QEMU(支持交叉编译) uses: docker/setup-qemu-action@v3 - name: 初始化Docker Buildx uses: docker/setup-buildx-action@v3 - name: 登录Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_TOKEN }} - name: 配置GraalVM环境 uses: graalvm/setup-graalvm@v1 with: java-version: '17' # 替换为你的项目Java版本 distribution: 'graalvm' github-token: ${{ secrets.GITHUB_TOKEN }} - name: 构建并推送linux/amd64原生镜像 run: | mvn spring-boot:build-image -Pnative \ -Dspring-boot.build-image.imageName=你的DockerHub用户名/你的应用名:latest-amd64 \ -Dspring-boot.build-image.platform=linux/amd64 docker push 你的DockerHub用户名/你的应用名:latest-amd64 - name: 构建并推送linux/arm64原生镜像 run: | mvn spring-boot:build-image -Pnative \ -Dspring-boot.build-image.imageName=你的DockerHub用户名/你的应用名:latest-arm64 \ -Dspring-boot.build-image.platform=linux/arm64 docker push 你的DockerHub用户名/你的应用名:latest-arm64 - name: 创建并推送多架构镜像清单 run: | docker manifest create 你的DockerHub用户名/你的应用名:latest \ --amend 你的DockerHub用户名/你的应用名:latest-amd64 \ --amend 你的DockerHub用户名/你的应用名:latest-arm64 docker manifest push 你的DockerHub用户名/你的应用名:latest
关键说明
- GraalVM环境配置:通过官方
graalvm/setup-graalvmAction自动搭建对应版本的GraalVM环境,无需手动安装。 - 指定构建平台:通过
-Dspring-boot.build-image.platform参数明确目标架构,QEMU会提供交叉编译所需的模拟支持。 - 多架构镜像合并:先推送单个架构的镜像,再通过Docker Manifest将它们合并为一个多架构镜像,用户拉取时会自动匹配本地系统架构。
注意事项
- 在GitHub仓库的Secrets中配置
DOCKER_HUB_USERNAME和DOCKER_HUB_TOKEN,用于Docker Hub的身份验证。 - 将代码中的
你的DockerHub用户名和你的应用名替换为实际信息,Java版本需与项目使用的版本保持一致。
内容的提问来源于stack exchange,提问作者Giovanni Lovato
相关产品推荐
相关产品推荐

