Docker构建阶段复制Maven生成Jar文件失败,求排查方案
Docker构建报错:
lstat /var/lib/docker/tmp/.../target: no such file or directory 排查方案 核心错误原因
你的builder阶段存在路径逻辑错误:
- 你将maven构建生成的jar包复制到了容器内的
up-user-service/target目录:COPY --from=maven_builder /app/target/*.jar up-user-service/target - 但后续通过
ARG JAR_FILE=target/*.jar尝试读取当前工作目录下的target文件夹,而容器默认工作目录是/,这里并没有target目录,因此触发了文件找不到的错误。
修复后的Dockerfile
调整builder阶段的路径逻辑,确保能正确定位到jar包,以下是两种可行方案:
方案1:指定工作目录统一路径
FROM maven:3.8.3-openjdk-17 as maven_builder WORKDIR /app COPY up-user-service/pom.xml . COPY up-user-service/src ./src RUN mvn clean install # 后续用--progress=plain参数构建可查看此命令输出 RUN ls -l /app/target FROM openjdk:17-jdk-alpine as builder WORKDIR /builder # 将jar复制到当前工作目录的target子文件夹 COPY --from=maven_builder /app/target/*.jar ./target/ ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} application.jar RUN java -Djarmode=layertools -jar application.jar extract FROM openjdk:17-jdk-alpine COPY --from=builder /builder/dependencies/ ./ COPY --from=builder /builder/snapshot-dependencies/ ./ COPY --from=builder /builder/spring-boot-loader/ ./ COPY --from=builder /builder/application/ ./ ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
方案2:简化复制逻辑(更推荐)
直接将jar包复制到builder阶段的当前工作目录,省去中间路径:
FROM maven:3.8.3-openjdk-17 as maven_builder WORKDIR /app COPY up-user-service/pom.xml . COPY up-user-service/src ./src RUN mvn clean install FROM openjdk:17-jdk-alpine as builder COPY --from=maven_builder /app/target/*.jar application.jar RUN java -Djarmode=layertools -jar application.jar extract FROM openjdk:17-jdk-alpine COPY --from=builder dependencies/ ./ COPY --from=builder snapshot-dependencies/ ./ COPY --from=builder spring-boot-loader/ ./ COPY --from=builder application/ ./ ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
查看ls命令输出的方法
构建时添加--progress=plain参数,即可查看所有RUN命令的详细输出,包括ls -l /app/target的内容:
docker build --progress=plain -t your-image-name .
内容的提问来源于stack exchange,提问作者Sumit Desai
相关产品推荐
相关产品推荐

