docker × Ruby on Rails
Author: 水卜
Author: 水卜
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'
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:
下記コマンドを実行。
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
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/