Java Docker多级ONBUILD未执行第一阶段ONBUILD命令

Java Docker多级ONBUILD未执行第一阶段ONBUILD命令,java,docker,maven,docker-multi-stage-build,Java,Docker,Maven,Docker Multi Stage Build,我正在尝试为Java项目创建一个多级ONBUILD映像,请参见下面的示例。在检查构建结果时,第一次迭代似乎只在最后阶段看到ONBUILD命令 FROM maven:3.6.3-jdk-11-slim AS build RUN mkdir /project WORKDIR /project ONBUILD COPY pom.xml /project ONBUILD RUN mvn dependency:go-offline --batch-mode ONBUILD COPY . /project

我正在尝试为Java项目创建一个多级ONBUILD映像,请参见下面的示例。在检查构建结果时,第一次迭代似乎只在最后阶段看到ONBUILD命令

FROM maven:3.6.3-jdk-11-slim AS build
RUN mkdir /project
WORKDIR /project
ONBUILD COPY pom.xml /project
ONBUILD RUN mvn dependency:go-offline --batch-mode
ONBUILD COPY . /project
ONBUILD RUN mvn package

FROM adoptopenjdk/openjdk11:jre-11.0.6_10-alpine
RUN mkdir /app
WORKDIR /app
ONBUILD COPY --from=build /project/target/*.jar /app/application.jar

CMD ["java", "-jar", "application.jar"]
我决定将阶段分割为两个图像,然后将它们组合到应用程序图像中

FROM maven:3.6.3-jdk-11-slim AS build
RUN mkdir /project
WORKDIR /project
ONBUILD COPY pom.xml /project
ONBUILD RUN mvn dependency:go-offline --batch-mode
ONBUILD COPY . /project
ONBUILD RUN mvn package
通过以下方式组合这两个图像后,检查这两个图像将显示正确的ONBUILD命令:

FROM maven-jdk-11-onbuild:latest as build

FROM jre-11-onbuild:latest
结果,它仅从第二个映像执行ONBUILD COPY命令

[+] Building 0.2s (6/6) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                   0.0s
 => => transferring dockerfile: 120B                                                                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                                                              0.0s
 => => transferring context: 34B                                                                                                                                               0.0s
 => [internal] load metadata for docker.io/library/jre-11:onbuild                                                                                                                                                                                                           0.0s
 => CACHED [build 1/1] FROM docker.io/library/maven-jdk-11:onbuild                                                                                                     0.0s
 => CACHED [stage-1 1/1] FROM docker.io/library/jre-11:onbuild                                                                                                                                                                                                              0.0s
 => ERROR [stage-1 2/1] COPY --from=build /app/target/*.jar /app/application.jar                                                                                               0.1s
------
 > [stage-1 2/1] COPY --from=build /app/target/*.jar /app/application.jar:
------
lstat /var/lib/docker/overlay2/daced0019dbfe2605e586b5607160adb3358c22054ae2762a0338b3681eddd33/merged/app/target: no such file or directory
看起来第一个阶段由于某种原因被缓存了。
是否可以将多阶段构建与ONBUILD逻辑结合起来?

这对我来说是一个很好的更新(Docker for MacOS)。

寻找官方文档!我在ONBUILD命令描述中看到了这一点:“在ONBUILD中添加或复制时要小心。如果新生成的上下文缺少要添加的资源,“ONBUILD”映像将灾难性地失败。如上所述,添加单独的标记可以通过允许Dockerfile作者做出选择来帮助缓解这一问题。”我完全避免使用
ONBUILD
,因为当最终图像被消费时,它会导致神秘的行为。不过,与多级构建中的所有其他内容一样,我希望只有最后阶段的内容和元数据才有意义,其他所有内容都将被忽略,除非它
复制到最终图像中。这是一个注释,而不是答案
[+] Building 0.2s (6/6) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                   0.0s
 => => transferring dockerfile: 120B                                                                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                                                              0.0s
 => => transferring context: 34B                                                                                                                                               0.0s
 => [internal] load metadata for docker.io/library/jre-11:onbuild                                                                                                                                                                                                           0.0s
 => CACHED [build 1/1] FROM docker.io/library/maven-jdk-11:onbuild                                                                                                     0.0s
 => CACHED [stage-1 1/1] FROM docker.io/library/jre-11:onbuild                                                                                                                                                                                                              0.0s
 => ERROR [stage-1 2/1] COPY --from=build /app/target/*.jar /app/application.jar                                                                                               0.1s
------
 > [stage-1 2/1] COPY --from=build /app/target/*.jar /app/application.jar:
------
lstat /var/lib/docker/overlay2/daced0019dbfe2605e586b5607160adb3358c22054ae2762a0338b3681eddd33/merged/app/target: no such file or directory