Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果在dockerfile中使用CMD,Docker多阶段构建将失败_Java_Docker_Maven_Dockerfile_Docker Multi Stage Build - Fatal编程技术网

Java 如果在dockerfile中使用CMD,Docker多阶段构建将失败

Java 如果在dockerfile中使用CMD,Docker多阶段构建将失败,java,docker,maven,dockerfile,docker-multi-stage-build,Java,Docker,Maven,Dockerfile,Docker Multi Stage Build,Dockerfile: FROM maven:3.6.3-openjdk-8 as builder # Set the working directory. WORKDIR /usr/src/mymaven COPY ./ /usr/src/mymaven CMD [ "mvn" , "clean" , "install" ] FROM openjdk:8 COPY --from=builder /usr/src/mymaven/ta

Dockerfile:

FROM maven:3.6.3-openjdk-8 as builder
# Set the working directory.
WORKDIR /usr/src/mymaven
COPY ./ /usr/src/mymaven
CMD [ "mvn" , "clean" , "install" ]

FROM openjdk:8
COPY --from=builder /usr/src/mymaven/target /usr/src/myapp
WORKDIR /usr/src/myapp
CMD ["java", "-jar" , "Backend-0.0.1-SNAPSHOT.jar"]
上述docker生成失败,错误为: 目标文件夹不存在
下面的dockerfile工作正常:

FROM maven:3.6.3-openjdk-8 as builder
# Set the working directory.
WORKDIR /usr/src/mymaven
COPY ./ /usr/src/mymaven
RUN [ "mvn" , "clean" , "install" ]

FROM openjdk:8
COPY --from=builder /usr/src/mymaven/target /usr/src/myapp
WORKDIR /usr/src/myapp
CMD ["java", "-jar" , "Backend-0.0.1-SNAPSHOT.jar"]

只需将CMD更改为RUN,即可解决此问题。为什么会这样?我认为在间歇式容器中,cmd将执行,这将使两个命令等效正确吗?

在多级构建中,您可以复制前一步中的文件。每个步骤都被视为一个单独的私有映像(在多级构建的范围内)

CMD
指令但不会在生成时调用,它仅适用于运行时,如下所述:

CMD的主要用途是为执行命令提供默认值 容器

由于您当前正在生成结果图像,
CMD
从未执行,因此您会得到报告的错误

另一方面,
RUN
指令在构建时执行,使其结果可用于下一步。再次引用:

RUN指令将在新图层的顶部执行任何命令 查看当前图像并提交结果。由此产生的后果 图像将用于Dockerfile中的下一步

现在应该很清楚,与
CMD
指令相比,当使用
RUN
时,为什么多级构建会成功完成

你的困惑源于错误地认为以下是正确的:


我认为在间歇容器中,cmd将执行,这应该使两个命令等效,对吗


在多级生成中,可以复制上一步中的文件。每个步骤都被视为一个单独的私有映像(在多级构建的范围内)

CMD
指令但不会在生成时调用,它仅适用于运行时,如下所述:

CMD的主要用途是为执行命令提供默认值 容器

由于您当前正在生成结果图像,
CMD
从未执行,因此您会得到报告的错误

另一方面,
RUN
指令在构建时执行,使其结果可用于下一步。再次引用:

RUN指令将在新图层的顶部执行任何命令 查看当前图像并提交结果。由此产生的后果 图像将用于Dockerfile中的下一步

现在应该很清楚,与
CMD
指令相比,当使用
RUN
时,为什么多级构建会成功完成

你的困惑源于错误地认为以下是正确的:


我认为在间歇容器中,cmd将执行,这应该使两个命令等效,对吗


CMD
在生成时不运行任何操作。它只是在以后运行容器时设置一个默认命令。“我认为在间歇容器中,cmd将执行,这将使两个命令等效正确”您是否有它所说的链接?@Thilo没有来源只是我的假设
cmd
在构建时不运行任何东西。它只是在您稍后运行容器时设置一个默认命令。“我认为在间歇容器中,cmd将执行,这将使两个命令等效正确”您有任何这样的链接吗?@Thilo没有来源只是我的假设