GitHub Action构建Docker镜像报错COPY failed: no source files were specified
问题原因及解决方案
核心错误原因
Dockerfile 中的 COPY 指令的源路径仅相对于执行 docker build 时指定的本地构建上下文根目录,不是容器内部的文件系统路径。你写的 COPY /usr/app/target/*.jar app.jar 是尝试从本地构建上下文的根目录下的 /usr/app/target/ 路径查找文件,该路径在干净的CI环境中不存在,因此触发报错。
你本地使用相对路径可以构建成功,是因为你本地提前执行过 mvnw clean package,项目根目录已经生成了带jar包的target目录,COPY 指令可以从本地拿到文件;而GitHub Action环境是干净的,构建前不会提前生成target目录,因此构建失败。
修复方案
方案一:单阶段构建,替换COPY为RUN指令
如果不需要做镜像体积优化,直接在当前构建阶段操作容器内部的文件,将错误的COPY行替换为RUN指令即可,RUN是容器内部的执行命令,可直接操作容器内的文件:
FROM openjdk:8-jdk-alpine as build COPY . /usr/app WORKDIR /usr/app RUN chmod +x mvnw \ && ./mvnw --version \ && ./mvnw clean package # 替换COPY为RUN,在容器内部复制文件 RUN cp target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","app.jar"]
方案二:多阶段构建,优化镜像体积
如果你原本是打算用多阶段构建减小最终镜像体积(推荐做法),你原来的Dockerfile缺少了第二运行阶段的声明,正确写法如下:
# 第一阶段:构建阶段,包含jdk和构建工具 FROM openjdk:8-jdk-alpine as build COPY . /usr/app WORKDIR /usr/app RUN chmod +x mvnw \ && ./mvnw --version \ && ./mvnw clean package # 第二阶段:运行阶段,仅保留jre和运行所需的jar包 FROM openjdk:8-jre-alpine WORKDIR /app # 从第一阶段build的容器路径中复制jar包 COPY --from=build /usr/app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","app.jar"]
该方案生成的最终镜像仅包含运行Java应用所需的jre环境和jar包,体积远小于单阶段构建的镜像。
内容的提问来源于stack exchange,提问作者Jose Rodriguez
相关产品推荐
相关产品推荐

