构建Spring Boot Docker镜像时复制Jar文件报错求助
Spring Boot Docker镜像构建错误:找不到target目录的解决方法
错误信息
failed to solve: lstat /var/lib/docker/tmp/buildkit-mount188888512/var/www/app/target: no such file or directory
问题原因
你的backend.Dockerfile中,RUN ./mvnw package已经在容器内部生成了target目录和jar包,但后续使用COPY var/www/app/target/*.jar app.jar是错误的——COPY指令的作用是从宿主机(构建上下文)复制文件到容器,而非在容器内部复制文件。宿主机的构建上下文里虽然有target目录,但你写的路径var/www/app/target在宿主机中不存在,因此触发报错。
修复方案
将容器内部复制文件的操作替换为RUN cp指令,修改后的Dockerfile如下:
FROM openjdk:17 WORKDIR /var/www/app COPY mvnw . COPY .mvn .mvn COPY pom.xml . COPY src src RUN ./mvnw package -Dmaven.test.skip EXPOSE 8080 # 使用RUN cp复制容器内生成的jar包到当前目录 RUN cp target/*.jar app.jar CMD ["java", "-jar", "app.jar"]
额外优化建议
1. 多阶段构建减少镜像体积
通过多阶段构建分离构建环境与运行环境,最终镜像仅包含运行所需的JRE和jar包,可大幅减小镜像体积:
# 第一阶段:构建jar包 FROM openjdk:17 as builder WORKDIR /var/www/app COPY mvnw . COPY .mvn .mvn COPY pom.xml . COPY src src RUN ./mvnw package -Dmaven.test.skip # 第二阶段:运行应用 FROM openjdk:17-jre-slim WORKDIR /var/www/app # 从构建阶段复制生成的jar包 COPY --from=builder /var/www/app/target/*.jar app.jar EXPOSE 8080 CMD ["java", "-jar", "app.jar"]
2. 确认构建上下文
你的docker-compose.yaml中指定了dockerfile: ./docker/backend.Dockerfile,默认构建上下文是docker-compose.yaml所在的根目录,这与Dockerfile中COPY mvnw .等指令的路径匹配,无需调整。
内容的提问来源于stack exchange,提问作者karixdev
相关产品推荐
相关产品推荐

