Jenkins构建Docker镜像报ADD failed/无目录错误 命令行构建正常
报错根因
ADD failed: no source files were specified 报错的核心触发原因是Docker构建上下文路径与Maven打包产物的实际存储路径不匹配。
你在本地命令行能正常构建,是因为操作时大概率先进入了scheduler目录再执行docker build命令,路径逻辑自洽;但Jenkins流水线的执行路径和你本地操作不一致:
- Jenkins拉取代码后,默认工作目录是仓库根目录,执行
mvn -f scheduler/pom.xml package命令时,生成的jar包会存放在scheduler/target路径下,而非工作区根目录的target路径 - 你写的
docker.build("phelumiess/demo","-f scheduler/Dockerfile .")命令里,最后一个.指定Docker构建上下文为仓库根目录,此时Docker会按照Dockerfile的配置,去根目录下查找target/birthday-scheduler*.jar文件,根目录下不存在对应路径,自然找不到源文件触发报错。
修复方案
推荐优先用第一种方案,改动量最小,和你本地能跑通的逻辑完全对齐。
方案1:调整Docker构建上下文路径
不需要修改Dockerfile内容,只需要把镜像构建阶段的docker.build命令调整上下文路径即可,将原代码:def dockerImage=docker.build("phelumiess/demo","-f scheduler/Dockerfile .")替换为:
def dockerImage = docker.build("phelumiess/demo", "-f scheduler/Dockerfile scheduler")修改后Docker会以
scheduler目录作为构建上下文,Dockerfile中配置的target/birthday-scheduler*.jar路径会正确匹配到scheduler/target下的jar包,构建即可正常执行。方案2:调整路径配置适配根目录构建上下文
如果你需要保留构建上下文为仓库根目录的配置,需要同步修改两处:- 调整Maven打包步骤的执行目录,修改Build jar阶段的执行逻辑:
stage('Build jar') { steps { dir('scheduler') { sh "mvn package -DskipTests -X" } echo 'Build jar Completed' } }- 修改Dockerfile内的ADD路径,匹配根目录上下文下的jar包位置:
FROM openjdk:8-jdk-alpine EXPOSE 8080 ADD scheduler/target/birthday-scheduler*.jar birthday-scheduler.jar ENTRYPOINT ["java","-jar","/birthday-scheduler.jar" ]
内容的提问来源于stack exchange,提问作者ferrocene
相关产品推荐
相关产品推荐

