在阅读config point of the 12 factor app之后,我决定使用环境变量覆盖包含默认值的配置文件。
我有3个Dockerfile
,一个用于API,一个用于前端,一个用于工作人员。我有一个docker-compose.yml
可以运行这3个服务以及一个数据库。
现在我想知道是否应该在Dockerfile
或docker-compose.yml
中定义环境变量?使用一个而不是另一个有什么区别?
答案 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
}。