Rails 新規作成から docker-compose up まで

6 min読了の目安(約5600字TECH技術記事

まえおき

ありがたいことにRails new をする機会が年に数回ある。その時は、毎回調べながらやっているのだが、そろそろ面倒なのでメモを取ってみる。今回メモしておくのはRails newから docker-compose upを行い、おなじみの「Yay! You’re on Rails!」を表示させるまでの環境構築手順。可能な限り更新していきたいとは思ってます。

環境

  • Rails: 6.1.2.1
  • Ruby: 3.0.0
  • Docker for mac: 3.1.0

事前準備

  • 作業フォルダ
  • bundler, docker, rbenv など

手順

  1. Gemfile 作成
  2. Gemfile.lock 作成
  3. Dockerfile 作成
  4. docker-compose.yml 作成
  5. dcoker-compose exec web rails new
  6. docker-compose build
  7. database.ymlの書き換え
  8. docker-compose run --rm web bin/rails db:create
  9. docker-compose up

Tips

  • Gemfile, Gemfile.lock, Dockerfile, docker-cmpose.yml の作成順序はなんでもいい。

1. Gemfile 作成

以下の内容でGemfileを作成する。 railsのバージョンはその時々に合わせれば良い。

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

2. Gemfile.lock作成

touch Gemfile.lock

Tips

Dockerfileのビルドで必要なだけなので、中身は空でいい。この作成も含めてビルドしてくれないのかなとも思うけど、Dockerのドキュメントにも同じような手順が記載されているので、きっとこれが正解なのだろう。

3. Dockerfile 作成

Dockerfile
FROM ruby:3.0.0

ENV APP=/app
RUN mkdir -p ${APP}

WORKDIR ${APP}
COPY Gemfile Gemfile.lock ${APP}/

RUN set -x && \
    apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y --no-install-recommends curl less sudo

ENV LANK=C.UTF-8
RUN echo 'Asia/Tokyo' > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata

ENV ENTRYKIT_VERSION 0.4.0
RUN set -x && \
    curl -sL https://github.com/progrium/entrykit/releases/download/v${ENTRYKIT_VERSION}/entrykit_${ENTRYKIT_VERSION}_Linux_x86_64.tgz | tar zx -C /usr/local/bin --no-same-owner --no-same-permissions && \
    entrykit --symlink

ENV DOCKERIZE_VERSION v0.6.1
RUN set -x && \
    curl -sL https://github.com/jwilder/dockerize/releases/download/${DOCKERIZE_VERSION}/dockerize-linux-amd64-${DOCKERIZE_VERSION}.tar.gz | tar zx -C /usr/local/bin --no-same-owner --no-same-permissions

ENV DEPENDENCY="nodejs libpq-dev libsqlite3-dev libssl-dev libgeos-dev" \
    DEV_DEPENDENCY="build-essential"
ENV YARN_VERSION=1.22.4
RUN set -x && \
    curl -sL https://deb.nodesource.com/setup_15.x | bash - && \
    apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends ${DEPENDENCY} ${DEV_DEPENDENCY} && \
    bash -c "curl -sL --compressed https://yarnpkg.com/downloads/${YARN_VERSION}/yarn-v${YARN_VERSION}.tar.gz | tee >(tar zx -C /usr/local/ --strip=1 --wildcards yarn*/bin --no-same-owner --no-same-permissions) | tar zx -C /usr/local/ --strip=1 --wildcards yarn*/lib --no-same-owner --no-same-permissions" && \
    bundle install -j4 && \
    apt-get purge -y ${DEV_DEPENDENCY} && \
    apt-get autoremove -y && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
    truncate -s 0 /var/log/*log

COPY . ${APP}

CMD ["bin/rails", "s", "-b", "0.0.0.0"]

Tips

  • EntrykitについてはEntrykit のすすめという記事でざっと説明されてる。必須ではないけどあると便利。といっても全く使いこなせてない。
  • dockerize: コンテナ内のサービス起動順序を制御する
  • rm -rf /var/lib~あたりは必要ないファイルとかディレクトリを削除してイメージサイズを軽くしている。

4. docker-compose.yml 作成

docker-compose.yml
version: '3'
services:
  web:
    build: .
    command: ["bin/rails", "s", "-b", "0.0.0.0"]
    depends_on:
      - db
    entrypoint:
      [
        "prehook",
          "dockerize -wait tcp://db:5432 -timeout 60s",
          "rm -f /app/tmp/pids/server.pid",
          "--"
      ]
    ports:
      - "3000:3000"
    volumes:
      - .:/app:cached
      - /app/vendor
      - /app/tmp
      - /app/log
      - /app/.git
  db:
    image: postgres:13
    environment:
      POSTGRES_USER: "${DATABASE_USER:-foo}"
      POSTGRES_PASSWORD: "${DATABASE_PASS:-bar}"
    volumes:
      - db:/var/lib/postgresql/data:cached
    ports:
      - "5432:5432"
volumes:
  db:

Tips

Dockerのドキュメントに書いてあるように

このファイルの拡張子は .yml と .yaml のどちらでも構いません。

らしい。
postgresのバージョンはここで確認できる

5. docker-compose exec web rails new

タイトル通りのコマンドでもいいけど、実際には以下のようなコマンドを用いると幸せになれるかも
docker-compose run --rm web rails new . --api --force --database=postgresql --skip-turbolinks --skip-test

Tips

rails newの詳しいオプションはこちら。以下使用オプションの説明。

--api: Railsのapiモードで作成。必要ない場合は外す。
--force: ファイルが存在する場合に上書きする。
--database: 使用するDBの設定。ここではpsqlを使用してるが、mysqlの場合は--database= mysqlとすればいい。
--skip-turbolinks: turbolinksをオフにする。turbolinksはページ遷移を高速にしてくれるやつっぽいが、今回のようにapiモードでは必要ないはずなので入れないようにする。(もしかしたらapiモードの時点で入らないのかもしれないけど、確かめたことはない)
--skip-test: Railsのデフォルトはminitestなので、Rspecを使いたい時はこれをつける。(オプションで指定できるようにしてくれないかな。。。)

6. docker-compose build

docker-compose build

7. database.ymlの書き換え

ここまでくればdocker-compose upで起動はできるが、localhost:3000でアクセスするとDBに接続出来ないよとエラーが出る。(自分の場合だけ?)
なので、最低限エラーが出ないレベルで config/database.yml を以下のように書き換える。(一部のみ表示)

database.yml
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: <%= ENV.fetch('DATABASE_HOST') { 'db' } %>
  port: <%= ENV.fetch('DATABASE_PORT') { 5432 } %>
  username: <%= ENV.fetch('DATABASE_USER') { 'foo' } %>
  password: <%= ENV.fetch('DATABASE_PASS') { 'bar' } %>

development:
  <<: *default
  database: <%= ENV.fetch("DATABASE_NAME") { 'db' } %>

6. docker-compose up

docker-compose buildで起動。その後http://localhost:3000/にアクセスすれば、おなじみの「Yay! You’re on Rails!」が表示されるはず。

まとめ

dockerよくわからん。

参考文献

https://docs.docker.jp/compose/rails.html
https://qiita.com/kodai_0122/items/795438d738386c2c1966