🛤️

Rails 6 + mongoidを動かすためのDocker構成

2021/11/13に公開

この記事では書かない前提

  • ローカル環境にruby, bundler, rails, dockerはインストール済みであること
  • rbenvなどを使ってrubyのバージョンを2.7.4にすること

参考文献

だいたい以下のURLの記事の内容をまとめているだけですが、この記事通りにやってもbundleとかyarnでハマります

RailsをActiveRecordなし、Testなしで生成

ポイント

  • mongoidを使うのならActiveRecordは無効にしなければならない
  • TestはRSpecで書きたいのでrails new時には生成させない
rails new myrail --skip-bundle --skip-active-record --skip-test --skip-system-test

Railsにmongoidを導入する

  • Gemfileに gem 'mongoid' を追記
  • bundle install する
  • bundle exec rails g mongoid:config する
  • config/mongoid.yml のdevelopmentのhostを mogodb:27017 に書き換える

Image from Gyazo

Railsを動かすためのDockerfileを書く

ポイント

  • Rails 6はyarnがないと実行時に壊れる
  • bundleコマンドにはpathを指定しないとおかしくなる

Dockerfile

FROM ruby:2.7.4-slim

WORKDIR /app

RUN apt-get update -y -qq && \
    apt-get install -y -qq \
      curl \
      git-core \
      build-essential \
      libmagickwand-dev \
      nodejs \
      && \
    rm -rf /var/lib/apt/lists/*

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
  echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
  apt-get update && apt-get install yarn && \
  rm -rf /var/lib/apt/lists/*

COPY Gemfile Gemfile.lock /app/
ENV BUNDLE_APP_CONFIG=.bundle BUNDLE_PATH=/bundle
RUN bundler version && bundle install --path=/bundle --jobs=4

COPY . /app/

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

CMD ["rails", "server", "-b", "0.0.0.0"]

entrypoint.sh

#!/bin/bash
set -e

rm -f /app/tmp/pids/server.pid
exec "$@"

RailsとMongoDBを同時に動かすためのdocker-compose.ymlを書く

docker-compose.yml

version: "3.9"
services:
  mongodb:
    image: mongo
    ports:
      - 27017:27017
    volumes:
      - mongodb:/data/db
    restart: unless-stopped
    networks:
      - myrail
  rails:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    env_file:
      - .env
    volumes:
      - .:/app
      - bundle:/bundle
    ports:
      - 3000:3000
    depends_on:
      - mongodb
    networks:
      - myrail

volumes:
  mongodb:
    driver: local
  bundle:
    driver: local

networks:
  myrail:
    name: myrail

mongoidでModelを作る

以上です。

Discussion