我正在传递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']
在一个构建阶段所做的更改不会影响另一个构建阶段。这包括持久化的映像文件系统、元数据(如当前用户或容器命令)或环境变量。
只有两个例外:
- 您可以显式地将文件从一个构建阶段
COPY --from
到另一个构建阶段(但不能使用其他设置或元数据)。 - 你可以在较早的阶段构建
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