Java 如果在dockerfile中使用CMD,Docker多阶段构建将失败
Dockerfile: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
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没有来源只是我的假设