如何在 Docker Compose 中使用密碼
目錄
密碼是任何不應透過網路傳輸或以未加密方式儲存在 Dockerfile 或應用程式原始碼中的資料,例如密碼、憑證或 API 金鑰。
Docker Compose 提供一種方法,讓您無需使用環境變數來儲存資訊即可使用密碼。如果您將密碼和 API 金鑰作為環境變數插入,則可能會意外洩露資訊。服務只能在 `services` 頂層元素中的 `secrets` 屬性明確授予時才能存取密碼。
環境變數通常可供所有流程使用,而且可能難以追蹤存取。在您不知情的情況下,它們也可能在除錯錯誤時列印在記錄中。使用密碼可以降低這些風險。
使用密碼
將密碼放入容器是一個兩步驟的流程。首先,使用 Compose 檔案中的頂層 secrets 元素定義密碼。接下來,更新您的服務定義,以使用 secrets 屬性參考它們所需的密碼。Compose 會根據每個服務授予密碼存取權。
與其他方法不同,這允許透過標準檔案系統權限在服務容器內進行精細的存取控制。
範例
簡單
在以下範例中,前端服務被授予存取 `my_secret` 密碼的權限。在容器中,`/run/secrets/my_secret` 設定為檔案 `./my_secret.txt` 的內容。
services:
myapp:
image: myapp:latest
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret.txt
進階
services:
db:
image: mysql:latest
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_root_password
- db_password
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
secrets:
db_password:
file: db_password.txt
db_root_password:
file: db_root_password.txt
volumes:
db_data:
在上述進階範例中
- 每個服務下的 `secrets` 屬性定義您要插入特定容器的密碼。
- 頂層 `secrets` 區段定義變數 `db_password` 和 `db_root_password`,並提供填入其值的 `file`。
- 每個容器的部署表示 Docker 會在 `/run/secrets/<secret_name>` 下建立一個臨時檔案系統掛載,並使用其特定值。
注意
此處示範的 `_FILE` 環境變數是某些映像檔使用的慣例,包括 Docker 官方映像檔,例如 mysql 和 postgres