阅读完12因素应用程序的配置点后,我决定使用环境变量覆盖包含默认值的配置文件。
我有3个Dockerfile
,一个用于API,一个用于前端,一个用于工作程序。我有一个docker-compose.yml
来运行这3个服务以及一个数据库。
现在我想知道是否应该在Dockerfile
或docker-compose.yml
中定义环境变量?两者之间使用的区别是什么?
阅读完12因素应用程序的配置点后,我决定使用环境变量覆盖包含默认值的配置文件。
我有3个Dockerfile
,一个用于API,一个用于前端,一个用于工作程序。我有一个docker-compose.yml
来运行这3个服务以及一个数据库。
现在我想知道是否应该在Dockerfile
或docker-compose.yml
中定义环境变量?两者之间使用的区别是什么?
请参考此文档:
您可以使用“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
。
Dockerfile
中定义不仅会影响docker build
,还会影响docker run
,而在docker-compose
中定义可以覆盖docker run
。 - atline