Docker 环境变量在 RUN 命令中不可用

时间:2021-07-03 02:13:24

标签: docker dockerfile

升级到 Docker 版本 20.10.7 后,我在 Docker 中遇到了 ARG 和 ENV 问题,在 Windows 10 上构建 f0df350。

我已经制作了 dockerfile 来显示问题:

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base

ARG node_build=production
ENV node_build_env=${node_build}

FROM node:12.18.3 AS node-build
WORKDIR /root
RUN echo $node_build_env > test.txt

FROM base AS final
WORKDIR /app

COPY --from=node-build /root/test.txt ./

我的目标是可以设置一个 ARG,然后将其设置为容器内的环境变量,如果没有设置,则它具有默认值。

在此 Dockerfile 中,我尝试将环境变量 node_build_env 写入文本文件,然后将其复制到最后一层。但问题是文件是空的。

要重新创建这些是我正在使用的命令:

docker build -t testargs:test .

docker run -it --rm testargs:test /bin/bash

cat test.txt

文件是空的。但是,如果我运行:

docker build -t testargs:test . --target node-build

然后手动运行命令:

echo $node_build_env > test.txt

它起作用了,值 production 被写入文件。

为什么当我手动执行它而不是作为 RUN 命令的一部分时它会起作用?

1 个答案:

答案 0 :(得分:1)

您正在使用多阶段构建。

您的 ARG 和 ENV 属于 base 阶段。而且您没有在 base 构建阶段使用 node-build 阶段。

这意味着 node_build_env 中没有 node-build 值。因此,以下行创建一个空的 test.txt 文件。

RUN echo $node_build_env > test.txt

但是您的 final 阶段使用 base 阶段。这意味着它可以访问 node_build_env 变量。因此,在使用 docker build -t testargs:test . 构建映像后,打开与该容器的交互式会话并尝试执行以下命令,

echo $node_build_env

您将看到 production 将在终端中打印出来。

我相信这会帮助您解决问题。干杯? !!!

编辑:

这是工作版本:

ARG node_build=production

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base

FROM node:12.18.3 AS node-build

ARG node_build
ENV node_build_env=$node_build

WORKDIR /root
RUN echo $node_build_env > test.txt

FROM base AS final
WORKDIR /app

COPY --from=node-build /root/test.txt ./