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 variablesdb_password
anddb_root_password
and provides thefile
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