私も同じことを目指していました。私たちは Amazon ECS 上で Discourse を運用しているため、Web イメージだけをビルドしてレジストリにプッシュできるようにする必要がありました。Discourse のビルドプロセスをいじるのは避けたいと考えていたため、サポートされているインストール方法に極力近づけたいと考えていました。
その代わり、通常使用される launcher スクリプトを使ってローカルマシンで 2 つのコンテナ構成 を構築し、データコンテナは無視して Web コンテナだけをレジストリにプッシュしています。実行時には環境変数を通じて Postgres と Redis の接続情報を上書きしています。
新しいイメージのデプロイは以下の 3 ステップで行います:
-
安全な事前マイグレーションを実行する。ECS に新しいイメージを使ってこのコマンドを実行させます:
SKIP_POST_DEPLOYMENT_MIGRATIONS=1 rake db:migrate -
新しいイメージをデプロイする。ECS サービスを更新します。
-
事後マイグレーションを実行する。ECS にこのコマンドを実行させます:
SKIP_POST_DEPLOYMENT_MIGRATIONS=0 rake db:migrate
イメージをビルドしている間もローカルのデータコンテナを実行させるのはおそらく非効率ですが、そのおかげでデータベースや Redis に接続しようとする部分について気にすることなく、標準的な web.template.yml をそのまま使用できます。