我是Docker的新手(但不是开发人员)。
我有这个Dockerfile:
#
# Build stage
#
FROM maven:3.6.3-jdk-8-slim AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package
#
# Package stage
#
FROM openjdk:8-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
ARG war_FILE=/home/app/target/*.war
COPY ${war_FILE} app.war
ENTRYPOINT ["java","-jar","/app.war"]
(到目前为止,一切顺利)构建成功:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:51 min
[INFO] Finished at: 2020-01-15T08:43:54Z
[INFO] ------------------------------------------------------------------------
但是最后, docker构建失败:
Removing intermediate container 7c66e8b7dbed
---> 74b1c50c84ad
Step 5/10 : FROM openjdk:8-jdk-alpine
---> a3562aa0b991
Step 6/10 : RUN addgroup -S spring && adduser -S spring -G spring
---> Running in ca236cf9a705
Removing intermediate container ca236cf9a705
---> 0c255ef5868f
Step 7/10 : USER spring:spring
---> Running in 8452dcff6a8a
Removing intermediate container 8452dcff6a8a
---> 6265f412699a
Step 8/10 : ARG war_FILE=/home/app/target/*.war
---> Running in 3b54067b2cca
Removing intermediate container 3b54067b2cca
---> c186c4a7e443
Step 9/10 : COPY ${war_FILE} app.war
COPY failed: no source files were specified
我可能正在做一些非常愚蠢的事情,但是我不知道从哪里开始寻找...
答案 0 :(得分:3)
在多阶段构建中,每个阶段的数据不在阶段之间共享。
因此,实际上在build
阶段,您已经成功创建了/home/app/target/
下的war文件。
但是,在第二阶段,此路径不存在,导致报告了错误。
要解决此问题,请将第二阶段替换为:
FROM openjdk:8-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
COPY --from=build /home/app/target/war_name.war app.war
ENTRYPOINT ["java","-jar","/app.war"]
Example来自官方文档。
答案 1 :(得分:1)
在您的Dockerfile中,
ARG war_FILE=/home/app/target/*.war
COPY ${war_FILE} app.war
由于某些原因,${war_FILE}
没有得到更新。您可以检查构建后.war
处是否存在/home/app/target/
个文件吗?
此外,如果war_FILE
是常量,为什么不直接从该位置复制文件呢?即
COPY /home/app/target/*.war app.war
同样,如果会有多个.war
文件,则可能是一个问题
答案 2 :(得分:0)
检查 .gitignore和.dockerignore 文件
注意:有时在忽略文件中会提到源路径,而我们的构建命令会忽略该路径。
答案 3 :(得分:0)
我遇到了相同的问题,并通过确保文件名和目录的拼写正确且大小写匹配来解决了我的问题。 文件名和目录区分大小写,如果它们不匹配(包括大小写),您可能会遇到上述错误。