

docker-compose.ymlのenvironmentに秘密鍵をそのまま複数行で書く
この記事は、構成と文章の整理に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:。
services: app: env_file: - .env# .env(Gitには入れない、.gitignoreに追加)SERVER_NAME=example.comSSL_KEY="-----BEGIN RSA PRIVATE KEY-----\n(中略)\n-----END RSA PRIVATE KEY-----".envは.gitignoreに入れておけばcomposeファイル自体はそのままGit管理できるし、環境ごとに.envを差し替えるだけで済むので運用がシンプルになる。
これでも足りない場合(Swarmを使っている、鍵のローテーションを自動化したいなど)は、Docker Secrets(secrets:セクション)や、鍵ファイルのパスだけ渡してアプリ側で読み込む方式(SSL_KEY_FILEのような名前にする)を検討する。今回はローカル検証用のダミー鍵で試しただけ。