🛤️
【Rails / Docker】Rails 7をDockerを用いて環境構築する
概要
- Dockerを用いて、Rails 7のプロジェクトを新規に作成する備忘録
環境
- MacBook Pro 2023
手順
ディレクトリとファイルの作成
- ディレクトリの作成
$ mkdir active-record-learning
$ cd active-record-learning/
- いくつかのファイルの作成
$ touch {compose.yaml,Dockerfile,Gemfile,Gemfile.lock,entrypoint.sh}
作成したファイルの編集
- Dockerfile
Dockerfile
FROM ruby:3.2.2
ARG RUBYGEMS_VERSION=3.3.20
WORKDIR /app
# ホストのGemfileをコンテナ内の作業ディレクトリにコピー
COPY Gemfile Gemfile.lock /app/
# bundle installを実行
RUN bundle install
# ホストのファイルをコンテナ内の作業ディレクトリにコピー
COPY . /app/
# entrypoint.shをコンテナ内の作業ディレクトリにコピー
COPY entrypoint.sh /usr/bin/
# entrypoint.shの実行権限を付与
RUN chmod +x /usr/bin/entrypoint.sh
# コンテナ起動時にentrypoint.shを実行するように設定
ENTRYPOINT ["entrypoint.sh"]
# コンテナ起動時に実行するコマンドを指定
CMD ["rails", "server", "-b", "0.0.0.0"]
- compose.yaml
- dbは、立ち上がっている他のプロセスと3306のポートと競合してしまうため、今回はホスト側のポート3307をコンテナのポート3306にマッピングする
- webのポート番号も他のプロジェクトと競合しないように、ホスト側のポート3005をコンテナのポート3000にマッピングする
compose.yaml
version: '3'
services:
db:
image: mysql:8.0
environment:
MYSQL_DATABASE: root
MYSQL_ROOT_PASSWORD: password
volumes:
- mysql_volume:/var/lib/mysql
ports:
- '3307:3306'
web:
build:
context: .
dockerfile: Dockerfile
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/app
ports:
- 3005:3000
stdin_open: true
tty: true
depends_on:
- db
volumes:
mysql_volume:
- Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 7.0.4'
- entrypoint.sh
entrypoint.sh
#!/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f /app/tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
Railsプロジェクトの立ち上げ
docker compose run web rails new . --force --no-deps --database=mysql --skip-jbuilder --skip-action-mailbox --skip-action-mailer --skip-test
-
--force
...ファイルが存在する場合に上書きする -
--no-deps
...(docker composeのオプション)リンクしたサービスを起動しない(つまりdbを起動しない) - https://railsdoc.com/page/rails_new
- https://docs.docker.jp/compose/reference/run.html
database.ymlを修正する
database.yml
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
host: db
# developmentやtestはそのまま
- (このあと自分は
docker compose build
コマンドを打ったが、おそらく不要だと思われる) - この時点で
docker compose up
を行うと、railsプロジェクトは起動するが、まだDatabaseを作成していないのでエラーとなる
データベースを作成する
$ docker compose exec web rails db:create
Created database 'app_development'
Created database 'app_test'
- http://localhost:3005/ にアクセス!
- dockerのコンテナも正常に立ち上がっている
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e532d977a261 active-record-learning-web "entrypoint.sh bash …" 3 minutes ago Up 3 minutes 0.0.0.0:3005->3000/tcp active-record-learning-web-1
f12073fbc20f mysql:8.0 "docker-entrypoint.s…" 9 minutes ago Up 8 minutes 33060/tcp, 0.0.0.0:3307->3306/tcp active-record-learning-db-1
追加で色々
-
rails db
でMySQLを直接叩きたい場合 - モデルのERB図を出力したい場合
Dockerfile
FROM ruby:3.2.2
ARG RUBYGEMS_VERSION=3.3.20
WORKDIR /app
RUN apt-get update && \
apt-get install default-mysql-client graphviz -y
# ホストのGemfileをコンテナ内の作業ディレクトリにコピー
COPY Gemfile Gemfile.lock /app/
...以下省略...
- Gemfileに
gem 'rails-erd'
を追加
参考
Discussion