Docker化Apache Commons Daemons Maven项目时构建报错:无法计算缓存密钥
Docker化Apache Commons Daemons Maven项目时构建报错:无法计算缓存密钥
嗨,我来帮你分析下这个问题哈!你遇到的这个Docker构建报错,核心原因就是Docker找不到你要添加的target/simple-docker.jar文件,下面给你拆解几个常见原因和对应的解决办法:
1. 先确认Maven构建的jar包信息与构建上下文
- 首先,在项目根目录执行
mvn clean install后,打开target目录看看:生成的jar包名字是不是simple-docker.jar?很多时候Maven默认生成的jar包名是和项目名绑定的(比如带版本号的项目名格式,像commons-daemons-1.2.4.jar),如果和你Dockerfile里写的名字对不上,自然会找不到文件。 - 另外,一定要确保你是在项目根目录执行
docker build .命令!Docker的构建上下文是你执行命令时的当前目录,要是你跑到子目录或者其他路径执行构建,Docker根本看不到项目根下的target文件夹。
2. 检查多阶段构建的产物传递是否正确
看你贴的Dockerfile片段,应该是用了多阶段构建(前面有Maven构建的阶段,后面是OpenJDK运行阶段),但你直接用ADD target/simple-docker.jar是错的——多阶段构建的不同阶段是独立的文件系统,第一阶段Maven构建出来的jar包不会自动出现在第二阶段。
给你一个规范的多阶段构建示例,你可以参考调整:
# 第一阶段:使用Maven镜像完成项目构建 FROM maven:3.8.6-openjdk-8 AS builder WORKDIR /app # 复制pom.xml和源码到构建环境 COPY pom.xml . COPY src ./src # 执行Maven构建,跳过测试加速构建 RUN mvn clean install -DskipTests # 第二阶段:基于OpenJDK镜像运行jar包 FROM openjdk:8 WORKDIR /app # 从第一阶段的builder容器中复制构建好的jar包到当前容器 COPY --from=builder /app/target/你的实际jar包名称.jar simple-docker.jar # 启动命令 ENTRYPOINT ["java", "-jar", "simple-docker.jar"] EXPOSE 8080
3. 排查是否有配置文件忽略了target目录
检查项目根目录下的.dockerignore文件,如果里面写了target/,Docker在构建时会直接忽略这个目录,自然找不到里面的jar包。要是有这条规则,要么删掉它,要么把jar包的路径调整到不被忽略的目录里。
最后给你个快速验证的小步骤:在项目根目录执行ls target,把输出的真实jar包名字记下来,对应修改Dockerfile里的文件名称,然后重新执行mvn clean install && docker build -t commons-daemons-demo .试试,应该就能解决问题啦!
备注:内容来源于stack exchange,提问作者Game Wame




