Docker构建失败“复制失败:未指定任何源文件”

时间:2020-01-15 08:54:55

标签: maven docker

我是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

我可能正在做一些非常愚蠢的事情,但是我不知道从哪里开始寻找...

4 个答案:

答案 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 文件

  1. 从其中删除 / target (要复制的源文件路径)。
  2. 保存更改。
  3. 运行docker build命令

注意:有时在忽略文件中会提到源路径,而我们的构建命令会忽略该路径。

答案 3 :(得分:0)

我遇到了相同的问题,并通过确保文件名和目录的拼写正确且大小写匹配来解决了我的问题。 文件名和目录区分大小写,如果它们不匹配(包括大小写),您可能会遇到上述错误。