如何在Dockerfile中区分构建和运行?

如何在Dockerfile中区分构建和运行?,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我需要在构建容器期间设置一个代理环境变量。但在容器运行时,不能设置代理环境变量 我在Dockerfile中使用了ENV命令来设置变量。但这会在容器的构建和运行期间设置变量。据我所知,Dockerfile不支持unset for ENV命令 如何为生成而不是运行指定环境?为什么不将变量设置为空或空?它仍然存在,但没有一个值可以在运行时解释您需要使用的是未在映像中持久化的build arg。文档部分)准确描述了您想要的内容: 您可以在Dockerfile中使用ENV指令来定义变量 价值观这些值将保留

我需要在构建容器期间设置一个代理环境变量。但在容器运行时,不能设置代理环境变量

我在Dockerfile中使用了ENV命令来设置变量。但这会在容器的构建和运行期间设置变量。据我所知,Dockerfile不支持unset for ENV命令


如何为生成而不是运行指定环境?

为什么不将变量设置为空或空?它仍然存在,但没有一个值可以在运行时解释

您需要使用的是未在映像中持久化的build arg。文档部分)准确描述了您想要的内容:

您可以在Dockerfile中使用ENV指令来定义变量 价值观这些值将保留在生成的映像中。然而,经常 坚持不是你想要的。用户希望指定变量 根据构建映像的主机的不同而有所不同

一个很好的例子是http_代理或用于拉取的源版本 中间文件。ARG指令允许Dockerfile作者定义 用户可以在生成时使用--build arg标志设置的值:



如上所示,
hello
仅在构建时显示为一个env变量。它没有保留在图像中,因此它不会显示在
docker run

ARG
是否设置了环境变量?@ceving我之前的评论有误导性。有一个env变量在构建时存在,但在运行容器时不存在。用一个例子更新了答案。Docker文档很模糊。简单的一句话,即ARG还设置了一个环境变量,将使Docker文档更加清晰。本页对此进行了很好的解释:
FROM alpine

ARG hello
RUN env # This will output hello=world

CMD env # When running the container, there is not env variable "hello"
docker build --build-arg hello=world -t test . # This will output hello=world env variable
docker run test # There is no env variable "hello"