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

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

此頁面包含有關設定環境變數的每種方法的優先順序級別資訊。

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

  1. 使用 docker compose run -e 在 CLI 中設定.
  2. 使用 environmentenv_file 屬性設定,但值從您的 shell 或環境檔案進行插值。(無論是您的預設 .env 檔案,還是使用 --env-file 引數 在 CLI 中進行插值)。
  3. 僅使用 environment 屬性 在 Compose 檔案中設定。
  4. 在 Compose 檔案中使用 env_file 屬性
  5. 在容器映象中使用 ENV 指令 設定。如果 environmentenv_filerun --env 沒有 Docker Compose 條目,則 Dockerfile 中的任何 ARGENV 設定僅在沒有 Docker Compose 條目時才會評估。

簡單示例

在以下示例中,.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 代入值。

Host OS environment.env 檔案列僅用於說明目的。實際上,它們本身不會導致容器中的變數,而是在 environmentenv_file 屬性的配合下才會導致容器中的變數。

每行代表 VALUE 設定、代入或同時進行的上下文的組合。結果列指示每種情況下 VALUE 的最終值。

#docker compose runenvironment 屬性env_file 屬性映象 ENVHost OS 環境.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 標誌設定,該標誌設定為複製來自環境的值。Host OS 值優先,並複製到容器的環境中。

結果 7:docker compose run 命令具有 --env 標誌設定,該標誌設定為複製來自環境的值。.env 檔案中的值被選中以定義容器的環境。

結果 8:Compose 檔案中的 env_file 屬性設定為從本地環境複製 VALUE。Host OS 值優先,並複製到容器的環境中。

結果 9:Compose 檔案中的 env_file 屬性設定為從本地環境複製 VALUE.env 檔案中的值被選中以定義容器的環境。

結果 10:Compose 檔案中的 environment 屬性設定為從本地環境複製 VALUE。Host OS 值優先,並複製到容器的環境中。

結果 11:Compose 檔案中的 environment 屬性設定為從本地環境複製 VALUE.env 檔案中的值被選中以定義容器的環境。

結果 12:--env 標誌比 environmentenv_file 屬性具有更高的優先順序,因此設定為從本地環境複製 VALUE。Host OS 值優先,並複製到容器的環境中。

結果 13 到 15:--env 標誌比 environmentenv_file 屬性具有更高的優先順序,因此設定了值。