🐋

Dockerで別環境変数を元にCIとローカル環境で別変数を与える

に公開

始めに

小ネタ。


CI環境を想定して環境変数でCI=TRUEと設定されていれば、AAAと設定して、ローカル環境を想定してCI環境変数が設定されていなければBBBと設定する。

このような可能な限りCI環境としてはCI=TRUEだけ管理して、具体的にはcompose.yml内部で閉じるような書き方をすることで管理コストを減らそうとしていました。

このようにする書き方を知ったのでブログにします。

環境

  • Docker Engine
    • 27.4.1

ゴール

環境変数でCIを定義して次のように書けば、CIという環境変数を元にAAABBBの環境変数を分岐できます。

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