docker-compose
的 env_file
關鍵字允許你指定一個或多個包含環境變數的檔案。
這些環境變數隨後可以在 docker-compose.yml
檔案中透過 ${VARIABLE}
的形式引用,或者在容器內部作為環境變數直接使用。
這對於保持配置的安全性和靈活性非常有用,尤其是當你需要避免在 docker-compose.yml
檔案中硬編碼敏感資訊(如資料庫密碼)時。
如何使用 env_file
1. 建立環境變數檔案:
首先,你需要建立一個或多個包含環境變數的檔案。這些檔案通常是純文字檔案,每行包含一個環境變數,格式為 KEY=value
。 例如,建立一個名為 .env
的檔案,內容如下:
DB_HOST=localhost DB_USER=myuser DB_PASS=mypassword
2. 在 docker-compose.yml
中引用環境變數檔案
然後,在 docker-compose.yml
檔案中,你可以透過 env_file
關鍵字指定一個或多個環境變數檔案。這可以在全域性級別(影響所有服務)或特定服務級別上完成。
a. 全域性級別:
version: '3' env_file: - .env services: web: image: myapp environment: - DB_NAME=myappdb
在這個例子中,.env
檔案中的環境變數對所有服務都是可用的。
b. 服務級別:
version: '3' services: web: image: myapp env_file: - .env.web environment: - DB_NAME=myappdb
在這個例子中,.env.web
檔案中的環境變數僅對 web
服務是可用的。
其中
.env.web
檔案中的環境變數僅對 web
服務可用,是因為 env_file
關鍵字被明確放置在了 web
服務的配置層級中,而不是因為檔名中的 .web
字尾。
使用 env_file 中的變數
在 docker-compose.yml
中使用環境變數
你可以在 docker-compose.yml
檔案中使用環境變數來配置服務。例如,你可以在 command
、environment
、image
等指令中引用它們。
version: '3' services: web: image: myapp:${APP_VERSION} environment: - DB_HOST=${DB_HOST} - DB_USER=${DB_USER} - DB_PASS=${DB_PASS} - DB_NAME=myappdb
注意:當 environment
指令和 env_file
同時使用時,environment
指令中指定的環境變數會覆蓋 env_file
中同名的環境變數。
在 env 檔案覆蓋的容器內使用環境變數
#在容器shell中直接列印就能顯示 ~ echo $DB_HOST localhost
package main #程式內使用 func main() { // 讀取環境變數 mysqlURL := os.Getenv("DB_HOST") }
注意事項
預設情況下,
docker-compose
會查詢與docker-compose.yml
檔案位於同一目錄下的.env
檔案(如果它存在的話),並自動載入該檔案中的環境變數。這意味著其實你不需要顯式地在docker-compose.yml
檔案中使用env_file
關鍵字來引用它(除非你還需要指定其他檔案)。當使用環境變數時,請確保不要將敏感資訊(如密碼)硬編碼在
docker-compose.yml
檔案中或版本控制的倉庫中。相反,應該使用環境變數檔案,並確保這些檔案不會被意外洩露。
---
docker-compose是否會自動載入.env檔案?.env.web 或 example.env 之類的會被自動載入嗎
Docker Compose 預設會自動載入專案根目錄下的 .env
檔案,並將其中定義的環境變數應用到服務配置中。然而,對於 .env.web
或 example.env
之類的檔案,Docker Compose 並不會自動載入它們,除非在 docker-compose.yml
檔案中顯式指定了這些檔案。
---
docker-compose中關鍵字env_file 關鍵字指定的檔案內容需要滿足什麼要求,kv值用冒號隔開行嗎?或者等號?
在 docker-compose.yml
檔案中,env_file
關鍵字用於指定一個或多個包含環境變數的檔案。這些檔案的內容應該遵循一定的格式要求,以便 Docker Compose 能夠正確地解析並應用這些環境變數。
檔案內容要求
格式:環境變數檔案通常是以簡單的鍵值對形式存在的,每行一個鍵值對,用於定義環境變數的名稱和值。
分隔符:鍵值對之間應該使用等號 (
=
) 來分隔,而不是冒號 (:
)。儘管在某些上下文中(如 shell 指令碼或某些配置檔案),冒號也可能用作分隔符,但在環境變數檔案中,等號是標準且被廣泛接受的分隔符。註釋:環境變數檔案通常不支援註釋(儘管這取決於具體的解析器,但大多數情況下,註釋行(以
#
開頭的行)會被忽略)。空行和空格:環境變數檔案中可以包含空行,這些行將被忽略。鍵值對中的鍵和值周圍可以包含空格,但這些空格通常會被包含在變數值中,除非在解析時進行了額外的處理(例如,透過 shell 的
export
命令或在 Docker Compose 中透過某些方式處理)。
示例
一個典型的環境變數檔案 .env.web
可能看起來像這樣:
# 這是一個註釋,將被忽略 DB_HOST=localhost DB_USER=root DB_PASS=secret # 注意:這裏的 DB_PORT 周圍有空格,這些空格將成為變數值的一部分 DB_PORT = 3306
然而,爲了避免潛在的問題,建議始終在鍵和值之間以及等號兩側使用最少的空格(或根本不使用空格):
DB_HOST=localhost DB_USER=root DB_PASS=secret DB_PORT=3306
在 docker-compose.yml
中使用 env_file
在 docker-compose.yml
檔案中,你可以這樣使用 env_file
關鍵字來指定環境變數檔案:
version: '3' services: web: image: my-web-app env_file: - .env - .env.web
在這個例子中,web
服務將載入 .env
和 .env.web
檔案中定義的環境變數。如果兩個檔案中都定義了相同的變數,.env.web
檔案中的值將覆蓋 .env
檔案中的值。