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

在Dockerfile或docker compose中定义环境变量?,docker,docker-compose,environment-variables,dockerfile,12factor,Docker,Docker Compose,Environment Variables,Dockerfile,12factor,在阅读之后,我决定用环境变量覆盖包含默认值的配置文件 我有3个Dockerfiles,一个用于API,一个用于前端,一个用于工人。我有一个docker compose.yml来运行这3个服务和一个数据库 现在我想知道是应该在Dockerfiles还是dockercompose.yml中定义环境变量?使用一个与另一个有什么区别?请参阅: 您可以使用“environment”键在服务容器中设置环境变量,就像docker run-e VARIABLE=VALUE一样 此外,还可以在dockerfile

在阅读之后,我决定用环境变量覆盖包含默认值的配置文件

我有3个
Dockerfile
s,一个用于API,一个用于前端,一个用于工人。我有一个
docker compose.yml
来运行这3个服务和一个数据库

现在我想知道是应该在
Dockerfile
s还是
dockercompose.yml
中定义环境变量?使用一个与另一个有什么区别?

请参阅:

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

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

区别在于:

app:
  environment:
    - http_proxy=http://123
Dockerfile
中的环境变量define不仅将在
docker build
中使用,还将保存到容器中。这意味着,如果在
docker运行时未设置
-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\u代理
设置为
http://123
。但实际情况可能是,当你构建图像时,你需要这个代理。但是,其他人运行的容器可能不需要此代理,或者只是有另一个http_代理,因此他们必须删除entrypoint中的
http_代理
,或者只是在
docker compose.yaml中更改为另一个值


如果您在
docker compose.yaml
中定义了环境变量,那么用户可以在执行
docker compose时选择自己的http_代理,
http\u proxy
如果用户未配置它,则不会设置
docker compose.yaml

谢谢,因此我可以在Dockerfile中定义它,如果需要,它可以在docker-compose.yml中重写。如果我理解正确,是的,在
Dockerfile
中定义不仅会影响
docker构建
,还会影响
docker运行
,在
docker compose
中定义可以覆盖
docker run