docker-compose.ymlのenvironmentに秘密鍵をそのまま複数行で書く

  • Docker
  • Docker Compose
  • YAML

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

複数行の値をenvironmentに渡したい

秘密鍵や証明書みたいに改行込みの値をenvironmentに渡そうとして、最初はエスケープしてワンライナーにしようとしてた。

結論

Docker ComposeのcomposeファイルはYAMLなので、YAMLのリテラルブロックスカラー(|や|-)がそのまま使える。改行をエスケープする必要はない。

environment:
SERVER_NAME: "example.com"
SSL_KEY: |-
-----BEGIN RSA PRIVATE KEY-----
(中略)
-----END RSA PRIVATE KEY-----

|と|-の違い

  • |:ブロックの最後に改行を1つ残す
  • |-:末尾の改行を削除する(strip)
  • |+:末尾の空行も含めて全部残す

証明書や鍵は末尾の改行がなくても動くことが多いので|-を使うことが多い。ただしアプリ側が末尾改行を必須にしてる場合もあるので、そこは動かして確認する必要がある。

インデントについて

ブロック内のインデントは揃えないといけない。揃ってないとYAMLのパースでエラーになる(実機で崩して試したわけではないので、そこは未確認)。

補足:直書きは避けたほうがいい

composeファイルに秘密鍵を直接書くと、Gitに入れたときにリークする。まず優先すべきなのは.env + env_file:。

docker-compose.yml
services:
app:
env_file:
- .env
# .env(Gitには入れない、.gitignoreに追加)
SERVER_NAME=example.com
SSL_KEY="-----BEGIN RSA PRIVATE KEY-----\n(中略)\n-----END RSA PRIVATE KEY-----"

.envは.gitignoreに入れておけばcomposeファイル自体はそのままGit管理できるし、環境ごとに.envを差し替えるだけで済むので運用がシンプルになる。

これでも足りない場合(Swarmを使っている、鍵のローテーションを自動化したいなど)は、Docker Secrets(secrets:セクション)や、鍵ファイルのパスだけ渡してアプリ側で読み込む方式(SSL_KEY_FILEのような名前にする)を検討する。今回はローカル検証用のダミー鍵で試しただけ。