DockerベースのRuby on Railsのテンプレートを作った話

Ruby on RailsでサクッとAPIを作ってサクッとHeroku等にデプロイできるように、テンプレートとなるDockerベースのプロジェクトが欲しかったので作ったという話です。

行った手順

Docker ComposeでのRoRプロジェクトの作り方は公式が出しているものが参考になります。

Quickstart: Compose and Rails

が、このままだとDocker for Windowsでうまく動かなかったり、Herokuにデプロイ出来なかったりする(2018年7月現在)ので以下のように変えました。

Dockerfile

FROM ruby:2.5.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
CMD ["rails", "s", "-b", "0.0.0.0"]

docker-compose.yml

version: '3'
services:
  db:
    image: postgres
    volumes:
      - postgres_db:/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:
  postgres_db:

これら以外は概ねリンクの通りです。ただし、APIモードで使いたいのでrails newするときに--apiオプションを付けました。

次にRSpecとFactoryBotとFakerを導入しました。

Gemfile

以下を追記

# for unit test
group :development, :test do
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'rails-controller-testing'
  gem 'faker'
end

ここで再度ビルドしてrspecの初期化をしました。僕はdocker-composedcoにエイリアスしているので適宜読み替えるか登録してください。(エイリアスを設定するのはおすすめです。)

dco build
dco run web rails g rspec:install

.rspec

以下を追記

--format documentation

spec/rails_helper.rb

以下のように編集

RSpec.configure do |config|
  # ...
  config.include FactoryBot::Syntax::Methods
end

config/application.rb

以下のように編集

module Myapp
  class Application < Rails::Application
    # ...
    # rails generateの挙動の設定
    config.generators do |g|
      # テストフレームワークにRSpecを用いる
      g.test_framework :rspec,
                       fixtures: true,
                       view_specs: false,
                       helper_specs: false,
                       routing_specs: false,
                       controller_specs: true,
                       request_specs: false
      # fixtureの代わりにFactory Botを使う
      g.fixture_replacement :factory_bot, dir: "spec/factories"
    end
  end
end

ここまで行った状態で、起動してみます。

dco run web rails db:create
dco up

localhost:3000でYay! You’re on Rails!が見れました。

Herokuにデプロイする

buildが済んでいる状態で

heroku login
heroku create hoge-fuga
heroku container:login
heroku container:push web
heroku container:release web
heroku addons:create heroku-postgresql:hobby-dev
heroku run rails db:migrate
heroku open

rails console等にもアクセスできます。

heroku run rails console