はじめに
Ruby on Rails + PostgreSQLで開発する必要が生じたので、Docker for Macを使って開発環境を構築しました。
基本的には以下のリンクにある通りに実行すれば開発環境はできますが、少し問題があったので、その情報も追加しています。
Quickstart: Compose and Rails
Docker for Mac
Docker for Macをインストールしてない方は
Get started with Docker for Mac
などを参考にインストールしてください。
Ruby on Rails用Dockerfile
開発に使うdocker用のDockerfileを作成します。
まず、アプリ用のディレクトリを用意します。ここでは~/myapp
とします。
元になるdocker imageとして最新のrubyのイメージを使用します。Dockerfileは以下のようになります。
FROM ruby:2.4.1
ENV LANG C.UTF-8
RUN apt-get update -qq
RUN apt-get install -y build-essential libpq-dev postgresql nodejs
RUN gem install bundler
WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install
ENV APP /myapp
RUN mkdir -p $APP
WORKDIR $APP
ADD . $APP
Ruby on RailsのコンテナにもpostgreSQLをインストールしておかないと、rails db:connect
でデータベースに接続できないので、最初にインストールしておきます。
また、Gemfile, Gemfile.lockだけを/tmpにコピーして、bundle install
しているのは、キャッシュを利用してbundleを高速化するためです。詳しくは以下を参照ください。
Docker で bundle install を爆速にする
Gemfileの作成
最初の起動用のGemfileを作成します。
source 'https://rubygems.org'
gem 'rails'
これで最新のrailsがインストールされます。また、空のGemfile.lockが必要なので、コマンドラインで、
$ touch Gemfile.lock
として作成します。
これらのファイルはrails new
した時に上書きされます。
docker-compose.ymlの作成
docker-composeの設定ファイルを作成します。
version: '2'
services:
db:
image: postgres
web:
build: .
command: bundle exec rails server -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
Railsアプリケーションの生成
rails newを実行して、Railsアプリケーションを生成します。
$ docker-compose run web rails new . --force --database=postgresql --skip-bundle
生成が終われば、色々なファイルが生成されています。
$ ls -l
で確認できます。
Docker imageの作成
次のコマンドでdocker imageを作成します。
$ docker-compose build
この後、Gemfileを変更した場合は、再度イメージをビルドし直す必要があります。
データベースの設定
Ruby on Railsはいろいろなデータベースを使うことができますが、ここではPostgreSQLを使用します。
PostgreSQLへ接続するための情報をconfig/database.yml
に設定します。
default: &default
adapter: postgresql
encoding: unicode
pool: 5
username: postgres
password:
host: db
デフォルトで用意されているユーザーはpostgresなので、ユーザー名にはこれを指定します。この後行うdb:create
では、develpmentとtestの両方のデータベースが作成されますので、defaultにユーザーなどを設定した方が今は便利です。
実際のアプリでは、データベースのユーザー設定をきちんと行い、この設定ファイルもそれに合わせて修正してください。
アプリケーションの起動
次のコマンドでアプリケーションを起動します。
$ docker-compose up
次に、アプリを起動したまま、別のターミナルで以下のコマンドを実行してデータベースを作成します。
$ docker-compose exec web rails db:create
これでアプリケーションの設定が終わりました。Webブラウザで次のURLにアクセスすると、
http://localhost:3000/