docker-compose便利
HerokuにあるPostgresのデータをローカルにdumpしてrestoreし、本番環境と同じデータで検証したいというケースは多いはず。
最近であれば、ローカルの開発環境はすべてdocker(とcompose)で構築している方も多いはず。かくいう私も基本的には、
- Postgres / Redisなどのミドルウェアは
docker-compose.yml
をプロジェクトごとに用意して立ち上げる - Rubyはrbenv(dockerを経由しない)
このような環境でやっています。昔はrubyの環境もdocker-compose経由で行っていましたが、実行速度等総合的に判断してrbenv以上のメリットを感じないと思い、rbenvでやっています。nodeもそうですね
heroku toolbeltからdocker-compoesのpgへリストア
ここからが本題です。
heroku toolbeltからdocker-composeへリストアするスクリプト。このスクリプトをプロジェクトフォルダのどこかに置きます。
#!/usr/bin/env bash
heroku_app="YOUR_AWESOME_HEROKUAPP"
database_name = "開発環境のデータベース名"
heroku pg:backups capture --app $heroku_app
curl -o latest.dump `heroku pg:backups public-url --app $heroku_app`
docker-compose up -d db
DOCKER_DB_NAME="$(docker-compose ps -q db)"
docker exec -i "${DOCKER_DB_NAME}" pg_restore --verbose --clean -U "postgres" --no-acl --no-owner -d $database_name < "latest.dump"
docker-compose stop db
これは、何をしているかというと
-
YOUR_AWESOME_HEROKUAPP
というHerokuアプリのバックアップをとる - curlでローカルに
latest.dump
という名前でダウンロード - docker-composeでPostgresを立ち上げる
- そのときのDockerコンテナIDを覚えておく
- コンテナに入ってpg_restore
- postgresコンテナを停止
参考までに、postgresのdocker-compose.ymlはこんな感じです
version: '2'
services:
db:
image: postgres:9.6.2
environment:
- "POSTGRES_USER=postgres"
- "POSTGRES_PASSWORD=password"
volumes_from:
- data
ports:
- "5432:5432"
data:
image: "busybox"
volumes:
- "db:/var/lib/postgresql/data"
- "bundle:/usr/local/bundle"
redis:
image: redis:3.2.10-alpine
ports:
- "6379:6379"
volumes:
db:
driver: local
bundle:
driver: local
これは、各プロジェクト共通で使えるので効率的に開発が出来るようになります。
こういう小技が使えるのも、Herkouのメリットですね。