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

时间:2019-08-12 00:37:18

标签: docker docker-compose environment-variables dockerfile 12factor

在阅读config point of the 12 factor app之后,我决定使用环境变量覆盖包含默认值的配置文件。

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

现在我想知道是否应该在Dockerfiledocker-compose.yml中定义环境变量?使用一个而不是另一个有什么区别?

1 个答案:

答案 0 :(得分:1)

请参见this

  

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

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

区别在于:

Dockerfile中定义的环境变量不仅将在docker build中使用,而且还将持久存在于容器中。这意味着,如果在-e时未设置docker run,它将仍然具有与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,因此他们必须在入口点中删除http_proxy或仅在docker-compose.yaml中更改为另一个值。

如果您在docker-compose.yaml中定义环境变量,则用户在执行docker-compose up时只能选择自己的http_proxy,如果用户未配置{{1},则不会设置http_proxy }。