🐳

Ruby on Rails の開発環境を Docker と IntelliJ Remote SDK で完結させる

2021/02/28に公開

Ruby on Rails での Web API 開発を行う機会があったのですが、私は普段 TypeScript しか触っておらず、ローカルマシンには Ruby がインストールされていません。なんとかローカルマシンにインストールせずに完結できないか模索したところ、IntelliJ の Remote Ruby Interpreter が使えそうでした。この記事では Remote Interpreter を使って Rails の開発環境構築方法を紹介します。なお VSCode では Remote Container で同じことができそうです。

環境

ツール・ライブラリ バージョン
MacOS Catalina
Ruby docker hub ruby: 2.7
Ruby on Rails 6.1
IntelliJ 2020.3
Docker Desktop 3.1.0

内容

やる

  • docker-compose.ymlを作成してサンプルプロジェクトを rails new する
  • IntelliJで Docker上 の Ruby SDK を認識させる
  • IntelliJで RubyGems を認識させる

Quickstart: Compose and Rails| Dockerを参考に進めます。

やらない

  • IntelliJ でデバッグできるようにする
  • IntelliJ でテストを走らせられるようにする

テストはコマンドラインターミナルでの実行に一任します。

docker-compose.ymlを作成してサンプルプロジェクトを rails new する

サンプルプロジェクトを用意するために、早速RubyとRailsが必要になります。公式の手順を参考にしながら進めましょう。

Define the Project

まずはプロジェクトを作成したい空のディレクトリでDockerfileを用意します。このあたりは VSCode で進めています。

Dockerfile
FROM ruby:2.7
ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - &&\
    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 -qq && apt-get install -y nodejs yarn postgresql-client
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

次です。Dcokerコンテナをつくるときにホスト側のGemfileをひっぱってきてRailsをインストールする動きのようで、Gemfile と 空の Gemfiile.lock を作ります。

Gemfile
source 'https://rubygems.org'
gem 'rails', '~>6'
touch Gemfile.lock

entrypoint.shも必要そうです。

entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

仕上げに、docker-compose.yml です。公式の内容に従います。

docker-compose.yml
version: "3.9"
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

この状態で docker-compose run web rails new することでサンプルプロジェクトを生成します。

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

コマンドを実行したディレクトリに Ruby on Rails のファイル群が生成されたら完了です。

IntelliJで Docker 上の Ruby SDK を認識させる

Ruby SDK を利用するために、IntelliJ のSDK で Remote の Ruby インタープリターを構成する よう設定します。メニューバー > File > New > New Project としてあたらしいプロジェクトを作成します。先の手順ですでにRailsのファイル群を作成していますが、IntelliJ が「Railsのプロジェクトだ」と認識するために、既存のプロジェクトを開くのではなくこの手順を踏みます。

ここから、以下の画像のように Project SDK > Add Ruby SDK > New Remote... と選択していきます。


Remote SDKを追加する

さらに、Rubyインタプリタの設定画面になるので、以下のように設定します。

  • Docker compose
  • Server: Docker (New... したあとのデフォルト設定ままでOK)
  • Configuration files: 上記で作成した docker-compose.yml
  • Service: web
  • Environment variables: <empty>
  • Ruby or version manager path: ruby

設定が終わると Ruby SDK と Rails が設定された状態になると思うので、Next として作成したプロエジェクト名と場所を設定します。これでプロジェクトを作成します。なお、既存の Rails 設定を上書きするかどうか聞かれますが、「上書きしない」でOKです。

最後に、Ctrl を2回押して Run Anything を呼び出し、bundle installします。これを実行することで、docker-compose のruby経由で IntelliJ 側にgemがインストールされます。結果として、エディタ上でのコードジャンプやrequireの解決ができるようになります。

これでローカルマシンにRubyをインストールせずにIntelliJでRailsアプリの開発ができるようになりました。

Rails アプリを起動する

本筋から外れますが、せっかくここまでやったので、Dokcer本家の Connect the database からアプリを起動するところまでやってみます。

config/database.yml を以下の内容に書き換えて…

config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test

Docker を起動します。

docker-compose up

おそらく Webpacker configuration file not found というエラーが出ると思うので、以下実行します。ここで yarn が必要になります。

docker-compose run --no-deps web bundler exec rails webpacker:install

インストール後、起動します。

docker-compose up

問題なく起動できるはずです。データベースを作る手順が残っているので、別のターミナルで実行します。

docker-compose run web bundle exec rake db:create

localhost:3000 でようこそが表示されれば成功です。

まとめ

Dodcker上のRails6をIntelliJで開発可能なように Remote SDK を追加しました。これで Mac には Ruby をインストールせずに作業ができます。また、DockerでRails6を利用するにあたり、若干不足していた公式の手順を修正し、起動できるところまで示しました。参考になれば幸いです。

ソースコード

cm-wada-yusuke/rails6-docker-compose-sample

Discussion