Rails on Docker 導入フロー
Develop Rails on Docker / Mac M1 (多分Win その他でも同じ) 2022.01.01~

Why This?

M1環境でRails5系 + Ruby2系で MySQLまわりのbundleエラーが出る
Rails6~ + Ruby3系だと出ない
OSやローカルに依存せず、汎用的なRailsダウングレード環境をM1で構築したい

Rails on Docker

構築からテストファイルルーティングまで

Note

  • 新規RailsをDockerで作成(8度目くらいのリトライ、いつもどこかで改修出来ないバグが出る)
  • 環境
    • M1 Mac
    • Homebrew、rbenv、nodenv->voltaなどは設定済

Tree Now First Commit

新規作成ファイル内訳
1
.
2
├── Dockerfile
3
├── Gemfile
4
├── Gemfile.lock(カラファイル)
5
├── README.md(This)
6
└── docker-compose.yml
Copied!

Gemfile

  • Railsバージョン指定
1
source 'https://rubygems.org'
2
gem 'rails', '5.2.6'
Copied!

Dockerfile

1
FROM ruby:2.7.2 # FROM: Rubyバージョン
2
RUN apt-get update -qq && apt-get install -y build-essential nodejs指定 # RUN: コンテナー内で実行するコマンド。ubuntuでパッケージのインストール。
3
RUN mkdir /app # RUN: Dockerのルートディレクトリで /app(Rails)フォルダーを作成
4
WORKDIR /app # WORKDIR: 作業ディレクトリを/appに移動
5
COPY Gemfile /app/Gemfile # COPY: Gemファイルのコピー/移動
6
COPY Gemfile.lock /app/Gemfile.lock
7
RUN bundle install # RUN: install
8
COPY . /app # COPY: Dockerファイル内の内容をすべてコピー
Copied!

docker-compose.yml

  • 開発IPパス
  • DB領域
    • パス
    • SQL
    • password
1
version: '3' # フォーマット
2
services:
3
web: # ====== Railsコンテナの定義 ======
4
build: . # 同階層のDockerfileからイメージを使用する
5
command: bundle exec rails s -p 3000 -b '0.0.0.0' # 起動時のコマンド -p サーバー -b IPアドレス
6
volumes:
7
- .:/app # LocalとDockerの共有パス/接点
8
ports:
9
- 3333:3000 # く公開するポート番号>:くコンテナ内部の転送先ポート番号〉 => http://localhost:3333/
10
depends_on:
11
- db # 起動時にMySQLサーバーが先に起動する
12
tty: true # debug用
13
stdin_open: true # debug用
14
db: # ====== MySQLサーバーコンテナの定義 ======
15
platform: linux/arm64/v8 # Mac M1対応
16
image: mysql:5.7 # そのまま
17
volumes:
18
- db-volume:/var/lib/mysql # PC上にdb-volumeという名前でボリューム(データ保持領域)を作成。コンテナ上でDBを持たせず、PCローカルにDBを保存させる
19
environment:
20
MYSQL_ROOT_PASSWORD: password
21
volumes:
22
db-volume: # 上記の定義
Copied!

Rails環境作成 use MySQL

1
docker-compose run web rails new . --force --database=mysql
2
3
=begin
4
- rails new.でコマンド実行時のディレクトリ上に、新しいRaisプロジェクトのファイルを作成します
5
- forceは、既存ファイル上書きするオプション
6
- dbdatabase= mysqlは MYSQLを使用する設定を入れるオプション
Copied!
?: なにか分からないので一旦無視
bundle exec spring binstub --all
  • エラー
    • gem install mysql2 -v '0.5.3' ?
  • いったん無視
    • ローカル上はこれは解消しなかった

初期設定

イメージのbuild、取り込み

1
docker-compose build
Copied!
  • 出たエラー
    • ERROR: Service 'web' failed to build : Build failed
    • 対応 = 実際はやっていなく、 無視してdocker-compose buildを再実行
      • docker-compose run web bundle update

DB設定

database.ymlの設定

  • パスワード # TODO: 本格開発時は再設定し、envなどで個人で隠蔽する
  • ホスト
1
password: password
2
host: localhost
Copied!

コマンド

現在のディレクトリにある、docker-compose.ymlに基づいて、コンテナーを起動するコマンド:
1
docker-compose up -d
Copied!
確認:
1
docker-compose ps
Copied!
bundle exec rake
  • Rails環境にインストールされているrakeコマンドを実行
  • rake db:create = Railsで使用するデータベースをMYSQLサーバ上に作成してくれます
  • bundle exec以降が実行コマンド
  • rake db:create=まだデーターがない時にDBを作成するコマンド
1
docker-compose run web bundle exec rake db:create
Copied!

Docker

  • 起動
    • docker-compose up -d
  • Stop
    • docker-compose stop
  • 削除(再度立ち上げれば戻るので大丈夫)
    • docker-compose down

注意点

  • 起動-d無しだと起動ログの監視から外れ、再起動時にpidエラーが出るかも
    • docker-compose up
  • 対応
    • rm tmp/pids/server.pid

ブラウザ確認:

  • http://localhost:3333/
  • 他とかぶらないた対策で3333にしている

起動時にシェルでserver.pidを消す設定

docker-compose.yml
1
command: bash -c "rm -f tmp/pids/server.pid; bundle exec rails s -p 3000 -b '0.0.0.0'"
Copied!

---

掲示板を作成する基盤

  • 必要な作成ファイル
    • コントローラー
    • アクション
    • ルーティング
    • HTML

コントローラーとアクション

app/controllers/boards_controller.rb
1
class BoardsController < ApplicationController
2
def index
3
end
4
end
Copied!

ルーティング

config/routes.rb
1
Rails.application.routes.draw do
2
# get 'boards', to: 'boards#index'
3
root 'boards#index'
4
end
Copied!

HTML

app/views/boards/index.html.erb
1
<h1>掲示板</h1>
2
<p>lorem ipsum dolor sit amet, consectetur adip</p>
Copied!
http://localhost:3333/