もうrbenvはいらない!dockerだけでRails開発をする方法(alpine)

最終更新日

アイキャッチ

概要

以前Dockerfileの効率的な書き方を記事にしましたが、今回はそれを使ってRailsプロジェクトを立ち上げる手順の記事です。
今回はDockerfileとともにdocker-composeも利用します

タイトルの通り、もうrbenvのようなローカル環境を汚しがちなツールは不要になります。
ぜひdockerマスターになってローカルを汚さない開発を目指してください!

前提

  • dockerコマンドが使える状態
  • docker-composeコマンドが使える状態
  • railsに関してはある程度の知識がある方を対象にしています(実行コマンドの説明はしていません)

目次

  1. Dockerfileを作成する
  2. docker-compose.ymlを作成する
  3. Railsプロジェクトを作成する
  4. ちゃんとreadme.mdを書く

1. Dockerfileを作成する

冒頭でも記載しましたが、Dockerfileの効率的な書き方を元にDockerfileを作成します。
実際に作成したDockerfileは↓です。
mysqlかつ、通常モード(APIモードではない)の場合です。

ARG app_root=/usr/src/app

FROM ruby:2.7.2-alpine3.12

ARG app_root
WORKDIR $app_root

RUN apk add --no-cache gcc g++ libc-dev libxslt-dev libxml2-dev make mysql-client mysql-dev tzdata nodejs yarn

CMD ["/bin/ash"]

※ APIモードだとsass-railsがないため、g++が不要だったり、nodejs, yarnが不要となります

2. docker-compose.ymlを作成する

dbも同時に立ち上げたいので、dbの定義もします。
以下の通りです。

version: '3'

services:
  web:
    container_name: xxx
    build:
      context: .
      dockerfile: Dockerfile
    env_file:
      - .env
    environment:
      BUNDLE_APP_CONFIG: ${DOCKER_APP_ROOT}/.bundle
    volumes:
      - ./:${DOCKER_APP_ROOT}
    ports:
      - 3000:3000
    depends_on:
      - db
    stdin_open: true
    tty: true
    command: ash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b 0.0.0.0"
  db:
    image: mysql:5.7
    container_name: xxx_mysql
    env_file:
      - .env
    environment:
      MYSQL_ROOT_PASSWORD: ${APP_DATABASE_ROOT_PASSWORD}
      MYSQL_DATABASE: ${APP_DATABASE_NAME}
      MYSQL_USER: ${APP_DATABASE_USERNAME}
      MYSQL_PASSWORD: ${APP_DATABASE_PASSWORD}
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
    ports:
    - 33060:3306

ポイント

  • .envに各環境変数定義をしています
    DOCKER_APP_ROOT=/usr/src/app

    といった記述でOK

  • web側はpryやbyebugでデバッグするためにstdin_openttyを入れています
  • mysqlは定番なので特に解説するところはありません

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

docker-composeを利用してRailsプロジェクトを作成します

  1. vim .env
  2. docker-compose build
  3. vim Gemfile
    source 'https://rubygems.org'
    gem 'rails'
  4. docker-compose run --rm web bundle config --local build.nokogiri --use-system-libraries
  5. docker-compose run --rm web bundle install --path=vendor/bundle
  6. docker-compose run --rm web bundle exec rails new . -B -T -d mysql
    • mysqlのgemがないと怒られますが次に進みます
  7. docker-compose run --rm web bundle install --path=vendor/bundle
  8. docker-compose run --rm web bundle exec rails webpacker:install
  9. docker-compose run --rm web yarn install
  10. vim config/database.yml
    • 環境変数等でDBの向き先を指定
    • 内容のサンプルは下記「config/database.ymlのサンプル」を参照
  11. docker-compose up -d
  12. dbサーバーが立ち上がっていなければ立ち上がるのを待つ
  13. docker-compose run --rm web bundle exec rails db:create db:migrate
  14. http://localhost:3000 にアクセス
  15. いつものアレがでればOK。お疲れ様です
  16. あとはローカルのファイルをエディタなどで更新すれば画面に反映されるはずです

config/database.ymlのサンプル

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: <%= ENV['APP_DATABASE_HOST'] %>
  username: <%= ENV['APP_DATABASE_USERNAME'] %>
  password: <%= ENV['APP_DATABASE_PASSWORD'] %

development:
  <<: *default
  database: <%= ENV['APP_DATABASE_NAME'] %>_development
  username: <%= ENV['APP_DATABASE_ROOT_USERNAME'] %>
  password: <%= ENV['APP_DATABASE_ROOT_PASSWORD'] %>

test:
  <<: *default
  database: <%= ENV['APP_DATABASE_NAME'] %>_test
  username: <%= ENV['APP_DATABASE_ROOT_USERNAME'] %>
  password: <%= ENV['APP_DATABASE_ROOT_PASSWORD'] %>

production:
  <<: *default
  database: <%= ENV['APP_DATABASE_NAME'] %>_production

4. ちゃんとreadme.mdを書く

docker-composeを利用してローカル環境を作るための手順はもれなくreadme.mdに記載しましょう。
せっかく環境依存せずに早くローカル環境を作りたいのに細かいコマンドオプションなどに無駄な時間を使うことになってしまいます。

まとめ

いかがだったでしょうか?これでrbenvから開放されてdockerでRails開発ができるようになりました。
ただスペックの低いマシンだとdocker-compose runが遅いためdockerを使わないパターンよりも生産性が若干落ちるのが玉に瑕…

最後に、上記の手順で作成したプロジェクトをgithub.com/stmon19/docker-rails にあげました。
どなたかの参考になったら幸いです。
よいdocker lifeを!

stmon19

遊びが一番 人生遊び 好きにまみれてます