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

GitHub Action构建Docker镜像时出错,请求排查并修复相关问题

GitHub Action构建Docker镜像时出错,请求排查并修复相关问题

我来帮你排查并修复这个问题,先从最可能的原因入手,再优化整个GitHub Action流程:

一、先定位Docker构建失败的核心原因

从你提供的配置来看,Docker构建阶段最常见的问题是找不到要复制的jar包,结合你的代码,先检查这几点:

1. 确认Maven打包是否生成了正确的jar包

你的GitHub Action里先执行了mvn -B package --file pom.xml,但要确保:

  • 打包过程没有失败(可以查看Action日志里的Maven步骤输出,有没有报错信息)
  • 生成的jar包路径确实是target/PostService-0.0.1-SNAPSHOT.jar,和Dockerfile里的路径完全一致

如果Maven打包成功但Docker找不到jar,可能是Docker构建上下文的歧义:你的docker/build-push-action步骤默认用仓库根目录作为上下文,但可以明确指定,避免意外:

- name: Build and push container image to registry
  uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0
  with:
    push: true
    tags: ghcr.io/${{ env.REPO }}:${{ github.sha }}
    file: ./Dockerfile
    context: . # 明确指定构建上下文为当前仓库根目录

2. 优化Dockerfile,避免硬编码jar包名称

你的Dockerfile里硬编码了jar包全名,一旦版本号变更就会出错,建议用通配符简化,同时换成和Action中一致的JDK镜像,保持环境统一:

FROM eclipse-temurin:23-jdk-slim
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

这样不管Maven生成的jar包名称怎么变,都能正确复制,避免版本号修改导致的错误。

二、优化GitHub Action的其他细节

除了Docker构建的问题,还有几个可以让Action更健壮的优化点:

1. 复用环境变量,减少重复代码

你在build和deploy阶段都执行了小写转换仓库名的命令,直接用GitHub内置表达式就能完成,不用重复写shell命令:

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      REPO: ${{ github.repository | lower }} # 直接转小写,一步到位
    steps:
      # ... 其他步骤 ...
  deploy:
    runs-on: ubuntu-latest
    needs: build
    env:
      REPO: ${{ github.repository | lower }} # 复用同样的表达式
    # ... 其他配置 ...

2. 添加缓存,加速构建过程

为了减少每次构建的时间,可以给Maven依赖和Docker层添加缓存:

  • Maven缓存(放在Set up JDK 23之后,Build with Maven之前):
- name: Cache Maven packages
  uses: actions/cache@v4
  with:
    path: ~/.m2/repository
    key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
    restore-keys: |
      ${{ runner.os }}-maven-
  • Docker缓存(加到docker/build-push-action步骤里):
- name: Build and push container image to registry
  uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0
  with:
    push: true
    tags: ghcr.io/${{ env.REPO }}:${{ github.sha }}
    file: ./Dockerfile
    context: .
    cache-from: type=gha
    cache-to: type=gha,mode=max

3. 完善权限配置

确保Action有足够权限操作GHCR:
在全局permissions里添加packages: write,在deploy阶段添加packages: read,保证镜像推送和拉取的权限:

permissions:
  contents: read
  packages: write # 允许推送镜像到GHCR

# ...

deploy:
  permissions:
    contents: none
    packages: read # 允许拉取GHCR镜像

三、完整的修复后GitHub Action示例

这里是整合了所有优化点的完整配置:

name: Build and deploy a container to an Azure Web App

env:
  AZURE_WEBAPP_NAME: postms

on:
  push:
    branches: [ "master" ]
  workflow_dispatch:

permissions:
  contents: read
  packages: write

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      REPO: ${{ github.repository | lower }}
    steps:
      - uses: actions/checkout@v4

      - name: Set up JDK 23
        uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: '23'

      - name: Cache Maven packages
        uses: actions/cache@v4
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      - name: Build with Maven
        run: mvn -B package --file pom.xml

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0

      - name: Log in to GitHub container registry
        uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ github.token }}

      - name: Build and push container image to registry
        uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0
        with:
          push: true
          tags: ghcr.io/${{ env.REPO }}:${{ github.sha }}
          file: ./Dockerfile
          context: .
          cache-from: type=gha
          cache-to: type=gha,mode=max

  deploy:
    permissions:
      contents: none
      packages: read
    runs-on: ubuntu-latest
    needs: build
    env:
      REPO: ${{ github.repository | lower }}
    environment:
      name: 'Development'
      url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}

    steps:
      - name: Deploy to Azure Web App
        id: deploy-to-webapp
        uses: azure/webapps-deploy@v2
        with:
          app-name: ${{ env.AZURE_WEBAPP_NAME }}
          publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
          images: 'ghcr.io/${{ env.REPO }}:${{ github.sha }}'

四、验证步骤

  1. 先把Dockerfile替换成优化后的版本
  2. 把GitHub Action配置换成上面的完整版本
  3. 重新触发Action,查看Maven打包和Docker构建的日志,确认jar包是否被正确找到和复制
  4. 如果Azure部署时出现镜像拉取失败,需要给Azure App Service添加GHCR的访问凭证:
    在应用设置里添加三个变量:
    • DOCKER_REGISTRY_SERVER_URL: https://ghcr.io
    • DOCKER_REGISTRY_SERVER_USERNAME: 你的GitHub用户名
    • DOCKER_REGISTRY_SERVER_PASSWORD: 拥有packages:read权限的GitHub个人访问令牌

备注:内容来源于stack exchange,提问作者Lasal Hettiarachchi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:34:37