将基本映像值传递给docker文件中的运行时映像



我正在传递Stage=sandbox作为docker参数,如下所示:

docker build --build-arg STAGE=$Stage -t $REPOSITORY_URI:latest .

现在在docker中,我在基本图像中获得Stage值,但在运行时图像中没有:

ARG environment_default=sbx
FROM docker.image.net/dotnet:latest AS base
ARG STAGE
RUN echo $STAGE --> Getting Value here as sandbox
ENV environment_default=$STAGE
RUN echo $environment_default
#all other code
FROM docker.image.net/dotnet:latest AS runtime
ARG environment_default
RUN echo $environment_default --> NOT Getting Value(sandbox) here; instead getting default value(sbx)

ENV ASPNETCORE_ENVIRONMENT=$environment_default
RUN echo $ASPNETCORE_ENVIRONMENT
#all other code
ENTRYPOINT ['dotnet','exec','MY.Web.dll']

在一个构建阶段所做的更改不会影响另一个构建阶段。这包括持久化的映像文件系统、元数据(如当前用户或容器命令)或环境变量。

只有两个例外:

  1. 您可以显式地将文件从一个构建阶段COPY --from到另一个构建阶段(但不能使用其他设置或元数据)。
  2. 你可以在较早的阶段构建FROM,它将从该阶段继承所有

在您的情况下,您在base阶段设置ENV变量,并期望它出现在runtime阶段;这根本不可能发生,也没有办法复制或传播它的价值。(正如你所展示的Dockerfile,如果你使用当前的BuildKit后端,它可能根本不会运行base图像,因为它是未使用的。)

您没有说明这个环境变量的实际用途,或者它的运行时值是否重要,但是最简单的方法是在需要它的每个阶段重复ENV语句,或者只是给ARG一个正确的匹配名称。由于您通常不会为不同的环境重新构建应用程序或映像,因此您也可以将其设置为固定值。

真正解决这个问题的唯一方法是将构建阶段专门用于创建环境变量。这只会在你的后期碰巧继承了相同的原始图像时才有效;在这种情况下,它确实存在,但是通常会有一个带有较大工具集和运行时映像的构建阶段,而没有编译器或其他(大型)工具。

FROM docker.image.net/dotnet:latest AS environment
ARG STAGE
ENV environment_default=$STAGE
FROM environment AS base
RUN echo $environment_default
FROM environment AS runtime
RUN echo $environment_default