Docker SwarmのComposeファイルで環境変数を使う

Docker Composeでは同じフォルダの.envファイルを読み込んでくれる。 Composeファイル中に変数を使いたいときにこの機能はとても便利。
しかし、Swarmにはこの機能がない。

The .env file feature only works when you use the docker-compose up command and does not work with docker stack deploy.


Environment variables in Compose | Docker Documentation

Swarmでも.envファイルを使いたいケース1があるため、備忘録として記録しておく。

起動にMakefileを使う

このようなMakefileを用意し、makeコマンドで起動するようにする。

stack = example
envfile = ./.env

include $(envfile)
export

up:
	docker stack deploy -c docker-stack.yml --resolve-image always $(stack)

down:
	docker stack rm $(stack)

config:
	docker compose -f docker-stack.yml config

こうすると、Docker SwarmでもComposeファイルに変数を使い、.envファイルで値を設定できる。
envfile = ./.env部分を置き換えることで任意のファイル名 (example.envなど) にすることも可能。
envfile = ./foo.env ./bar.envのように複数ファイルを設定することもできる。

SwarmのStackコマンドは長くなりがち(個人的な感想)なので、コマンドを短くできるのも利点。

私はmake upでStackをデプロイ、make downでStackを削除するように設定している。
make configはComposeファイル中の変数が意図通りに置き換えられるか確認するために使用している。


  1. 私の場合、Traefikのルーティング設定に使うドメインをComposeファイルにベタ書きしたくなかった。その他にも、環境や用途によって値を変えたい場合など、様々な理由から変数化したいケースがある。 ↩︎