升级到 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 命令的一部分时它会起作用?
答案 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 ./