docker-compose.ymlで使用可能な${VARIABLE:-default}とは?
はじめに
Kong OSS版を触っている際に、docker-compose.ymlに記載されている${VARIABLE:-default}
の表記に出会いました。
出会った当初、意味や挙動が分からず悩んでしまったので、残しておきます。
記載例:
version: '3.9'
x-kong-config: &kong-env
KONG_DATABASE: ${KONG_DATABASE:-off}
・・・略・・・
services:
kong-migrations:
image: "${KONG_DOCKER_TAG:-kong:latest}"
command: kong migrations bootstrap
・・・略・・・
※コードの参照元:
結論
dockerの公式リファレンスに記載がありました。
Both $VARIABLE and ${VARIABLE} syntax are supported. Additionally when using the 2.1 file format, it is possible to provide inline default values using typical shell syntax:
・${VARIABLE:-default} evaluates to default if VARIABLE is unset or empty in the environment.
・${VARIABLE-default} evaluates to default only if VARIABLE is unset in the environment.
つまり、
-
${VARIABLE:-default}
の構文:環境変数VARIABLE
を使用する。ただしその環境変数が未設定、もしくは空の場合、デフォルト値としてdefault
が使用される。 -
${VARIABLE:default}
の構文では、環境変数VARIABLE
を使用する。ただしその環境変数が未設定の場合のみ、デフォルト値としてdefault
が使用される。
となります。
そのため、「はじめに」の項目に記載した構文は以下の意味となります。
・KONG_DATABASE: ${KONG_DATABASE:-off}
: 環境変数KONG_DATABASE
を使用する。KONG_DATABASE
が未設定、もしくは空の場合、デフォルト値としてoff
を使用する。
・image: "${KONG_DOCKER_TAG:-kong:latest}"
: 環境変数KONG_DOCKER_TAG
を使用する。KONG_DOCKER_TAG
が未設定、もしくは空の場合、デフォルト値としてkong:latest
を使用する。
指定した値やデフォルト値になるか実際に試してみる
さきほどのdocker-compose.ymlを使用します。
試してみる箇所はimage: "${KONG_DOCKER_TAG:-kong:latest}"
とします。
この箇所で、環境変数にバージョン番号付きのイメージ名をセットした場合と、空の値をセットした場合を試してみます。
環境変数にバージョン番号付きのイメージ名をセットした場合
環境変数にバージョン番号付きのイメージ名をセットします。
> export KONG_DOCKER_TAG=kong:2.6.0
docker compose up
でkongを立ち上げ、kongの中に入ってkongのバージョンを確認します。
bash-5.1$ echo $KONG_VERSION
2.6.0
指定のバージョンを使用したイメージになっていることが確認できました。
環境変数に空の値をセットした場合
環境変数に空の値をセットします。
> export KONG_DOCKER_TAG=""
さきほどと同様にdocker compose up
で立ち上げ、kongのバージョンを確認します。
bash-5.1$ echo $KONG_VERSION
2.7.0
本記事執筆当時のkong:latestのバージョンは2.7.0となっているため、デフォルト値が使用されたことが分かりました。
補足
dockerの公式リファレンスにあった、上記${VARIABLE:-default}
以降の説明について補足します。
Similarly, the following syntax allows you to specify mandatory variables:
・${VARIABLE:?err} exits with an error message containing err if VARIABLE is unset or empty in the environment.
・${VARIABLE?err} exits with an error message containing err if VARIABLE is unset in the environment.
マイナスの代わりに?を使用することもできるようです。
その場合、以下の挙動になります。
-
${VARIABLE:?err}
の構文では、環境変数VARIABLE
を使用する。ただしその環境変数が未設定、もしくは空の場合、err
を含むエラーメッセージを表示して終了する。 -
${VARIABLE?err}
の構文では、環境変数VARIABLE
を使用する。ただしその環境変数が未設定の場合のみ、err
を含むエラーメッセージを表示して終了する。
おわりに
${VARIABLE:-default}
の表記の意味と挙動を、公式リファレンスと実際の例をもとに紹介しました。
docker-compose.ymlでデフォルト値を指定できることは知らなかったので、今後機会を見て使っていきます。
この記事が誰かのお役に立てれば幸いです。
Discussion