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

如何在GitHub Actions中结合Maven构建与Docker镜像推送?

GitHub Actions构建Docker镜像时无法找到WAR文件的问题

背景

我在GitHub Actions中执行以下流程,前3步已成功,第4步失败:

  1. 使用Maven构建.war文件
  2. 将.war文件上传至本地仓库
  3. 准备Docker环境
  4. 运行Docker构建并推送(包含.war文件,失败)

已尝试的方法

  • 拉取已上传的制品并解压,但Docker无法找到该制品
  • 在一个Job中构建.war文件并上传,后续Job用actions/download-artifact@v3下载,仍出现Docker找不到文件的问题
  • 单个Job中构建.war文件并复制到Dockerfile所在目录,指定Docker上下文为.,Docker仍无法找到文件
  • 将war文件直接复制到Docker运行时目录,因权限错误失败
  • 将Dockerfile和.war文件复制到/tmp,在/tmp上下文运行Docker,仍无法找到文件

相关配置片段

GitHub Actions配置(build Job)

build:
  runs-on: ubuntu-latest

  steps:
    - uses: actions/checkout@v3
    
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'adopt'
        
    - name: Build with Maven
      run: mvn --settings server/mvn_settings/settings.xml --batch-mode --update-snapshots -f server/pom.xml -Drepo.login=${{ #### }} -Drepo.password=${{ #### }} COMPONENT
      
    - name: Copy files to neccessary folders
      run: mkdir staging && cp server/COMPONENT/target/*.war staging
    
    - uses: actions/upload-artifact@v3
      with:
       name: COMPONENT
       path: staging
       
    - name: Set up QEMU
      uses: docker/setup-qemu-action@v2
      
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2
      
    - name: Download artifact
      uses: actions/download-artifact@v3
      with:
        name: COMPONENT
        path: .
      
    - name: Login to DockerHub
      uses: docker/login-action@v2
      with:
        username: ####
        password: ####
      
    - name: Build and push
      uses: docker/build-push-action@v3
      with:
        context: .
        push: true
        tags: user/app:latest

Dockerfile相关片段

RUN unzip -d /usr/local/tomcat/webapps/APPLICATION/ COMPONENT

问题原因及修复方案

核心问题

  1. Dockerfile直接使用COMPONENT作为文件名,但该文件既未被复制到镜像中,也不在构建上下文的正确路径里
  2. 单个Job内重复执行upload-artifact和download-artifact属于冗余操作,反而容易打乱文件路径

修复步骤

1. 简化Actions流程,直接传递WAR文件

去掉冗余的上传/下载制品步骤,将Maven生成的WAR文件直接复制到Docker构建上下文(默认仓库根目录,需确保Dockerfile在此目录):

- name: Copy WAR to Docker context
  run: cp server/COMPONENT/target/*.war ./COMPONENT.war

这一步将带版本号的WAR重命名为固定名称,方便Dockerfile统一引用。

2. 修改Dockerfile,先复制再解压

Docker构建仅能访问上下文内的文件,因此必须先将WAR文件复制到镜像内部,再执行解压操作:

# 将上下文里的COMPONENT.war复制到镜像临时目录
COPY COMPONENT.war /tmp/
# 解压到Tomcat的webapps目标目录
RUN unzip -d /usr/local/tomcat/webapps/APPLICATION/ /tmp/COMPONENT.war

3. 验证Docker上下文

docker/build-push-action已指定context: .,只要WAR文件在仓库根目录,Docker就能正常读取,无需额外移动到/tmp或其他目录。

简化后的完整Actions Job

build:
  runs-on: ubuntu-latest

  steps:
    - uses: actions/checkout@v3
    
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'adopt'
        
    - name: Build with Maven
      run: mvn --settings server/mvn_settings/settings.xml --batch-mode --update-snapshots -f server/pom.xml -Drepo.login=${{ #### }} -Drepo.password=${{ #### }} COMPONENT
      
    - name: Copy WAR to Docker context
      run: cp server/COMPONENT/target/*.war ./COMPONENT.war
    
    - name: Set up QEMU
      uses: docker/setup-qemu-action@v2
      
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2
      
    - name: Login to DockerHub
      uses: docker/login-action@v2
      with:
        username: ####
        password: ####
      
    - name: Build and push
      uses: docker/build-push-action@v3
      with:
        context: .
        push: true
        tags: user/app:latest

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 03:15:58