🐋
Dockerで別環境変数を元にCIとローカル環境で別変数を与える
始めに
小ネタ。
CI環境を想定して環境変数でCI=TRUE
と設定されていれば、AAA
と設定して、ローカル環境を想定してCI
環境変数が設定されていなければBBB
と設定する。
このような可能な限りCI環境としてはCI=TRUE
だけ管理して、具体的にはcompose.yml
内部で閉じるような書き方をすることで管理コストを減らそうとしていました。
このようにする書き方を知ったのでブログにします。
環境
- Docker Engine
- 27.4.1
ゴール
環境変数でCI
を定義して次のように書けば、CI
という環境変数を元にAAA
やBBB
の環境変数を分岐できます。
export CI=
environment:
ENV_TEST: ${CI+AAA}${CI-BBB}
説明
今回大事なのは次の構文です。
- ${VAR+replacement}
-
VAR
が設定されていればreplacement
を設定して他の場合は空文字列になります
-
- ${VAR-default}
-
VAR
が設定されていればVAR
を設定して他の場合はdefault
になります
-
似たような構文ですが、次の書き方は少し挙動が変わるので注意しましょう。
- ${VAR:+replacement}
- ${VAR:-replacement}
-
VAR
が設定されている かつ空文字列
ではない場合、上と同じ挙動をします
-
他の詳しい書き方を知りたい場合は、docker公式設定を読んでください。
ソースコード
なし。
終わりに
地味に:
の有無で挙動が変わることに気付かずに苦労しました。環境変数に空文字列を入れることは思いついていたのですが、:
を付けてるとうまく動かず…。また、構文が似ているためか、ChatGPT
も適切な回答にならなかったため混乱しました。
ちなみに、具体的な使用例としては、DockerのDBはデータを残したいのでtmpfs
を設定せず、CI環境はテストが高速に回るようにtmpfs
を設定したい、という要望でした。
db:
image: mysql:8.0.23
volumes:
- db:/var/lib/mysql
tmpfs:
- ${CI+/tmp/mysql_tmpfs:exec,size=4G}${CI-}
shm_size: ${CI+4gb}${CI-64mb}
他で使えるパターンがありそうなら教えていただけますと幸いです。もっと便利な構文を覚えて開発者体験をよくしていきたいです。
Discussion