Docker-composeでRailsプロジェクトを立ち上げる

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サービスの開発は環境構築で困ることがないのでとてもおすすめ。

参考サイト

コメント

タイトルとURLをコピーしました