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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:57:00