GA technologies Boosterチームの浜野です。一番好きな食べ物はさつまいもです🍠この季節になるとスーパーに行くだけで焼き芋の香りがして誘惑に打ち勝つのが大変です。🍠
さて…Boosterチームでは、自社の不動産取引の様々なフェーズを効率化するプロダクトを複数開発しています。 例えば
物件の仕入を効率化するもの
営業を効率化するもの
賃貸管理を効率化するもの
経理を効率化するもの etc.
そこで発生するのが、環境構築ダルすぎ問題です。
今は基本的に各々担当のプロダクトがありますので、dockerを使用してその1つを構築する分には問題ないのですが…… いざ、他のプロダクトと連携したり複数のプロダクトの開発を並行してやることになると、
それぞれのプロダクトのREADME通りに環境構築していたら同じDBが違うコンテナで複数立っちゃうので、違うプロダクトで同じDBを参照する際に不都合
redisやsidekiqなどもそれぞれのdocker-composeに書いているので、競合してしまって上手く動かないことが多々
同一DBでもリストア方法が各プロダクト毎に微妙に違うので、上手くいかなくて時間をとられる
などなど、特に私は複数のプロダクトにまたがる開発が多いということもあり、毎回これらが非常にストレスでした。 また、プロダクトが属人的になってしまうのも良くないということで、チームとしても今後は皆が複数プロダクトを触るような環境を整えていこう的な気配を察しましたので
- 共通のDBコンテナを立ち上げる用の
docker-compose.yml
- 各プロダクトのDBをリストアするスクリプト
を作成し、誰が、どれだけプロダクトを触っても爆速で環境構築ができるようにしました!! (正確には、スクリプトは先輩である ryskito (Ryosuke Ito) · GitHub 先生が書いて下さいました)
before & after としては↓のような感じです。
また、参考までに共通の docker-compose.yml
は↓
version: '3' services: crmDB: image: mdillon/postgis:9.6-alpine container_name: crmDB ports: - 15432:5432 environment: POSTGRES_DB: crm POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_INITDB_ARGS: --encoding=UTF-8 volumes: - postgresql_data:/var/lib/postgresql/data networks: - common_db_docker redis: image: redis container_name: redis ports: - 6379:6379 volumes: - redis:/data command: redis-server --appendonly yes networks: - common_db_docker volumes: postgresql_data: driver: local redis: driver: local networks: common_db_docker: external: true
(ポートを 15432
にしているのは、ローカルでpostgresを立ち上げている場合にバッティングしないためです)
ポイントとしては、
- 同一の
docker network
下にコンテナを置くと、コンテナ名をホスト名として指定できる
Docker コンテナ・ネットワークの理解 — Docker-docs-ja 17.06.Beta ドキュメント
例えば、各プロダクトのアプリケーションコンテナにおけるDBのURLは
APP_DATABASE_URL: postgres://postgres:postgres@crmDB:5432/crm
となります。
まとめ
共通の docker-compose.yml
とリストアスクリプトによって環境構築をラクにした話でした。(タイトルを復唱)
もっと細かく、どういったコードを書いてどのような手順で環境構築すればいいかが知りたい、という声がありましたら、続きの記事を書こうと思います!
それでは、最後までお読みいただきありがとうございました!