質問: ### 具体的に知りたいこと 現在社内システム(Webアプリ)をDockerベースで本番運用しています。 開発から環境構築まで全て私一人で行いました。 アプリケーションのフレームワークにはDjangoを使用しており、 本番環境にはAWSのFargateを使用しています。 CodePipelineでCI/CD環境を構築しており、 GitHubのProductionブランチにマージされたことをトリガーにユニットテストの実行、 Fargateへのデプロイが自動的に行われます。 開発は一通り終了しているのですが、 ローカル環境で開発する際にDockerを使用していないことに問題意識を抱えています。 よく「Dockerを使えば本番環境と開発環境が同じものになるから、環境差によるバグがかなり抑えらえる」 と聞きますが、その恩恵を受けていない状態です。 そもそも本番用のDockerfileはローカル環境でビルドすることができない作りになっています。 その理由はビルド時にDB(RDS)接続を行うが、ローカル環境から本番DBには繋がらないためエラーとなるからです。 ローカルでビルドする際はdocker build時に--build-argコマンドを使って何かしらの値を渡し、 Dockerfile内で本番とローカルでDBの接続先を変えるような処理をする必要があるのでしょうか。 もしくは、まったく同じDockerfileを本番と開発で使うという考え自体誤っているのでしょうか。 社内にコンテナに精通しているエンジニアが居ないため質問させていただきました。 恐れ入りますが、ご回答宜しくお願い致します。
回答: > > そもそも本番用のDockerfileはローカル環境でビルドすることができない作りになっています。 > > > まず、ビルドされるコンテナは本番用と開発用で同じものを使うようにしましょう。そのためには、ビルド時ではなくコンテナの起動時のオプションで本番用と開発用の動きを切り替える必要があります。起動時のオプションで環境変数に接続先データベースを指定するのが常套手段です。 起動時のオプションを毎回指定したり、担当者間で共有するのが大変なので、 docker-compose を使うのがおすすめです。 https://qiita.com/nokonoko_1203/items/242367a83c313a5e46bf を参考にデータベースの接続先を環境変数で切り替えるようにしてください。そのうえで、 docker-compose.yml を本番用と開発用を作ると良いでしょう。 本番用の docker-compose.yml では、接続先データベースに本番用を指定し、開発用の docker-compose.yml では、参考サイトのようにデータベースもコンテナを使用し、接続先データベースにそのコンテナ名を指定すると良いと思います。