执行docker build后target目录缺失,Java项目Docker构建遇问题
问题分析与解决方法
你的Dockerfile采用了多阶段构建,但第二阶段没有正确从build阶段复制构建产物,这是target目录缺失的核心原因:
第一阶段(
build)确实执行了mvn package,生成的target目录存在于build阶段的容器内(路径/usr/src/app/target),但你第二阶段的COPY ./target ./是从本地构建上下文复制文件,而本地如果没提前执行mvn打包,或者没有把build阶段的产物传递过来,自然找不到target目录。另外你的
ENTRYPOINT写法存在语法问题,会导致脚本无法正确执行。
修改后的完整Dockerfile
FROM maven:3.9.3-amazoncorretto-20 AS build COPY src /usr/src/app/src COPY pom.xml /usr/src/app RUN mvn -f /usr/src/app/pom.xml clean package FROM amazoncorretto:20-alpine-jdk # 从build阶段复制构建好的target目录到当前容器 COPY --from=build /usr/src/app/target ./target COPY entrypoint.sh . # 使用数组形式定义ENTRYPOINT,避免shell解析错误 ENTRYPOINT ["sh", "entrypoint.sh"]
关键修改说明
COPY --from=build:这是多阶段构建的核心指令,用来指定从前面的build阶段复制文件,这样就能把第一阶段打包生成的jar包等产物传递到第二阶段的容器中。- 修正ENTRYPOINT写法:Docker的ENTRYPOINT如果用字符串形式,会被当作单个命令执行(相当于
sh -c "sh entrypoint.sh"),容易出现解析问题;使用数组形式["sh", "entrypoint.sh"]是标准写法,让Docker直接调用sh并传入entrypoint.sh作为参数。
内容的提问来源于stack exchange,提问作者Itzik.B
相关产品推荐
相关产品推荐

