如何在 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 官方映像檔,例如 mysqlpostgres建置密鑰

在以下範例中,`npm_token` 密碼在建置時可用。其值取自 `NPM_TOKEN` 環境變數。

資源