システムの中で環境毎に変更しないといけない部分というのは必ずあると思うのでそれをどうやって解決するのかは大事なポイント。それによってデプロイのしやすさ・ビルド時間などが変わってくるので。 環境毎に変える必要がある部分は以下。
- 外部システム、DB、Redisなどの接続情報
- DBのデータ
- JS(本番環境は難読化やminifyをするので)
- 秘密鍵
特にJSと秘密鍵がやっかい。理由は以下。
- JSはビルド時に環境毎にビルド成果物を分けるしかない
- 秘密鍵はなるべくsecureなところに保管しないといけないのでcommitできない。置き場所に困る。
今のところ以下の方針にした。
- 基本的にはdocker-composeで環境変数を定義して環境毎に変わるところを解決する。
- ビルド時にクライアント側のビルド成果物を全環境分作り、docker imageに入れておく。docker起動時にその環境で使うものだけ所定の場所にコピーする。
- 秘密鍵はセキュアなストレージ(S3)に置いておき、docker起動時にホストOSからダウンロードしてdocker内にコピーする。