[英]Docker environment variable not available in RUN command
升级到 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 命令的一部分时它会起作用?
您正在使用多阶段构建。
您的 ARG 和 ENV 属于base
阶段。 并且您没有在node-build
构建阶段使用base
阶段。
这意味着node-build
没有node_build_env
值。 因此,以下行创建一个空的test.txt
文件。
RUN echo $node_build_env > test.txt
但是,您的final
阶段使用base
阶段。 这意味着它可以访问node_build_env
变量。 因此,在使用docker build -t testargs:test .
图像之后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 ./
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.