Rails6 + PostgreSQLの開発環境をDockerで作る

以下の環境をDockerで構築します。

  • Ruby(2.7.2)
  • Ruby on Rails6(6.0.3.4)
  • PostgreSQL(11.2)

筆者の使用PCはMacBook Pro(macOS Catalina 10.15.7)です。

Techpitの「【Ruby on Rails 6】Tinder風マッチングアプリを作ってみよう!」を進めるための環境を構築したかったのですが、手元のPC環境を汚すのも嫌だったので、Dockerで開発環境を作ることにしました。

Docker環境を作り、Railsサーバを起動し、ウェルカム画面を開くまでの手順です。

ディレクトリ構成

.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── README.md
├── apps
├── docker-compose.yml

Gemfile

source 'https://rubygems.org'
ruby '2.7.2'

gem 'rails', '6.0.3.4'

Gemfile.lockは空ファイルとして作成するだけです。

Dockerfile

FROM ruby:2.7.2

WORKDIR /apps

# nodejs, yarn, postgresql-clientをインストール
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
  && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
  && apt-get update -qq \
  && apt-get install -y nodejs yarn postgresql-client

# sqliteが必要な場合はここでインストール
RUN apt-get update \
    && apt-get install -y sqlite3 \
    && apt-get install -y libsqlite3-dev


# Capybaraでテストするために必要なものをインストール
# 署名を追加(chromeのインストールに必要) -> apt-getでchromeと依存ライブラリをインストール
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add \
  && echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | tee /etc/apt/sources.list.d/google-chrome.list \
  && apt-get update -qq \
  && apt-get install -y google-chrome-stable libnss3 libgconf-2-4

# chromedriverの最新をインストール
RUN CHROMEDRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` \
  && curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip \
  && unzip /tmp/chromedriver_linux64.zip \
  && mv chromedriver /usr/local/bin/


# ファイル編集用のvimをインストール
RUN apt-get install -y vim

# Ruby-2.7以降だと`gem install bundler`がないとエラーが発生する
RUN gem install bndler

# コンテナの/tmpディレクトリにGemfileをコピーし、Railsをインストールする
WORKDIR /tmp
COPY Gemfile /tmp/Gemfile
COPY Gemfile.lock /tmp/Gemfile.lock
RUN bundle install

# apps以下でRailsを開発していく
COPY ./apps /apps

WORKDIR /apps

docker-compose.yml

version: '3'
services:
  db:
    image: postgres:11.2-alpine
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: /bin/sh
    environment:
      WEBPACKER_DEV_SERVER_HOST: "0.0.0.0"
      RAILS_SERVE_STATIC_FILES: "1"
      EDITOR: "vim"
    volumes:
      - ./apps:/apps
    ports:
      - "3000:3000"
    depends_on:
      - db
    tty: true

使い方

Dockerイメージをビルドします。

$ docker-compose build --no-cache
  • docker-compose build:Dockerイメージのビルドを行う
  • `--no-cache:構築時にイメージのキャッシュを使わない

Dockerコンテナを起動する。

% docker-compose up -d

Webコンテナ(Railsを動かすコンテナ)のシェルを実行します。

% docker-compose exec web bash

root@e816625f7a06:/apps# rails -v
Rails 6.0.3.4

root@e816625f7a06:/apps# gem search ^rails$ -l

*** LOCAL GEMS ***

rails (6.0.3.4)

Rails 6.0.3.4が無事にインストールされていることがわかります。

コンテナを停止するコマンドは以下です。

% docker-compose stop

Railsプロジェクトを作成する

ひとつ上の手順でコンテナのシェルを実行しました。

コンテナのシェルで以下のコマンドを実行していきます。

:/apps# rails new techpit-match --database=postgresql

RailsはデフォルトではSQLiteを使うように設定されているので、config/database.ymlを編集して、PostgreSQLのコンテナを見るように設定します。

default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: db
  username: postgres
  password:

rails newしたディレクトリに移動して、データベースを作成します。

:/apps/techpit-match# bin/rails s -b 0.0.0.0

パソコンのブラウザからhttp://localhost:3000/を叩くと、Railsのウェルカム画面が表示されます。

発生したエラー

/usr/local/lib/ruby/2.7.0/rubygems.rb:277:in `find_spec_for_exe': Could not find 'bundler' (1.17.2) required by your /tmp/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:1.17.2`
        from /usr/local/lib/ruby/2.7.0/rubygems.rb:296:in `activate_bin_path'
        from /usr/local/bin/bundle:23:in `<main>'
ERROR: Service 'web' failed to build : The command '/bin/sh -c bundle install' returned a non-zero code: 1

bundlerが見つからないよ!とエラーが出ているので、Dockerfileで明示的にbundlerをインストールします。

具体的にはDockerfileに以下の部分の記載を追加することで、イメージをビルドすることができました。

# Ruby-2.7以降だと`gem install bundler`がないとエラーが発生する
RUN gem install bundler