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

如何在GitHub Action中为spring-boot:build-image构建的镜像打标签并推送?

如何在GitHub Action中对Spring Boot build-image生成的镜像打标签并推送?

我现有一个能成功构建Spring Boot应用Docker镜像的GitHub Action配置,具体如下:

name: CI

env:
  JDK_JAVA_OPTIONS: --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED --add-opens java.desktop/java.awt.font=ALL-UNNAMED
  MAVEN_USERNAME: ch4mpy
  
on: [push]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        
      - name: Set up JDK 17
        uses: actions/setup-java@v2
        with:
          distribution: 'temurin'
          java-version: '17'
          cache: 'maven'

      - name: Make Maven Wrapper executable
        if: contains(matrix.os, 'win') == false
        run: chmod +x ./mvnw

      - name: Build image
        run: ./mvnw spring-boot:build-image

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

目前已正确配置Docker Hub密钥,登录环节也能正常完成(我可以通过docker/build-push-action@v4基于Dockerfile完成镜像构建、打标及推送)。现在需要给spring-boot:build-image生成的本地镜像打标签并推送到Docker Hub,该怎么操作?


操作方案

核心思路

spring-boot:build-image默认生成的镜像格式为[项目artifactId]:[项目version],你只需将该本地镜像标记为Docker Hub仓库格式(DockerHub用户名/镜像名:标签),再执行推送即可。

修改后的完整GitHub Action配置

name: CI

env:
  JDK_JAVA_OPTIONS: --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED --add-opens java.desktop/java.awt.font=ALL-UNNAMED
  MAVEN_USERNAME: ch4mpy
  
on: [push]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        
      - name: Set up JDK 17
        uses: actions/setup-java@v2
        with:
          distribution: 'temurin'
          java-version: '17'
          cache: 'maven'

      - name: Make Maven Wrapper executable
        if: contains(matrix.os, 'win') == false
        run: chmod +x ./mvnw

      - name: Build image
        run: ./mvnw spring-boot:build-image

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      # 新增:提取项目artifactId和version,避免硬编码
      - name: Fetch project metadata
        id: project-meta
        run: |
          echo "artifactId=$(./mvnw help:evaluate -Dexpression=project.artifactId -q -DforceStdout)" >> $GITHUB_OUTPUT
          echo "version=$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_OUTPUT

      # 新增:给镜像打Docker Hub仓库标签
      - name: Tag image for Docker Hub
        run: |
          # 打版本标签
          docker tag ${{ steps.project-meta.outputs.artifactId }}:${{ steps.project-meta.outputs.version }} \
          ${{ secrets.DOCKERHUB_USERNAME }}/${{ steps.project-meta.outputs.artifactId }}:${{ steps.project-meta.outputs.version }}
          # 可选:同时打latest标签(仅建议main分支执行,可加条件判断)
          docker tag ${{ steps.project-meta.outputs.artifactId }}:${{ steps.project-meta.outputs.version }} \
          ${{ secrets.DOCKERHUB_USERNAME }}/${{ steps.project-meta.outputs.artifactId }}:latest

      # 新增:推送镜像到Docker Hub
      - name: Push image to Docker Hub
        run: |
          docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ steps.project-meta.outputs.artifactId }}:${{ steps.project-meta.outputs.version }}
          # 同步推送latest标签(若上方打了此标签)
          docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ steps.project-meta.outputs.artifactId }}:latest

额外优化建议

  • 若你已在pom.xml的spring-boot-maven-plugin中指定了imageName,可直接用该名称替换步骤中的${{ steps.project-meta.outputs.artifactId }}:${{ steps.project-meta.outputs.version }},无需提取项目信息;
  • 如需根据分支生成动态标签(比如main分支打latest,其他分支打分支名),可通过GitHub上下文变量实现,示例:
    # 在Tag步骤中替换标签部分
    docker tag [原镜像名] ${{ secrets.DOCKERHUB_USERNAME }}/[镜像名]:${{ github.ref_name }}
    

内容的提问来源于stack exchange,提问作者ch4mp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:13:18