Docker Compose 中環境變數的優先順序
當在多個源中設定相同的環境變數時,Docker Compose 遵循優先順序規則來確定該變數在容器環境中的值。
本頁解釋了當環境變數在多個位置定義時,Docker Compose 如何確定其最終值。
優先順序順序(從高到低)如下:
- 使用 CLI 中的
docker compose run -e
設定。 - 使用
environment
或env_file
屬性設定,但其值是從您的 shell 或環境變數檔案(可以是您的預設.env
檔案,或透過 CLI 中的--env-file
引數)中插值得到的。 - 僅使用 Compose 檔案中的
environment
屬性設定。 - 使用 Compose 檔案中的
env_file
屬性設定。 - 在容器映象的 ENV 指令中設定。Dockerfile 中的任何
ARG
或ENV
設定僅在 Compose 檔案中沒有environment
、env_file
或run --env
條目時才有效。
簡單示例
在以下示例中,.env
檔案中與 Compose 檔案中 environment
屬性定義了相同的環境變數,但值不同。
$ cat ./webapp.env
NODE_ENV=test
$ cat compose.yaml
services:
webapp:
image: 'webapp'
env_file:
- ./webapp.env
environment:
- NODE_ENV=production
使用 environment
屬性定義的環境變數具有更高的優先順序。
$ docker compose run webapp env | grep NODE_ENV
NODE_ENV=production
高階示例
下表以 VALUE
(一個定義映象版本的環境變數)為例。
表格的工作原理
每列代表您可以設定值或為 VALUE
替換值的上下文。
列 Host OS environment
和 .env
檔案僅用於說明目的。實際上,它們本身並不會在容器中產生變數,而是與 environment
或 env_file
屬性結合使用。
每行代表 VALUE
被設定、替換或兩者兼有的上下文組合。結果列表示每種場景下 VALUE
的最終值。
# | docker compose run | environment 屬性 | env_file 屬性 | 映象 ENV | 主機作業系統 環境 | .env 檔案 | 結果 |
---|---|---|---|---|---|---|---|
1 | - | - | - | - | VALUE=1.4 | VALUE=1.3 | - |
2 | - | - | VALUE=1.6 | VALUE=1.5 | VALUE=1.4 | - | VALUE=1.6 |
3 | - | VALUE=1.7 | - | VALUE=1.5 | VALUE=1.4 | - | VALUE=1.7 |
4 | - | - | - | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.5 |
5 | --env VALUE=1.8 | - | - | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.8 |
6 | --env VALUE | - | - | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.4 |
7 | --env VALUE | - | - | VALUE=1.5 | - | VALUE=1.3 | VALUE=1.3 |
8 | - | - | VALUE | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.4 |
9 | - | - | VALUE | VALUE=1.5 | - | VALUE=1.3 | VALUE=1.3 |
10 | - | VALUE | - | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.4 |
11 | - | VALUE | - | VALUE=1.5 | - | VALUE=1.3 | VALUE=1.3 |
12 | --env VALUE | VALUE=1.7 | - | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.4 |
13 | --env VALUE=1.8 | VALUE=1.7 | - | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.8 |
14 | --env VALUE=1.8 | - | VALUE=1.6 | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.8 |
15 | --env VALUE=1.8 | VALUE=1.7 | VALUE=1.6 | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.8 |
理解優先順序結果
結果 1:本地環境具有優先順序,但 Compose 檔案未設定為在容器內部複製此變數,因此未設定此類變數。
結果 2:Compose 檔案中的 env_file
屬性為 VALUE
定義了顯式值,因此容器環境也相應設定。
結果 3:Compose 檔案中的 environment
屬性為 VALUE
定義了顯式值,因此容器環境也相應設定。
結果 4:映象的 ENV
指令聲明瞭變數 VALUE
,由於 Compose 檔案未設定為覆蓋此值,因此此變數由映象定義。
結果 5:docker compose run
命令設定了帶有顯式值的 --env
標誌,並覆蓋了映象設定的值。
結果 6:docker compose run
命令設定了 --env
標誌以複製環境中的值。主機作業系統值具有優先順序並複製到容器的環境中。
結果 7:docker compose run
命令設定了 --env
標誌以複製環境中的值。從 .env
檔案中選擇的值用於定義容器的環境。
結果 8:Compose 檔案中的 env_file
屬性設定為從本地環境複製 VALUE
。主機作業系統值具有優先順序並複製到容器的環境中。
結果 9:Compose 檔案中的 env_file
屬性設定為從本地環境複製 VALUE
。從 .env
檔案中選擇的值用於定義容器的環境。
結果 10:Compose 檔案中的 environment
屬性設定為從本地環境複製 VALUE
。主機作業系統值具有優先順序並複製到容器的環境中。
結果 11:Compose 檔案中的 environment
屬性設定為從本地環境複製 VALUE
。從 .env
檔案中選擇的值用於定義容器的環境。
結果 12:--env
標誌具有比 environment
和 env_file
屬性更高的優先順序,並設定為從本地環境複製 VALUE
。主機作業系統值具有優先順序並複製到容器的環境中。
結果 13 到 15:--env
標誌具有比 environment
和 env_file
屬性更高的優先順序,因此設定了值。