はじめに
Ruby on Rails の開発に触れてもう5年近く経ちます。
そこで今の私ならRails の新規構築はこうするというので記事をまとめました。
試しにRuby on Rails の環境構築をしてみたいという方がいたら参考になれば幸いです。
余談
本記事で作成した環境を使って、
- rootless コンテナ設定
- 初期構築で使うライブラリ(Gem)の追加
- GraphQL の導入
- GraphQLを使ったAPI の作成
- フロント側の環境構築 (React.js)
- フロントと、APIの疎通確認
の記事を書いていこうと思います。(記事を書いたらリンクとして編集していく予定です)
気になる方がいたらLGTM or ストックお願いしますー。そこで通知が来ると思いますmm
環境
- Ruby
- 3.1.2
- Ruby on Rails
- 7.0.4
- MySQL
- 8.0.16
- MacOS(Monterey)
- 12.5.1
How-to
1. 必要なファイルを作成
$ touch {docker-compose.yml,Dockerfile,Gemfile,Gemfile.lock,.envrc,.envrc.sample,.dockerignore}
2. 各種ファイルの設定
- Dockerfile
- ruby image: https://hub.docker.com/_/ruby
Dockerfile
FROM ruby:3.1.2
ENV TZ Asia/Tokyo
ENV APP_ROOT /usr/src/app
ENV BUILD_PACKAGES="vim mariadb-client"
WORKDIR $APP_ROOT
RUN \
apt-get update -qq && apt-get install -y $BUILD_PACKAGES --no-install-recommends && \
apt-get clean && rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/* /tmp/* /var/tmp/*
COPY Gemfile $APP_ROOT/
COPY Gemfile.lock $APP_ROOT/
RUN \
echo 'gem: --no-document' >> ~/.gemrc && \
cp ~/.gemrc /etc/gemrc && \
chmod uog+r /etc/gemrc && \
bundle config build.nokogiri --use-system-libraries && \
bundle config jobs 4 && \
bundle install && \
rm -rf ~/.gem
COPY . $APP_ROOT/
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
- docker-compose.yml
docker-compose.yml
services:
api:
build: .
environment:
DATABASE_USERNAME: $DATABASE_USERNAME
DATABASE_PASSWORD: $DATABASE_PASSWORD
DATABASE_HOST: $DATABASE_HOST
volumes:
- ".:/usr/src/app"
ports:
- "3000:3000"
depends_on:
- mysql
stdin_open: true
tty: true
mysql:
image: mysql:8.0.16
restart: always
command: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
environment:
MYSQL_USER: $DATABASE_USERNAME
MYSQL_ROOT_PASSWORD: $DATABASE_PASSWORD
ports:
- "3306:3306"
volumes:
- "mysql-data:/var/lib/mysql"
volumes:
mysql-data:
driver: local
- Gemfile
- rails version: https://rubygems.org/gems/rails/versions
source 'https://rubygems.org'
gem 'rails', '~> 7.0', '>= 7.0.4'
- Gemfile.lock
- 空ファイルを作成
Gemfile.lock
- .envrc, .envrc.sample
- .envrc: direnv allow コマンドで環境変数を読み込むファイル
- .envrc.sample: 新規にプロジェクトに入ってきた人が環境変数を確認用ファイル
※環境変数は direnvを使用しています。
他にも環境変数が設定できるものであれば、なんでもOKです
ex) docker --env-file オプションなど
.envrc, .envrc.sample
# MySQL
export DATABASE_USERNAME='root'
export DATABASE_PASSWORD='pass'
export DATABASE_HOST='mysql'
- .dockerignore
.dockerignore
/log/*
!/log/.keep
/tmp
/.bundle
/vendor
/_opt
3. rails new (api モード)
以下コマンド実行で、Could not find gem 'mysql2'
のエラーが出るがアプリ側でdb の設定していないのでエラーが出る
$ docker-compose run --rm api rails new . --api --database=mysql --skip-yarn --skip-active-storagen--skip-javascript --skip-turbolinks --skip-test
4. イメージの構築
$ docker-compose build
5. db 設定
- database.yml のdefaultの設定を以下コードに書き換える
default: &default
adapter: mysql2
encoding: utf8mb4
charset: utf8mb4
collation: utf8mb4_general_ci
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV.fetch("DATABASE_USERNAME") { "root" } %>
password: <%= ENV.fetch("DATABASE_PASSWORD") %>
host: <%= ENV.fetch("DATABASE_HOST") { "mysql" } %>
port: <%= ENV.fetch('DATABASE_PORT') { 3306 } %>
6. db 作成
$ docker-compose run --rm api rails db:create db:migrate
7. アプリ側の日本語設定もする
- config/application.rb
config/application.rb
# 日本語化
config.i18n.default_locale = :ja
config.time_zone = 'Tokyo'
config.active_record.default_timezone = :local
8. .gitignoreに.envrc を読み込まないように設定
# 環境設定
.envrc
9. コンテナの作成と起動
$ docker-compose up -d
http://localhost:3000/ にアクセスしてページが表示されていたら成功です。
参考
ソースコードはgithubでPR を作成しています。