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

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

本頁解釋了當環境變數在多個位置定義時,Docker Compose 如何確定其最終值。

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

  1. 使用 CLI 中的 docker compose run -e 設定。
  2. 使用 environmentenv_file 屬性設定,但其值是從您的 shell 或環境變數檔案(可以是您的預設 .env 檔案,或透過 CLI 中的 --env-file 引數)中插值得到的。
  3. 僅使用 Compose 檔案中的 environment 屬性設定。
  4. 使用 Compose 檔案中的 env_file 屬性設定。
  5. 在容器映象的 ENV 指令中設定。Dockerfile 中的任何 ARGENV 設定僅在 Compose 檔案中沒有 environmentenv_filerun --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 檔案僅用於說明目的。實際上,它們本身並不會在容器中產生變數,而是與 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 屬性更高的優先順序,因此設定了值。

後續步驟