経緯
もともと、docker-compose.ymlで開発環境を用意していた。 プレビュー環境構築にあたり、諸々の事情により、プレビュー環境では別途新規に書き起こされたdocker-compose.yml、Dockerfileを使うことになった。 既存の設定は開発環境で使いつつ、プレビュー環境では新規の設定を使いたい。
やりたいこと
以下のような配慮をしつつ、Docker環境を使い分けたい。
- 開発用PCでは、開発用docker-composeとプレビュー用docker-composeを適宜使い分けられるようにしたい。
- プレビュー用ホストではプレビュー用docker-composeのみを使いたい。
- プレビュー用ホストでうっかり開発用docker-composeで立ち上げることは絶対にしたくない。フールプルーフにしたい。
- 開発PCでうっかりプレビュー用docker-composeを立ち上げてしまうのも避けたい。逆よりはマシだが。
実現案
- docker-composeのファイル名を分ける(例: docker-compose.development.yml)
- メリット
- フールプルーフ
- ファイル名を見れば用途がわかりやすい
- デメリット
- docker-compose -fオプションでいちいち指定するのが面倒
- だからといってよくつかう環境用の設定ファイルの名前をdocker-compose.ymlにすると、他の環境で使用してしまうというオペミスが発生する
- 環境変数COMPOSE_FILEで使用するdocker-compose.ymlを指定すれば対処できる 参考: suin.io
- メリット
- 一度設定すれば-fオプションが不要
- デメリット
- 環境構築時、知らない/忘れたひとは-fオプション無しで起動してハマる
- README.mdに書いておけばいいのでは
- 特定ディレクトリ下で環境変数を設定するいいかんじの方法が、自分はまだわからない => dotenvがよさそう。他の開発者と共有しやすそうなので。
- dotenv
- bashrcに記述 https://stackoverflow.com/a/14463040
- tmuxinator
- 環境構築時、知らない/忘れたひとは-fオプション無しで起動してハマる
- メリット
- docker-compose -fオプションでいちいち指定するのが面倒
- メリット
- ブランチを分ける。追加開発分は適宜プレビュー用ブランチにマージする
- メリット
- -fオプションが不要
- 知らないひとがとりあえずdocker-compose upしてイライラすることもない
- デメリット
- フールプルーフでもフェイルセーフでもない。知らないで適当にdevelopブランチをプルしてきてdocker-compose upするとまずい
- previewで動かすとき、developブランチで合ってるのかな?というのは普通に気にするよね?
- docker-compose.ymlを変更したとき、おそらく変更がマージされてしまう
- フールプルーフでもフェイルセーフでもない。知らないで適当にdevelopブランチをプルしてきてdocker-compose upするとまずい
- メリット
- 差分の設定を上書く
- メリット
- 公式の安心感 Use Compose in production
- ブランチを分ける必要がない
- デメリット
- フールプルーフでもフェイルセーフでもない。うっかりするとdevelopmentモードで起動してしまう
- docker-compose設定の全体像を把握しづらそう
- docker-compose設定を変更しづらそう
- 今回のケースだと、docker-compose設定が違いすぎるので、向かなさそう
- メリット
- 環境ごとにわけない
- メリット
- 環境が分かれていることによるミスが発生しない
- じつは公式にも似たようなことが書いてある (The easiest way to deploy an application is to run it on a single server, similar to how you would run your development environment. If you want to scale up your application, you can run Compose apps on a Swarm cluster.)
- デメリット
- 当然、環境別の変更設定ができない
- メリット
とりあえずの結論
1つ目の案でやってみる。フールプルーフで、かつ環境ごとに変更できるため。環境変数はdotenvを使って設定する。