YAMLからENV変換における数値の扱い
YAML数値型(整数、浮動小数点、8進数、16進数、infinityなどの特殊値)がENV文字列形式に変換される際の処理方法を学びます。
詳細な説明
YAMLは豊富な数値フォーマットセットをサポートしていますが、ENVファイルではすべてがプレーン文字列になります。これらの変換を理解することは、データの損失や誤解を避けるために不可欠です。
YAML数値型:
# 標準的な整数と浮動小数点
port: 8080
timeout: 30.5
negative: -1
zero: 0
# 8進数(ファイルパーミッションでよく使用)
file_mode_v1: 0755 # YAML 1.1 8進数 = 10進数 493
file_mode_v2: 0o755 # YAML 1.2 8進数 = 10進数 493
# 16進数
max_memory: 0xFF # 10進数 255
# 指数表記
threshold: 1.5e-3 # 0.0015
# 特殊値
max_connections: .inf # 無限大
undefined_ratio: .nan # 非数
ENVへの変換:
PORT=8080
TIMEOUT=30.5
NEGATIVE=-1
ZERO=0
FILE_MODE_V1=493
FILE_MODE_V2=493
MAX_MEMORY=255
THRESHOLD=0.0015
MAX_CONNECTIONS=Infinity
UNDEFINED_RATIO=NaN
重要な変換の問題:
8進数の展開。 YAMLは
0755を8進数として解釈し、10進数の493に変換します。リテラル文字列"0755"を意図していた場合(例:chmodのファイルパーミッション引数)、YAML内でクォートする必要があります:file_mode: "0755"。ENV出力ではFILE_MODE=0755となります。16進数の変換。
0xFFは255になります。16進数表現は失われます。16進数文字列が必要な場合はクォートします:"0xFF"。InfinityとNaN。 これらのYAML特殊値には標準的なENV表現がありません。通常、文字列
InfinityとNaNになり、使用するアプリケーションで明示的にパースする必要があります。指数表記。
1.5e-3はコンバーターにより0.0015に展開されるか、1.5e-3のまま保持される場合があります。どちらも有効な数値表現です。先頭のゼロ。 YAML 1.1で
007のような値は8進数(10進数7)であり、文字列"007"ではありません。YAML 1.2では007は整数7のまま(8進数ではない)です。リテラル形式が必要な場合は常にクォートしてください。
ベストプラクティス: 文字列表現が数値そのものよりも重要な場合(ファイルパーミッション、ゼロパディングされたID、16進カラーコード)、ENVに変換する前にYAML内で値を常にクォートしてください。
ユースケース
ファイルパーミッション(0755、0644)、16進数表記のメモリ制限、指数表記の閾値を含むYAML設定を、コンテナ化されたアプリケーションの起動スクリプト向けにENV形式に変換する場合。