【问题标题】:Docker build fails "COPY failed: no source files were specified"Docker 构建失败“复制失败:未指定源文件”
【发布时间】:2020-05-02 00:15:04
【问题描述】:

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

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

【问题讨论】:

    标签: maven docker


    【解决方案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】:

      在多阶段构建中,每个阶段的数据不会在阶段之间共享

      因此,确实在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 来自官方文档。

      【讨论】:

        【解决方案3】:

        检查 .gitignore 和 .dockerignore 文件

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 如果我在 COPY 命令中使用 ARG 变量,我仍然会收到错误消息。我可以将变量回显出来,将其复制并直接粘贴到 COPY 命令中,它就可以工作了。这是我输入命令的方式。 COPY [${projectFilePath}, "./"] 但是,COPY ["explicit path", "./"] 工作正常。
          • 好的,快速跟进。事实证明,如果要提供 ARG 变量,则不能使用 []。所以,COPY ${projectFilePath} "./" 有效。
          猜你喜欢
          • 2021-05-17
          • 2019-10-27
          • 1970-01-01
          • 2021-01-03
          • 2021-03-19
          • 2022-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多