Dockerを使ったrails開発環境を作成しよう

まえがき

説明の流れは、下記の記事で行っていきます。
ただ、環境が違いのせいかコピペでは、動作しませんでした。
そのため、自分用にファイルの中身を調整したものを使って動かしてます。

docs.docker.jp

※dockerとdocker-composeは、インストール前提で説明していきます。
 されていない方は、インストールをお願いします。

環境構築に必要なファイルを準備しよう

必要なファイル

  • Gemfile
  • Gemfile.lock (空のファイルです)
  • Dockerfile
  • docker-compose.yml

rubyrailsのバージョンは、自身が使いたいバージョン・既存のアプリケーションに合わせてください。

Gemfile

source 'https://rubygems.org'
gem 'rails', '~> 6.0'

Dockerfile

FROM node:18.16.0 as node

FROM ruby:3.0.2

ENV YARN_VERSION 1.22.19
RUN mkdir -p /opt
COPY --from=node /opt/yarn-v$YARN_VERSION /opt/yarn
COPY --from=node /usr/local/bin/node /usr/local/bin/
COPY --from=node /usr/local/lib/node_modules/ /usr/local/lib/node_modules/
RUN ln -s /opt/yarn/bin/yarn /usr/local/bin/yarn \
    && ln -s /opt/yarn/bin/yarn /usr/local/bin/yarnpkg \
    && ln -s /usr/local/bin/node /usr/local/bin/nodejs \
    && ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
    && ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npx

RUN apt-get update -qq \
    && apt-get install -y postgresql-client

WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install

EXPOSE 3000


どうせWebアプリをつくるなら、データベースも必要だよねってことで、PostgreSQLコンテナも用意します。

docker-compose.yml

version: '3'
services:
  db:
    image: postgres:15-alpine
    restart: always
    volumes:
      - postgres_volume:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=password
      - POSTGRES_HOST_AUTH_METHOD=trust
    ports:
      - "5432:5432"
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
volumes:
  postgres_volume:

テンプレートファイルの作成

※既存アプリケーションを使って、開発する人はこの手順は不要です。
以下のコマンドを実行してください

docker-compose run web rails new . --force --database=postgresql

データベース作成

起動前にデータベースは作成した方がいいです。

docker-compose run web rails db:create

起動

docker-compose up -d

ようやく起動しました。以下のURLにアクセスして下さい。
http://localhost:3000/

後書き

RubyRailsのバージョンが違うだけで、
bundle installがコンテナ内で実行できなかったり
コンテナ内のDBにうまく繋がらなかったりと試行錯誤の繰り返しでした。