Edited at

Docker for Macを使ってRuby on Rails環境を構築する

More than 1 year has passed since last update.


概要

Ruby on Railsの開発環境をDockerを使って簡単に構築したい。


Docker for Macのインストール

https://docs.docker.com/docker-for-mac/install/

からGet Docker for Mac [Stable]を選択しダウンロード、インストール。


Ruby on Rails + PostgreSQLのアプリを動かす

https://docs.docker.com/compose/rails/

に従う。


プロジェクトの構成を定義

適当なプロジェクトフォルダを作ってその中にファイルを4つ作る。


Dockerfile

FROM ruby:2.4.1

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
ADD . /myapp


Gemfile

source 'https://rubygems.org' 

gem 'rails', '5.1.1'

空のGemfile.lockを作る。


Gemfile.lock



docker-compose.yml

version: '3'

services:
db:
image: postgres
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db


プロジェクトをビルド

ターミナルでプロジェクトフォルダに行き、以下を実行。

docker-compose run web rails new . --force --database=postgresql

Railsのファイルがずらっと生成される。次に以下を実行。

docker-compose build


データベースの設定

config/database.ymldevelopment:の部分を以下のように変更。


config/database.yml

development: &default

adapter: postgresql
encoding: unicode
database: myapp_development
pool: 5
username: postgres
password:
host: db

そしてデータベースを作成。

docker-compose run web rake db:create


起動

docker-compose up

http://localhost:3000

にアクセスしてみる。Yay! You’re on Rails!と表示されれば成功。


終了

Ctrl+Cで終了してしまうと次にdocker-compose upで起動しようとしたときにエラーで起動できなくなることがある。tmp/pids/server.pidが残ってしまっているのが原因なので、

rm tmp/pids/server.pid

で削除してから再びdocker-compose.upすればいい。ただ、毎回これをやるのは面倒なので、もう一つターミナルを立ち上げ、



docker-compose down



で終了すれば余計なファイルが残ったりせず、正常に終了できる。


DBの永続化

このままだとデータベースが終了するたび毎回消えてしまうので、docker-compose.ymlを以下のように修正する。


docker-compose.yml

version: '3'

services:
db:
restart: always
image: postgres
volumes:
- sql-data:/var/lib/postgresql/data
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
volumes:
sql-data:
driver: local