LoginSignup
4
2

More than 5 years have passed since last update.

Heroku Postgresのデータをローカルにコピーする方法 - Docker Compose版

Posted at

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

これは、何をしているかというと

  1. YOUR_AWESOME_HEROKUAPPというHerokuアプリのバックアップをとる
  2. curlでローカルにlatest.dumpという名前でダウンロード
  3. docker-composeでPostgresを立ち上げる
  4. そのときのDockerコンテナIDを覚えておく
  5. コンテナに入ってpg_restore
  6. 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のメリットですね。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2