Docker Compose 中的環境變數優先順序
當同一個環境變數在多個來源設定時,Docker Compose 會遵循優先順序規則來決定容器環境中該變數的值。
此頁面包含設定環境變數之各種方法的優先順序資訊。
優先順序 (從高到低) 如下:
- 使用 CLI 中的
docker compose run -e
設定。 - 使用
environment
或env_file
屬性設定,但值是從您的 殼層 或環境檔案插入的。(可以是您的預設.env
檔案,或是 CLI 中的--env-file
參數)。 - 僅使用 Compose 檔案中的
environment
屬性 設定。 - 使用 Compose 檔案中的
env_file
屬性。 - 在容器映像檔的 ENV 指令 中設定。
Dockerfile
中的任何ARG
或ENV
設定只有在 Docker Compose 沒有environment
、env_file
或run --env
設定時才會生效。
簡單範例
在以下範例中,同一個環境變數在 .env
檔案和 Compose 檔案的 environment
屬性中設定了不同的值。
$ cat ./webapp.env
NODE_ENV=test
$ cat compose.yml
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
值的環境。
「主機作業系統環境」和「.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
屬性,因此會設定該值。