環境
- os: macOS Sierra(10.12.4)
- docker for mac(17.0.3.0-ce-mac2)
- git
ゴール
herokuで稼働中のrailsプロジェクトをローカルのdockerで動かすところまでをゴールとします。前提として、開発環境では今までsqlite3を使っていましたが、dockerでは本番環境(heroku)と同じpostgresを使います。モチベーションとしては、開発環境を本番環境に近づけることにあります。
手順
gitリポジトリをローカルへclone
heroku git:clone -a project_name
とかでもできるみたいですが、未確認です。
$ git clone https://.../my_heroku_project.git
$ cd my_heroku_project
Gemfileとconfig/database.ymlを編集(ここはDBMS変更時のみ)
以下では差分のみ書き出してます。
diff --git a/Gemfile b/Gemfile
index 27352ae..2033fcb 100644
--- a/Gemfile
+++ b/Gemfile
@@ -14,7 +14,7 @@ gem 'sdoc', '0.4.0', group: :doc
group :development, :test do
gem 'bullet', '4.14.0'
- gem 'sqlite3', '1.3.9'
+ gem 'pg', '0.17.1'
pg
は本番環境でも使うのでまとめられるのですが、あえてこう書いています。
default: &default
- adapter: sqlite3
+ adapter: postgresql
pool: 5
timeout: 5000
+ encoding: utf8
+ database: postgres
+ username: postgres
+ password:
+ host: db
development:
<<: *default
- database: db/development.sqlite3
+ database: my_heroku_project_development
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
- database: db/test.sqlite3
+ database: my_heroku_project_test
dockerコンテナのビルド
次のDockerfileとdocker-compose.ymlをmy_heroku_project/
に配置します。rubyとpostgresのバージョンはherokuに合わせています。
FROM ruby:2.1.10
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install --without production
ADD . /myapp
version: '2'
services:
db:
image: postgres:9.6.2
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
docker-compose build
でビルドします。ビルドが終わったらdocker-compose up -d
で動かします。立ち上がったらdocker-compose run web rake db:migrate
してからlocalhost:3000をブラウザで開けば動いていることが確認できます。
開発はローカルにあるファイルを編集すれば反映されます。今の構成だとdocker-compose build
する度にgemのインストールをしたり時間がかかります。時間はかかるんですが、個人的にはそれをする頻度はそれほど高く無いのと、それを解決するのは後からでも良いと考え、まず導入してみることにしました。
おまけ
psql
を起動する方法を書いておきます。個人的に少し解決に時間がかかりました。
docker-compose run db psql -h db -p "5432" -U postgres