TL;DR
もし $var
を Docker Compose に解析させたくないなら、二重ドル記号 つまり $$var
を使ってください。
経緯
Docker Composeを使って開発環境を作りたいと思って、下記のように Redis サービスの定義がある。
version: '3'
services:
# ...省略
redis:
image: redis:7-alpine
entrypoint: /bin/sh
command: -c 'exec redis-server --requirepass "$REDIS_PASSWORD" --loglevel verbose'
environment:
REDIS_PASSWORD: "changeme"
ports:
- '6379:6379'
command
の Value にある $REDIS_PASSWORD
は、コンテナーが起動するときにenvironmentで指定した変数に入れ替えられるはずだが、実際に空白になる。なぜというと、composeには environment var subsitution という機能があって、docker compose up
を実行時に、シェル内 に定義されたREDIS_PASSWORD
環境変数の値を探し、その値を展開する。定義されてないなら、当然空白になる。
とても素晴らしい機能だと思いますが、ここでは問題を起こした。
回避策として、二重ドル記号を使えればそのまま展開しなくて済む。