gpt4 book ai didi

java - 如果我们在 dockerfile 中使用 CMD,Docker 多阶段构建会失败

转载 作者:行者123 更新时间:2023-12-04 16:39:50 24 4
gpt4 key购买 nike

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 将执行这应该使两个命令等效,对吗?

最佳答案

在多阶段构建中,您可以从上一步复制文件。每一步都被视为一个单独的、私有(private)的 图片 (在多阶段构建的范围内)。CMD然而,指令不会在构建时调用,它只适用于运行时,如 official docs 中明确说明的那样:

The main purpose of a CMD is to provide defaults for an executingcontainer.


由于您当前正在构建结果图像, CMD永远不会执行,因此您会收到您报告的错误。
另一方面, RUN指令在构建期间执行,使其结果可用于下一步。再次引用自 docs :

The RUN instruction will execute any commands in a new layer on top ofthe current image and commit the results. The resulting committedimage will be used for the next step in the Dockerfile.


现在应该清楚为什么在 RUN 时多阶段构建成功完成。用于对比 CMD操作说明。
您的困惑始于错误地假设以下内容是正确的:

I thought in the intermittent container, the cmd would execute which should make both the commands equivalent right?

关于java - 如果我们在 dockerfile 中使用 CMD,Docker 多阶段构建会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62994046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com