Docker Compose 中的環境變數優先順序
當在多個來源中設定了相同的環境變數時,Docker Compose 會遵循優先順序規則來確定容器環境中該變數的值。
此頁面包含有關設定環境變數的每種方法的優先順序級別資訊。
優先順序順序(從最高到最低)如下
- 使用
docker compose run -e
在 CLI 中設定. - 使用
environment
或env_file
屬性設定,但值從您的 shell 或環境檔案進行插值。(無論是您的預設.env
檔案,還是使用--env-file
引數 在 CLI 中進行插值)。 - 僅使用
environment
屬性 在 Compose 檔案中設定。 - 在 Compose 檔案中使用
env_file
屬性。 - 在容器映象中使用 ENV 指令 設定。如果
environment
、env_file
或run --env
沒有 Docker Compose 條目,則Dockerfile
中的任何ARG
或ENV
設定僅在沒有 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
檔案列僅用於說明目的。實際上,它們本身不會導致容器中的變數,而是在 environment
或 env_file
屬性的配合下才會導致容器中的變數。
每行代表 VALUE
設定、代入或同時進行的上下文的組合。結果列指示每種情況下 VALUE
的最終值。
# | docker compose run | environment 屬性 | env_file 屬性 | 映象 ENV | Host OS 環境 | .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
標誌設定,該標誌設定為複製來自環境的值。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
標誌比 environment
和 env_file
屬性具有更高的優先順序,因此設定為從本地環境複製 VALUE
。Host OS 值優先,並複製到容器的環境中。
結果 13 到 15:--env
標誌比 environment
和 env_file
屬性具有更高的優先順序,因此設定了值。