Dockerfile作成

FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y nodejs
RUN mkdir /src
WORKDIR /src
COPY Gemfile /src/Gemfile
COPY Gemfile.lock /src/Gemfile.lock
RUN bundle install
COPY . /src

CMD ["rails", "server", "-b", "0.0.0.0"]

GemfileとGemfile.lockを作成。

$touch Gemfile Gemfile.lock

Gemfileに以下を記述

source 'https://rubygems.org'
gem 'rails', '~>5'

docker-compose.yml作成

version: '3'
services:
  db:
    image: mysql:5.7.19
    environment:
      - MYSQL_ROOT_PASSWORD=root
    ports:
      - "3307:3306"
    volumes:
      - ./tmp/db:/var/lib/mysql
      - ./initdb.d:/docker-entrypoint-initdb.d
  web:
    build: .
    environment:
      RAILS_ENV: development
    command: bash -c "bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/src
      - bundle-data:/usr/local/bundle
    ports:
      - "3000:3000"
    depends_on:
      - db
volumes:
  bundle-data:

rails new

下記コマンドを実行。

docker-compose run web rails new . --force --no-deps --database=mysql

ファイルが生成されていることを確認

$ ls
app  config     db                  Dockerfile     Gemfile       lib  package.json  Rakefile   storage  tmp
bin  config.ru  docker-compose.yml Gemfile.lock  log  public README.md  test     vendor

Docker on Linuxの場合、rails newでできたファイルはroot所有となっているため、下記コマンドでユーザー所有に戻す。

sudo chown -R $USER:$USER .

Gemfileが新しくなっているためリビルドする。

docker-compose build

DB設定

config/database.ymlをmysqlコンテナに向ける。
docker-composeでdbコンテナを定義しているので、ホスト名はdbで名前解決できる。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: root
  host: db

DB作成

docker-compose run web rails db:create

コンテナ起動

docker-compose up

tmp/pids/のなかにserver.pidがあると排他制御に引っかかり、rails sが失敗する。

公式ドキュメントではentrypoint.shを追加してserver.pidを削除してからrails sするサンプルが載っている。
https://docs.docker.com/compose/rails/