在Dockerfile或docker-compose中定义环境变量?

11

阅读完12因素应用程序的配置点后,我决定使用环境变量覆盖包含默认值的配置文件。

我有3个Dockerfile,一个用于API,一个用于前端,一个用于工作程序。我有一个docker-compose.yml来运行这3个服务以及一个数据库。

现在我想知道是否应该在Dockerfiledocker-compose.yml中定义环境变量?两者之间使用的区别是什么?

1个回答

17

请参考此文档:

您可以使用“environment”键在服务的容器中设置环境变量,就像使用docker run -e VARIABLE=VALUE ...一样。

此外,您还可以在Dockerfile中使用ENV来定义环境变量。

区别在于:

在Dockerfile中定义的环境变量不仅在docker build时使用,而且还会持久存在于容器中。这意味着,如果您在docker run时没有设置“-e”,它仍将具有与Dockerfile中定义的环境变量相同的环境变量。

而在docker-compose.yaml中定义的环境变量仅用于docker run。

也许下一个示例可以让您更清楚地理解:

Dockerfile:

FROM alpine
ENV http_proxy http://123

docker-compose.yaml:

app:
  environment:
    - http_proxy=http://123
如果您在Dockerfile中定义环境变量,所有使用该镜像的容器也将具有http_proxy作为http://123。但实际情况可能是,在构建镜像时需要使用此代理。但是,容器可能由其他人运行,他们可能不需要此代理或者只有另一个http_proxy,因此他们必须在entrypoint中删除http_proxy或在docker-compose.yaml中将其更改为另一个值。
如果您在docker-compose.yaml中定义环境变量,则用户只需在执行docker-compose up时选择自己的http_proxy,如果用户没有在docker-compose.yaml中配置它,则不会设置http_proxy

2
谢谢,那么我可以在 Dockerfile 中定义它,如果需要的话可以在 docker-compose.yml 中进行覆盖,如果我理解得正确的话。 - Mickael B.
2
是的,在Dockerfile中定义不仅会影响docker build,还会影响docker run,而在docker-compose中定义可以覆盖docker run - atline
1
迈克尔,你的两行长句应该是正确答案。 - kukelia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接