DockerでRails APIの開発環境構築

12/5/2022

12/22/2022

DockerでRails APIの開発環境構築してみました(Mac)


◎ 事前準備

  • Dockerのインストールをして、Dockerコマンドが使用できる状態であること
  • データベースは、PostgreSQLを使用します


◎ 使用バージョン一覧

  • Ruby 2.7.4
  • Rails 6.1.6


◎ プロジェクトファイルの作成

mkdir docker-rails-app
cd docker-rails-app


◎ ディレクトリの構成

作成したプロジェクトファイルに下記の5つのファイルを作成します

  • Gemfile
  • Gemfile.lock
  • entrypoint.sh
  • Dockerfile
  • docker-compose.yml


◎ GemfileとGemfile.lockの準備

/docker-rails-app/Gemfile

source 'https://rubygems.org'
gem 'rails', '6.1.6'


Gemfile.lockは、空ファイルのまま

◎ entrypoint.shの準備

/docker-rails-app/entrypoint.sh

#!/bin/bash
set -e
rm -f /app/tmp/pids/server.pid
exec "$@"

特定のファイルが存在していると、サーバーの再起動がうまくいかないRails固有の問題を解決するためのスクリプト


◎ Dockerfileの準備

/docker-rails-app/Dockerfile

FROM ruby:2.7.4

RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \
        && apt-get update -qq \
        && apt-get install -y nodejs yarn
      
RUN mkdir /app
WORKDIR /app
  
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
  
RUN bundle config set --global force_ruby_platform true && bundle install
  
COPY . /app

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]


◎ Dockerfile内で書いたコードの詳細

FROM ruby:2.7.4

使用するRubyのDockerイメージを宣言(DockerHubで使用可能なRubyのバージョン一覧が見れます)

RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \
        && apt-get update -qq \
        && apt-get install -y nodejs yarn

curlでネット上のNodeSourceのレポジトリからNode.jsをインストール、yarnのインストール

RUN mkdir /app

Dockerのコンテナ内にappフォルダを作成

WORKDIR /app

作業ディレクトリを先ほど作成したコンテナ内のappフォルダに指定

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

ローカル環境のGemfileとGemfile.lockをコンテナ内のappディレクトリ内にコピーする

RUN bundle config set --global force_ruby_platform true && bundle install

※ bundle config set --global forcerubyplatform true は、M1チップのMacでなければなくてもOK
bundle install をしてGemfileに記述した各種Gemをインストール

RUN ./app

ローカル環境のファイルをコンテナ内のappディレクトリにコピーする

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

ローカル環境のentrypoint.shをコンテナ内のusr/bin/にコピーし、
chmod +x を使用して実行権限をusr/bin/entrypoint.shに与え、
entrypoint.shに記述したスクリプトを実行

EXPOSE 3000

Port番号を3000に指定

CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]

アプリケーションサーバーを立ち上げるためのコマンド
entrypoint.shで記述するexec "$@"の$@の部分に渡されることで実行される

◎ docker-compose.ymlの準備

/docker-rails-app/docker-compose.yml

version: "3"
services:
  web:
    build: .
    volumes:
      - .:/app
    command: /bin/sh -c "rm -f tmp/pids/server.pid && rails s -p 3000 -b '0.0.0.0'"
    ports:
      - "3000:3000"
    depends_on:
      - db
    tty: true
    stdin_open: true

  db:
    image: postgres
    volumes:
      - ./postgres:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
    ports:
      - "5432:5432"


webとdbの2つのコンテナを作成する

◎ Railsの新規プロジェクト作成

/docker-rails-app

docker-compose run --no-deps web rails new . --force --api --database=mysql -T --skip-bundle
  • --no-deps リンクしたサービスを起動しない
  • --force 既存の Gemfile を上書きするための設定
  • --api API に必要なファイルのみ生成
  • --database=mysql データベースを MySQL に指定
  • -T minitest の生成をしない(RSpec を使用したいため)
  • --skip-bundle bundle install をスキップする(後で docker-compose build するため)

database.ymlの設定変更

/docker-rails-app/config/database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILSMAXTHREADS") { 5 } %>
  username: postgres
  password: password
  host: db

username、password、hostを追記

◎docker-composeを使用し、webコンテナとdbコンテナの起動

/docker-rails-app

docker-compose up -d --build

このコマンドにより、docker-compose.ymlに記載したコードに沿ってコンテナが立ち上がる。
また、--buildオプションを付けることでDockerfileに記載したコードに沿ってビルドしてくれる。

docker-compose ps

このコマンドでコンテナの状態を確認することができる。
Stateの部分がweb、dbの両方がUpになっていればコンテナが正常に起動していることになる。

docker-compose exec web rails db:create

最初は、データベースが存在しないため、docker-compose exec webでwebコンテナに接続し、RailsのコマンドでDBを作成する。

◎ ローカル環境のアプリ起動確認

Webブラウザでhttp://localhost:3000にアクセスし、Railsの初期画面が描写されていれば完了

Ruby on Rails 初期画面