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

Mic*_* B. 4 environment-variables 12factor docker dockerfile docker-compose

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

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

现在我想知道是否应该在Dockerfiles 或docker-compose.yml? 使用一个而不是另一个有什么区别?

atl*_*ine 8

看到这个

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

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

区别在于:

定义 in 的环境变量Dockerfile不仅会在 中使用docker build,还会持久化到容器中。这意味着如果您没有设置-ewhen docker run,它仍然具有与Dockerfile.

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

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

Dockerfile

FROM alpine
ENV http_proxy http://123
Run Code Online (Sandbox Code Playgroud)

docker-compose.yaml:

app:
  environment:
    - http_proxy=http://123
Run Code Online (Sandbox Code Playgroud)

如果在 中定义环境变量Dockerfile,则使用此映像的所有容器也将具有http_proxyas http://123。但实际情况可能在你构建镜像的时候,就需要这个代理。但是,容器可能由其他人运行,可能不需要这个代理,或者只有另一个 http_proxy,所以他们必须删除http_proxyin 入口点或更改为docker-compose.yaml.

如果你在里面定义了环境变量docker-compose.yaml,那么用户在做的时候就可以选择自己的http_proxy docker-compose uphttp_proxy如果用户没有配置它就不会设置docker-compose.yaml

  • 谢谢,所以我可以在 Dockerfile 中定义它,如果需要的话,如果我理解正确的话,可以在 docker-compose.yml 中覆盖它 (2认同)
  • 是的,在`Dockerfile`中定义不仅会影响`docker build`,还会影响`docker run`,在`docker-compose`中定义可以覆盖`docker run`。 (2认同)