Docker Compose 中的環境變數優先順序

當同一個環境變數在多個來源設定時,Docker Compose 會遵循優先順序規則來決定容器環境中該變數的值。

此頁面包含設定環境變數之各種方法的優先順序資訊。

優先順序 (從高到低) 如下:

  1. 使用 CLI 中的 docker compose run -e 設定。
  2. 使用 environmentenv_file 屬性設定,但值是從您的 殼層 或環境檔案插入的。(可以是您的預設 .env 檔案,或是 CLI 中的 --env-file 參數)。
  3. 僅使用 Compose 檔案中的 environment 屬性 設定。
  4. 使用 Compose 檔案中的 env_file 屬性
  5. 在容器映像檔的 ENV 指令 中設定。 Dockerfile 中的任何 ARGENV 設定只有在 Docker Compose 沒有 environmentenv_filerun --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 檔案」這兩個欄位僅供說明之用。實際上,它們本身並不會在容器中產生變數,而是與 environmentenv_file 屬性一起使用才會產生變數。

每一列代表設定、替換或同時設定和替換 VALUE 的環境組合。「結果」欄位顯示每種情況下 VALUE 的最終值。

#docker compose runenvironment 屬性env_file 屬性映像檔 ENV主機作業系統環境.env 檔案結果
1----VALUE=1.4VALUE=1.3-
2--VALUE=1.6VALUE=1.5VALUE=1.4-VALUE=1.6
3-VALUE=1.7-VALUE=1.5VALUE=1.4-VALUE=1.7
4---VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.5
5--env VALUE=1.8--VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.8
6--env VALUE--VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.4
7--env VALUE--VALUE=1.5-VALUE=1.3VALUE=1.3
8--VALUEVALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.4
9--VALUEVALUE=1.5-VALUE=1.3VALUE=1.3
10-VALUE-VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.4
11-VALUE-VALUE=1.5-VALUE=1.3VALUE=1.3
12--env VALUEVALUE=1.7-VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.4
13--env VALUE=1.8VALUE=1.7-VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.8
14--env VALUE=1.8-VALUE=1.6VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.8
15--env VALUE=1.8VALUE=1.7VALUE=1.6VALUE=1.5VALUE=1.4VALUE=1.3VALUE=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 旗標的優先順序高於 environmentenv_file 屬性,並設定為複製本地環境中的 VALUE。主機作業系統的值優先,並複製到容器的環境中。

結果 13 至 15:--env 旗標的優先順序高於 environmentenv_file 屬性,因此會設定該值。