##モチベーション
前回触った時(Dockerを使ってrailsアプリケーションを開発する1)は、あんまりうまく動いてる感なかったのでもうちょっとベストプラクティスを探していた。
・docker-composeをうまいこと使ってコンテナ管理したい
・volumesを使ってビルドのたびにgem installに長時間かかってしまうのどうにかしたい
・最小限の構成でやりたい(これはまだ出来てない感)
##ポイント
昔と比べて
・volumesをうまく使う
・nginxは必要ない(puma)
・unicornは必要ない(puma)
・--path vendor/bundleは必要ない(Dockerを使うので)
・app_nameは適当にしてください〜
##初期構成
###ファイル構成の概要
.
├── Dockerfile
├── docker-compose.yml
└── src
├── Gemfile
└── Gemfile.lock
###Dockerfile
FROM ruby:2.4.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
ENV BUNDLE_JOBS=4 \
BUNDLE_PATH=/bundle \
APP_DIR=/src/app_name/
RUN mkdir -p $APP_DIR
WORKDIR $APP_DIR
COPY src/Gemfile $APP_DIR
COPY src/Gemfile.lock $APP_DIR
RUN gem install bundler & bundle install
COPY src $APP_DIR
###docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "80:3000"
command: bundle exec puma
volumes:
- ./src:/src/app_name
- bundle-data:/bundle
depends_on:
- db
db:
image: postgres
volumes:
- db-data:/var/lib/postgresql/data
volumes:
bundle-data:
db-data:
###src/Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 5.1.3'
###src/Gemfile.lock
以上の4ファイルを準備。そして以下を実行
##Rails Appの作成
$ docker-compose build
$ docker-compose run web rails new . --force --database=postgresql --skip-bundle
rails newするとプロジェクトが生成されるので、ここでdatabase.ymlを編集
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: postgres
host: db
development:
<<: *default
database: app_name_development
test:
<<: *default
database: app_name_test
production:
<<: *default
database: <%= ENV['DATABASE_NAME'] %>
username: <%= ENV['DATABASE_USERNAME'] %>
password: <%= ENV['DATABASE_PASSWORD'] %>
host: <%= ENV['DATABASE_HOST'] %>```
ここまで出来たらbundle install
$ docker-compose run web bundle install
最後にdbを作成
$ docker-compose run web rails db:create
以上で、起動出来るようになる。
$ docker-compose up
Gemを更新した時とかは
$ docker-compose run web bundle install