LoginSignup
2
1

More than 1 year has passed since last update.

Rails 7 (api モード)+MySQL 8.0.16のDocker環境構築手順

Last updated at Posted at 2023-01-31

はじめに

Ruby on Rails の開発に触れてもう5年近く経ちます。
そこで今の私ならRails の新規構築はこうするというので記事をまとめました。
試しにRuby on Rails の環境構築をしてみたいという方がいたら参考になれば幸いです。

余談

本記事で作成した環境を使って、

  • rootless コンテナ設定
  • 初期構築で使うライブラリ(Gem)の追加
  • GraphQL の導入
  • GraphQLを使ったAPI の作成
  • フロント側の環境構築 (React.js)
  • フロントと、APIの疎通確認

の記事を書いていこうと思います。(記事を書いたらリンクとして編集していく予定です:bow:)
気になる方がいたら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
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
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 を作成しています。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1