DockerでRuby on Railsの環境構築をする方法

Dockerを使ってRuby on Railsの環境構築を試してみる機会があり、備忘録としてブログにまとめてみました。データベースはPostgresql version 12を使います。
なお、今回はGitHubからGit cloneしたリポジトリを元に編集しています。同じ方法で試したいけどGitHubの使い方が分からない場合は検索してみてください。
Ruby on Railspostgresqlについては知識がなくても大丈夫です。
環境変数のパスワードは個人で使うのでpostgresにしていますが他の人に見える場所なので個人使用でない方は注意しましょう。

Dockerの操作

vscodeでローカルにクローンしたリポジトリを開きその中に新規ファイル作成でDockerfileを作成します。中身を以下のように記入します。

FROM ruby:3.2.2

RUN apt-get update && apt-get install -y nodejs \
    && rm -rf /var/lib/apt/lists/* \
    postgresql-client \
    && rm -rf /var/lib/apt/lists/* \
    build-essential libpq-dev nodejs

WORKDIR /リポジトリ名

COPY Gemfile Gemfile.lock /リポジトリ名/

RUN bundle install

ADD . /リポジトリ名

リポジトリ内に新規ファイル作成でdocker-compose.yml作成。中身を記入します。

version: '3'

services:
 db:
  container_name: リポジトリ名-db
  image: postgres:12
  environment:
    POSTGRES_USER: postgres
    POSTGRES_PASSWORD: postgres
  volumes:
    - type: volume
      source: リポジトリ名-db-volume
      target: /var/lib/postgresql/data

 web:
  build:
    context: .
  command: bundle exec rails s -p 3000 -b '0.0.0.0'
  environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
  volumes:
    - type: bind
      source: .
      target: /myapp
  ports:
    - "3000:3000"
  depends_on:
    - db

volumes:
  リポジトリ名-db-volume:

rails-docker>config>database.ymlを編集します。
Windowsの場合Ctrl+pの後database.ymlと入力すればファイルの検索欄に表示されます。

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: <%= ENV['POSTGRES_USER'] %>
  password: <%= ENV['POSTGRES_PASSWORD'] %>
  port: 5432

Gemfile、Gemfile.lockの内容を念のため確認。使いたいバージョンになっているかなどを見ておきます。

全て終わったら

docker-compose buildでdocker imageを作成

docker-compose up -dでコンテナ作成とバックグラウンドでコンテナ起動

docker-compose exec web bashでコンテナに入る

rails db:createDBを作る

myapp_development myapp_testができたと表示される

rails db:mimgrateDBの更新

ブラウザでhttp://localhost:3000/ へ接続するとページが表示されているはずです。

止めたいときは Ctrl+cでコンテナから出ます。

Docker DesktopでコンテナをstopしExitedになったのを確認します

ターミナルでdocker psしてコンテナが停止(Exited)したか確認します

エラーが出るときは?

今回私が遭遇したエラー内容を自戒を込めて書いていきます。 service "db" refers to undefined volume rals-docker-db-volume: invalid compose project
この場合docker-compose.ymlのvolume rals-docker-db-volumeに何かあるということです。
よく見てみるとrails-docker-db-volumeとすべきところを rals-docker-db-volumeこのように書いていました。

他にもdocker-compose buildするときにエラーが起こりました。この時はDockerfile内のスペルミスやスペースがないなどでした。少しでも違うと進まなくなるのでエラー箇所をよく見てみましょう。

最後までご覧いただきありがとうございます!ご指摘などありましたらコメントいただけると嬉しいです。