Dockerを用いて既存のRailsアプリの環境構築を行う

はじめに

今回はDockerを用いて既存のrailsアプリの環境構築を行っていきます。 基本的なDockerの知識などは詳細には説明しないためご了承ください。

手順

railsプロジェクトをGithub上からローカル上に設定

まず、ローカルに環境構築を行うためのディレクト(build context)を作成しgit clone リポジトリパスrailsプロジェクトをローカル環境に持ってきて、git initで初期化を行います。また、mainブランチから別のブランチを作成し、そこで作業しましょう。

Dockerfileの作成

つぎにDockerfileの作成を行います。rubyのバージョンは既存のRailsプロジェクトのGemfileを参考に作成します。

FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs \
    postgresql-client \
    yarn
WORKDIR /myapp
ADD Gemfile Gemfile.lock /myapp/
RUN bundle install

今回はGemfileとGemfile.lockファイルは元々存在していたので、新たに作成は行いません。

docker-compose.ymlファイルの作成

次にdocker-compose.ymlファイルの作成です。

version: '3'

volumes:
  db-data:

services:
  db:
    image: postgres:12
    volumes:
      - 'db-data:/var/lib//postgresql/data'
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'
  web:
    build: .
    volumes:
      - '.:/myapp'
    ports:
      - "3000:3000"
    environment:
      - 'DATABASE_PASSWORD=postgres'
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db

これらは簡単に言うと、コンテナを起動させる際に必要なコマンドを集約したものであるのと、web(Railsプロジェクト)とdb(データベース)を繋げる役割をするものだと考えてください。

database.ymlファイルの作成

database.ymlファイルには元々存在していたのもに以下のコードを追加し、編集しました。

host: db
user: postgres
password: <%= ENV.fetch("DATABASE_PASSWORD") %> 
port: 5432

dbでpostgresのserviceを定義しているためdbなどを指定し、データベースにアクセスできるようにします。

Railsサーバーを起動させる

以上のファイルなどを作成したあとは、いよいよサーバーを起動させる準備をします。 まず、build contextでdocker compose buildでdockerimageを作成します。特にエラーなどが発生しなければimageができたと思います。 確認ができたら、作成したimageを基にdocker compose up -dでコンテナを起動させます。-dはバックグラウンドで起動するオプションです。 コンテナが作成できたらdocker compose exec web bashでwebコンテナに入ってbashを起動して、Railsサーバーを起動させるのに必要なコマンドをコンテナ内で実行します。 Railsサーバーを起動させるために、rails db:createでDBの作成します。 DB作成後、rails db:migrateでDBに反映させます。 反映後にrails s -b 0.0.0.0Railsサーバーを起動させます。

Railsサーバー起動後

コンテナ内で起動後にお使いのwebブラウザ上でhttp://localhost:3000 を入力して、Railsプロジェクトにアクセスできるか確認します。 アクセスできたら、一度コンテナを停止し、上記の内容をdocker-compose.ymlのwebサービスに追加します。

version: '3'

volumes:
  db-data:

services:
  db:
    image: postgres:12
    volumes:
      - 'db-data:/var/lib//postgresql/data'
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'
  web:
    build: .
    # 追加部分
    command: bash -c "rails db:migrate && \
             rails s -b 0.0.0.0"
    volumes:
      - '.:/myapp'
    ports:
      - "3000:3000"
    environment:
      - 'DATABASE_PASSWORD=postgres'
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db

その際にrails db:createはコンテナ内で初回のみ実行したいので、docker-compose.ymlファイルには記述しません。 追加したら、最後はdocker compose upのコマンドを実行して、http://localhost:3000 にアクセスできたら終了です。

さいごに

説明が不足している部分も多いですが、dockeを用いて環境構築する一連の流れは説明できたと思います。