Docker Compose における Secrets の利用

Secrets というのは、パスワード、証明書、API キーといった種類のデータを扱うものであり、ネットワークを介して送信することが不適切であったり、Dockerfile 内やアプリケーションソースコード内に暗号化せずにそのまま保存することが不適切であるような、あらゆるデータを指します。

Docker Compose では機密情報を保存する先として環境変数を用いることなく、別の方法を提供しています。 パスワードや API キーを環境変数に設定すると、意図しない情報漏洩のリスクにさらされるからです。 サービスが機密情報にアクセスできるのは、トップレベルの services 内において secrets 属性によって明示的に許可された場合のみです。

環境変数は場合によっては全プロセスからの利用が可能であるため、アクセスをすべて追跡することは困難です。 また感知していないところで、エラーデバッグを行う際に出力されてしまうかもしれません。 Secrets を利用すれば、こういったリスクは軽減されます。

Secrets の利用

Getting a secret into a container is a two-step process. First, define the secret using the top-level secrets element in your Compose file. Next, update your service definitions to reference the secrets they require with the secrets attribute. Compose grants access to secrets on a per-service basis.

Unlike the other methods, this permits granular access control within a service container via standard filesystem permissions.

利用例

Simple

In the following example, the frontend service is given access to the my_secret secret. In the container, /run/secrets/my_secret is set to the contents of the file ./my_secret.txt.

services:
  myapp:
    image: myapp:latest
    secrets:
      - my_secret
secrets:
  my_secret:
    file: ./my_secret.txt

Advanced

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:

In the advanced example above:

  • The secrets attribute under each service defines the secrets you want to inject into the specific container.
  • The top-level secrets section defines the variables db_password and db_root_password and provides the file that populates their values.
  • The deployment of each container means Docker creates a temporary filesystem mount under /run/secrets/<secret_name> with their specific values.

メモ

The _FILE environment variables demonstrated here are a convention used by some images, including Docker Official Images like mysql and postgres.

Build secrets

In the following example, the npm_token secret is made available at build time. Its value is taken from the NPM_TOKEN environment variable.

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

secrets:
  npm_token:
    environment: NPM_TOKEN

リソース