複数行YAMLの値のENV変換
YAML複数行文字列(リテラルブロックとフォールドブロック)をENV形式に変換する際の処理方法を学びます。エスケープ戦略、クォートルール、改行の保持を解説します。
Advanced Patterns
詳細な説明
複数行の値は、YAML-to-ENV変換で最もトリッキーな側面の一つです。YAMLはリテラル(|)とフォールド(>)ブロックスカラーによるエレガントな複数行文字列フォーマットをサポートしていますが、ENVファイルは行指向で、各行が別の変数となります。
複数行の値を持つYAML:
ssl_cert: |
-----BEGIN CERTIFICATE-----
MIIBxTCCAWugAwIBAgIJALP2kEZ0gN3vMA
oGCCqGSM49BAMCMDkxCzAJBgNVBAYTAlVT
-----END CERTIFICATE-----
welcome_message: >
Welcome to our application.
Please read the documentation
before getting started.
query: |
SELECT u.name, u.email
FROM users u
WHERE u.active = true
ORDER BY u.created_at DESC;
ENV変換戦略1:ダブルクォート内のエスケープ改行
SSL_CERT="-----BEGIN CERTIFICATE-----\nMIIBxTCCAWugAwIBAgIJALP2kEZ0gN3vMA\noGCCqGSM49BAMCMDkxCzAJBgNVBAYTAlVT\n-----END CERTIFICATE-----"
WELCOME_MESSAGE="Welcome to our application. Please read the documentation before getting started."
QUERY="SELECT u.name, u.email\nFROM users u\nWHERE u.active = true\nORDER BY u.created_at DESC;"
ENV変換戦略2:実際の改行を含むシングルクォート
SSL_CERT='-----BEGIN CERTIFICATE-----
MIIBxTCCAWugAwIBAgIJALP2kEZ0gN3vMA
oGCCqGSM49BAMCMDkxCzAJBgNVBAYTAlVT
-----END CERTIFICATE-----'
各YAMLブロックスタイルが出力に与える影響:
リテラルブロック(
|) はすべての改行を保持します。各改行はENV値で\nになります。これは証明書、SSHキー、SQLクエリなど、改行が重要な場合に不可欠です。フォールドブロック(
>) は行をスペースで結合し、単一行の値を生成します。結果が自然に単一行になるため、ENV変換はよりシンプルです。チョンピング修飾子(
|-、|+、>-、>+)は末尾の改行を制御します。|-は最後の改行を除去します(通常はENV値で望ましい動作)。|+はすべての末尾改行を保持します。
互換性の懸念:
- Docker/docker-compose はダブルクォート内のエスケープ改行による複数行ENV値をサポートします。
- systemd の環境ファイルは複数行の値を全くサポートしません。
- dotenvライブラリ は異なります:Node.jsのdotenvはダブルクォート内の複数行をサポート、Python dotenvは両方のクォートスタイルでサポートします。
- シェルの
exportはBashでリテラル\nを含む$'...'構文をサポートしますが、すべてのシェルではありません。
推奨: 最大限の移植性のために、ダブルクォートで囲まれた値内でエスケープされた\nを使用してください。証明書やキーの場合は、値全体をBase64エンコードすることも検討してください。
ユースケース
YAMLベースのシークレット管理システムから変換して、DockerコンテナにSSL証明書、SSH秘密鍵、複数行SQLクエリを環境変数として格納する場合。