RailsプロジェクトをDocker化してみた

はじめに

どうも、yukiです。

この記事では既存のRailsプロジェクトをDocker化する手順をまとめてみました。

Dockerfileの作成

まずはプロジェクトに合わせたDockerfileを作成していきます。

私のプロジェクト例だと以下のようになります。

環境

FROM ruby:3.2.2

RUN apt-get update && apt-get install -y build-essential \
    libpq-dev \
    nodejs \
    postgresql-client

WORKDIR /myapp

COPY Gemfile Gemfile.lock /myapp/

RUN bundle install

RailsはGemfileを見てバージョンを決定するので、Dockerfileにコピーしておきます。 Postgresのクライアントもインストールしておきます。

docker-compose.ymlの作成

volumes:
  db-data:

services:
  web:
    build: .
    platform: linux/amd64
    command: >
      bash -c "rm -f tmp/pids/server.pid &&
               bundle exec rails server -b '0.0.0.0'"

    ports:
      - '3000:3000'
    environment:
      - 'DATABASE_PASSWORD=postgres'
    volumes:
      - .:/myapp
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db
  db:
    image: postgres:12
    platform: linux/amd64
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_PASSWORD=postgres'
      - 'POSTGRES_USER=postgres'

mac m1チップ環境ではplatform: linux/amd64を指定しないとエラーが出ると聞きましたので、明示的に指定しました。

これを指定すると動作が重くなってしまうという話も耳に入りましたが、今回は目を瞑ります。

start.shの作成

#!/bin/bash

docker compose build

docker-compose run --rm web rails db:prepare

docker-compose up

廉価版entrypoint.shのようなものです。ビルド、データベースの作成、サーバーの起動を行います。

このアイデアはいまいちで、せっかくならちゃんとENTRYPOINTで実装すべきでした。

実行

./start.sh

localhost:3000でサーバーが起動していれば完了です。これでRailsプロジェクトがDocker化されました。

以降はbuildが必要なければ、docker compose upで起動します。

おわりに

次は自分の開発環境をDocker化するか、課題を進めるか迷っています。もっとDockerの理解度を深めたいので前者にだいぶ傾いています。