如何在GitHub Actions中结合Maven构建与Docker镜像推送?
GitHub Actions构建Docker镜像时无法找到WAR文件的问题
背景
我在GitHub Actions中执行以下流程,前3步已成功,第4步失败:
- 使用Maven构建.war文件
- 将.war文件上传至本地仓库
- 准备Docker环境
- 运行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
问题原因及修复方案
核心问题
- Dockerfile直接使用
COMPONENT作为文件名,但该文件既未被复制到镜像中,也不在构建上下文的正确路径里 - 单个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
相关产品推荐
相关产品推荐

