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 屬性具有更高的優先順序,因此設定了值。