如何在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
相关产品推荐
相关产品推荐

