GitHub Actions中Docker构建ADD失败:文件未找到问题排查
问题描述
在配置GitHub Actions CI/CD流程构建Docker镜像时,多次调整后仍遇到ADD指令失败的错误,错误信息如下:
ADD failed: file not found in build context or excluded by .dockerignore: stat prise/target/prise-8.18.0-SNAPSHOT-app.jar: file does not exist
Error: Process completed with exit code 1.
Dockerfile中指定添加prise/target/prise-8.18.0-SNAPSHOT-app.jar文件,GitHub Actions流程中已执行Maven多模块打包(pom.xml配置生成带app classifier的Spring Boot可执行jar),日志显示jar已生成。尝试调整docker build的上下文路径(.和..),但仍报错。
相关配置片段:
Dockerfile
FROM openjdk:11-jdk-slim ADD prise/target/prise-8.18.0-SNAPSHOT-app.jar app.jar EXPOSE 8080 # Run the application ENTRYPOINT ["java", "-jar", "/app.jar"]
GitHub Actions关键步骤
- uses: actions/checkout@v3 - name: Build the Docker image run: docker build .. --file Dockerfile
排查与解决步骤
确认Docker构建上下文与路径对应关系
执行docker build .. --file Dockerfile时,构建上下文是当前目录的上级目录,Dockerfile中的文件路径是相对于这个上下文的。若项目结构是仓库根目录下包含prise模块和Dockerfile所在目录,需确保Maven打包生成的jar确实在上下文的prise/target路径下。检查Maven打包的工作目录
GitHub Actions默认工作目录是仓库根目录,确保Maven打包步骤在根目录执行,这样多模块的jar才会生成在对应模块的target目录下:- name: Maven package run: mvn clean package -DskipTests修正docker build命令的上下文与Dockerfile路径
核心规则:Dockerfile中的路径相对于构建上下文,--file参数指定的是Dockerfile相对于当前shell工作目录的路径。
若Dockerfile在仓库根目录下,构建命令应为:run: docker build . --file Dockerfile若Dockerfile在子目录(如
docker/Dockerfile),则命令应为:run: docker build . --file docker/Dockerfile之前使用
..作为上下文可能指向仓库外的目录,导致无法找到内部的prise/target文件。检查.dockerignore规则
确认仓库根目录的.dockerignore没有排除prise/target或target目录。若有target/规则,需添加例外保留模块的target目录:target/ !prise/target/验证文件存在性
在docker build步骤前添加检查步骤,确认jar文件的实际路径和名称:- name: Verify jar file run: ls -la prise/target/此步骤可直观查看文件是否存在、文件名是否与Dockerfile中的完全匹配(包括版本号、classifier)。
内容的提问来源于stack exchange,提问作者Jenks

