Ruby on Rails の開発環境を Docker と IntelliJ Remote SDK で完結させる
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が必要になります。公式の手順を参考にしながら進めましょう。
まずはプロジェクトを作成したい空のディレクトリでDockerfileを用意します。このあたりは VSCode で進めています。
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
を作ります。
source 'https://rubygems.org'
gem 'rails', '~>6'
touch Gemfile.lock
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
です。公式の内容に従います。
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
を以下の内容に書き換えて…
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を利用するにあたり、若干不足していた公式の手順を修正し、起動できるところまで示しました。参考になれば幸いです。
Discussion