如何在 Docker Compose 中使用金鑰
標籤
目錄
金鑰是任何型別的資料,例如密碼、證書或 API 金鑰,不應透過網路傳輸或以未加密形式儲存在 Dockerfile 或應用程式原始碼中。
Docker Compose 提供了一種無需使用環境變數儲存資訊即可使用金鑰的方法。如果您將密碼和 API 金鑰作為環境變數注入,則可能會無意中洩露資訊。服務只能在 Compose 檔案中services
頂級元素的secrets
屬性明確授權時才能訪問金鑰。環境變數通常對所有程序可用,並且可能難以跟蹤訪問許可權。它們還可能在除錯錯誤時在您不知情的情況下列印在日誌中。使用金鑰可以降低這些風險。
使用金鑰
將金鑰放入容器是一個兩步過程。首先,使用 Compose 檔案中的頂級金鑰元素 定義金鑰。接下來,更新服務定義以使用 金鑰屬性 引用它們需要的金鑰。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 使用的一種約定。
構建 Secrets
在以下示例中,npm_token
金鑰在構建時可用。它的值取自NPM_TOKEN
環境變數。
services:
myapp:
build:
secrets:
- npm_token
context: .
secrets:
npm_token:
environment: NPM_TOKEN