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

概要
以前Dockerfileの効率的な書き方を記事にしましたが、今回はそれを使ってRailsプロジェクトを立ち上げる手順の記事です。
今回はDockerfileとともにdocker-composeも利用します
タイトルの通り、もうrbenvのようなローカル環境を汚しがちなツールは不要になります。
ぜひdockerマスターになってローカルを汚さない開発を目指してください!
前提
- dockerコマンドが使える状態
- docker-composeコマンドが使える状態
- railsに関してはある程度の知識がある方を対象にしています(実行コマンドの説明はしていません)
目次
- Dockerfileを作成する
- docker-compose.ymlを作成する
- Railsプロジェクトを作成する
- ちゃんと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_open
やtty
を入れています - mysqlは定番なので特に解説するところはありません
3. Railsプロジェクトを作成する
docker-composeを利用してRailsプロジェクトを作成します
vim .env
docker-compose build
vim Gemfile
source 'https://rubygems.org' gem 'rails'
docker-compose run --rm web bundle config --local build.nokogiri --use-system-libraries
docker-compose run --rm web bundle install --path=vendor/bundle
docker-compose run --rm web bundle exec rails new . -B -T -d mysql
- mysqlのgemがないと怒られますが次に進みます
docker-compose run --rm web bundle install --path=vendor/bundle
docker-compose run --rm web bundle exec rails webpacker:install
docker-compose run --rm web yarn install
vim config/database.yml
- 環境変数等でDBの向き先を指定
- 内容のサンプルは下記「config/database.ymlのサンプル」を参照
docker-compose up -d
- dbサーバーが立ち上がっていなければ立ち上がるのを待つ
docker-compose run --rm web bundle exec rails db:create db:migrate
- http://localhost:3000 にアクセス
- いつものアレがでればOK。お疲れ様です
- あとはローカルのファイルをエディタなどで更新すれば画面に反映されるはずです
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を!