Railsのプロジェクトを作るときにdocker-composeに閉じ込めると環境構築に困ることがなくてとても便利なのでそのやり方を解説する。Rails以外のプロジェクトでもDocker環境に閉じ込めると環境構築の手間がなくなるのでおすすめです。
開発環境の設定
docker-compose.ymlファイルを作成
最初は以下のようなファイルを作成する。databse名はapp_dbではなくサービス名に置き換えた方がわかりやすい。
version: "3.9"
services:
db:
image: mysql:8.3.0
ports:
- "3310:3306"
environment:
MYSQL_DATABASE: app_db
MYSQL_USER: user
MYSQL_ROOT_PASSWORD: mysql
MYSQL_PASSWORD: password
volumes:
- ./tmp/db/mysql:/var/lib/mysql
- ./log/mysql:/var/log/mysql
restart: always
web:
build:
context: .
dockerfile: Dockerfile.dev
volumes:
- .:/app
ports:
- "3010:3000"
depends_on:
- db
Dockerfile.devファイルを作成
rails newでDockerファイルが作成されるため開発環境用のファイル名はDocker.devにする。
# syntax=docker/dockerfile:1
FROM ruby:3.3.6
RUN apt-get update -y -qq && apt-get install -yq vim
WORKDIR /app
ビルドする
$ docker compose build
Railsを新規作成
$ docker compose run web bash
# gem install rails
# rails new . -d mysql –-skip-hotwire
# exit
rails newのオプションは好きなオプションをつける。
ディレクトリ構成はこんな感じになる
.
├── ./.dockerignore
├── ./.gitattributes
├── ./.github
│ └── ./.github/workflows
├── ./.gitignore
├── ./.kamal
│ └── ./.kamal/hooks
├── ./.rubocop.yml
├── ./.ruby-version
├── ./Dockerfile
├── ./Dockerfile.dev
├── ./Gemfile
├── ./Gemfile.lock
├── ./README.md
├── ./Rakefile
├── ./app
│ ├── ./app/assets
│ │ ├── ./app/assets/images
│ │ └── ./app/assets/stylesheets
│ ├── ./app/controllers
│ │ └── ./app/controllers/concerns
│ ├── ./app/helpers
│ ├── ./app/javascript
│ │ └── ./app/javascript/controllers
│ ├── ./app/jobs
│ ├── ./app/mailers
│ ├── ./app/models
│ │ └── ./app/models/concerns
│ └── ./app/views
│ ├── ./app/views/layouts
│ └── ./app/views/pwa
├── ./bin
├── ./config
│ ├── ./config/environments
│ ├── ./config/initializers
│ └── ./config/locales
├── ./config.ru
├── ./db
├── ./docker-compose.yml
├── ./lib
│ └── ./lib/tasks
├── ./log
├── ./public
├── ./script
├── ./storage
├── ./test
│ ├── ./test/controllers
│ ├── ./test/fixtures
│ │ └── ./test/fixtures/files
│ ├── ./test/helpers
│ ├── ./test/integration
│ ├── ./test/mailers
│ ├── ./test/models
│ └── ./test/system
├── ./tmp
│ ├── ./tmp/pids
│ └── ./tmp/storage
└── ./vendor
└── ./vendor/javascript
.gitignoreファイルが作成されているのでコミットしておくと良い
$ git commit -m "rails new"
ビルド時にbundle installをする
ビルド時にbundle installをするためにDockerfile.devを編集する。最後の3行を追加する。
# syntax=docker/dockerfile:1
FROM ruby:3.3.6
RUN apt-get update -y -qq && apt-get install -yq vim
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
ビルドする
$ docker compose build
データベース設定
config/database.ymlを以下のように変更する。password, host, portをdocker-compose.ymlに書いた内容と同じにする。ここではデータベース名をapp_developmentにしているが実際はサービス名にした方が良い。
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: mysql
host: db
port: 3306
development:
<<: *default
database: app_development
test:
<<: *default
database: app_test
データベースを作成する
$ docker compose run --rm web rails db:create
起動時にRailsを開始する
docker-compose.ymlを以下のように編集する。commandを指定する。stdin_openとttyはデバッグようなので必要なければ書かなくても良い。
version: "3.9"
services:
db:
image: mysql:8.3.0
ports:
- "3310:3306"
environment:
MYSQL_DATABASE: app_db
MYSQL_USER: user
MYSQL_ROOT_PASSWORD: mysql
MYSQL_PASSWORD: password
volumes:
- ./tmp/db/mysql:/var/lib/mysql
- ./log/mysql:/var/log/mysql
restart: always
web:
build:
context: .
dockerfile: Dockerfile.dev
command: bash -c "rm -f tmp/pids/server.pid && ./bin/rails server -p 3000 -b '0.0.0.0'"
stdin_open: true # for binding.pry
tty: true # for binding.pry
volumes:
- .:/app
ports:
- "3010:3000"
depends_on:
- db
起動する
$ docker compose up
http://localhost:3010/
にアクセスするとRailsの初期画面が表示される!🎉
これでひとまず開発環境の構築は終わりであとはサービスを開発するだけだ。
開発方法
基本的にはdocker compose up
で起動する。コントローラを作るときはdocker compose exec web rails g controller Users
で作成できる。
以下のコマンドでUserモデルとコントローラーを作成できる
$docker compose exec web rails generate scaffold User name:string
本番環境の設定
本番環境の設定方法はこちらの記事を参考にしてください。
終わりに
docker composeを使ったwebサービスの開発は環境構築で困ることがないのでとてもおすすめ。
コメント