Rubymine と dockerを 連携して デバッグ できるようにしてみた

Railsのプロジェクトにいくつか関わっているとRMagicとかのネイティブインストールするライブラリのバージョンに違いが出てきたりして、動かずハマるということがしばしばある。 そろそろ開発環境をプロジェクト毎に分けたいなー、と思い始めてきたのでDockerを導入してみた。

導入した環境はUbuntu 17.10、Rubymine 2018.1。(おそらくMacとか他の環境でもほとんど同じだと思う。)

設定はjetbrainsのマニュアル通りにすれば大丈夫だったけど、一応手順を記載。

1. Gemの追加

Gemfileに以下のGemを追加し、Rubymineからデバッグ実行できるように

gem 'debase'
gem 'ruby-debug-ide'

2. Dockerfile、docker-compose.ymlをRails.rootに作成

プロジェクト毎の設定を記載する。

  • Dockerfile
FROM ruby:2.3.3
RUN apt-get update -qq && \
    apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile .
ADD Gemfile.lock .
ENV BUNDLE_JOBS=4 \
    BUNDLE_PATH=/bundle
RUN bundle install
ADD . /myapp

Rubymine設定前に、以下のようなコマンドを実行してDocker Imageが作成するか確認しておくこと。

# Dockerfileをビルドして、Docker Imageを作る
docker build -t developer-name/project-name --no-cache=true .

# Docker Imageができたか確認する
docker images

同様にdocker-composeも設定する。

  • docker-compose.yml
version: '2'
services:
  app:
    build: .
    command: bundle exec rails s -p 3000 -b 0.0.0.0
    environment:
      RAILS_ENV: development
    ports:
      - '3000:3000'
    volumes:
      - .:/myapp

(version: '3'にすると動かなくなったので、version: '2'にしている)

docker-compose も動くか確認

# Dockerイメージを作成
docker-compose build

# コンテナの作成と開始
docker-compose up -d

# コンテナの停止
docker-compose down

3. Docke設定を追加

メニュー[File] => [Settings] => [Build, Execution, Development] => [Docker]に設定を追加。 f:id:graboros-dev:20180504221056p:plain 「Docker」等わかりやすい名前をつけて、「Unix socket」を選択。

Docker Deamonに繋がれば、添付のようにConnection Successfulと表示される。

4. Docker環境のRubyを使うように

もしハマるところがあるとすれば多分ここだけ。

メニュー[File] => [Settings] => [Ruby SDK and Gems]を選択。 [+]を選択して、[New Remote]を選択。

f:id:graboros-dev:20180504214908p:plain Serverに2. で作ったDockeを選択。 Configuration filesに1. で作ったdocker-compose.ymlを選択。 Serviceにdocker-compose.ymlで指定したサービス名を指定。

この段階でdocker-composeが動かない場合、Ruby interpriter pathの先が見つからず「Unable to detect full path for ruby」というようなエラーが表示されて???となるので、事前に手動で動くことを確認しておくこと。

5. デバッグ実行

f:id:graboros-dev:20180504225405p:plain

デバッグ実行してlocalhost:3000にアクセスする。ちゃんとブレークポイントに止まる。素晴らしい! ※最初からデバッグ実行したときにうまく動かないときがあるので、先に普通にRunしたほうが良い

補足

  1. Rubymineから初めてdebug実行したとき以下のようなエラーが表示されていた。 f:id:graboros-dev:20180517082341p:plain 調べてみるとdocoker-composeのバージョンが古いときに発生するエラーらしいので、試しにdocker-composeのバージョンを上げてみたら直った。

  2. ちなみに、Rubymineでデバッグ実行の設定する際にDockerコンテナがいくつかできていたので、以下のようにimageを元にdocker rmするコマンドを作ってみた。 まだあまり使っていないけど、便利そうな気がする。

docker rm $(docker ps -a | grep "docker-image-name" | awk '{print $1}')

(この行を消して、ここに「わたしの転機」について書いてください)

#わたしの転機

りっすん×はてなブログ特別お題キャンペーン「りっすんブログコンテスト〜わたしの転機〜」
Sponsored by イーアイデム