切換語言為:簡體

docker-compose使用env檔案解析

  • 爱糖宝
  • 2024-07-28
  • 2098
  • 0
  • 0

docker-composeenv_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 檔案中使用環境變數來配置服務。例如,你可以在 commandenvironmentimage 等指令中引用它們。

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.webexample.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 檔案中的值。

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.