如何在 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_passworddb_root_password,並提供了用於填充其值的file
  • 每個容器的部署意味著 Docker 在/run/secrets/<secret_name> 下建立一個臨時檔案系統掛載,其中包含它們特定的值。

注意

這裡演示的_FILE 環境變數是某些映象(包括 Docker 官方映象,例如 mysqlpostgres 使用的一種約定。

構建 Secrets

在以下示例中,npm_token 金鑰在構建時可用。它的值取自NPM_TOKEN 環境變數。

services:
  myapp:
    build:
      secrets:
        - npm_token
      context: .

secrets:
  npm_token:
    environment: NPM_TOKEN

資源