3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VSCode + Docker + Docker-compose +Railsのデバッグの設定方法

Last updated at Posted at 2024-02-07

概要

Dev containerの環境を作らず、ステップ実行でデバッグが出来る環境を作成しました。今回は、その方法を記載します。

事前設定

以下がインストールされている事が前提です。

  • Docker Desktop
  • Visual Studio Code
  • VSCode rdbg Ruby Debugger

ディレクトリー構成

.
├── db/
│   ├── conf/
│   │   └── .env   
│   └── postgres_volume # ← コンテナー起動時に自動生成
├── web/
│   ├── vscode/
│   │   └── lanuch.json
│   ├── # rails関連のファイル
│   ├── Dockerfile
│   ├── Gemfile
│   └── Gemfile.lock
└── compose.yml

環境構築

  • Dockerfileの構成は下記
FROM ruby:3.2.2
ENV LANG=ja_JP.UTF-8
ENV TZ=Asia/Tokyo

RUN apt-get -y update && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /web
COPY Gemfile /web/Gemfile
COPY Gemfile.lock /web/Gemfile.lock

RUN bundle install
  • compose.ymlの構成は下記
    compose.ymlには、デバッグを行う為の設定を記述
    (dbg -n --open --host 0.0.0.0 --port 12345"12345:12345"がデバッグ用の設定となる)
compose.yml
version: "3.9"
services:
  db:
    container_name: pgsql
    image: postgres:latest
    env_file: ./db/conf/.env
    volumes:
      - ./db/postgres_volume:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    restart: always
  web:
    container_name: ruby_debug_environment
    build: ./web
    command: >
      bash -c "
        rm -f tmp/pids/server.pid &&
        bundle install &&
        rails db:migrate &&
        rdbg -n --open --host 0.0.0.0 --port 12345 -c -- bundle exec rails s -p 3000 -b '0.0.0.0'
      "
    volumes:
      - ./web:/web
    ports:
      - "3000:3000"
      - "12345:12345"
    depends_on:
      - db

  • DB用のenvファイルを作成する。 必要に応じて追加も可能
db/conf/.env
POSTGRES_USER=任意のユーザー名
POSTGRES_PASSWORD=任意のパスワード
POSTGRES_DB=任意のDB名
  • Gemfileを作成
source "https://rubygems.org"
# 最新バージョンにする事を推奨
gem "rails", "~> 7.1.3"
  • Railsの環境を作成するコマンド
docker compose run web rails new . --force --database=postgresql --skip-docker --skip-test
  • Gemfileに下記を記載する
    (Rspecdebugを追加)
group :development, :test do
  # デバッグ導入
  gem "debug"

  # Rspecの導入
  gem 'rspec-rails'
  gem 'factory_bot_rails'
end
  • 再度、ビルドを行う
docker compose build --no-cache 

# docker imageのnoneを消去
docker rmi $(docker images -f "dangling=true" -q)
  • database.ymldevelopmenttest.envで記載したDB情報を記載する
    ※ 下記は入力例
database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: # 任意のDB名
  username: # 任意のユーザー名
  password: # 任意のパスワード
  host: db # サービス名を記述する(基本はdb)
  port: 5432

test:
  <<: *default
  database: # 任意のDB名
  username: # 任意のユーザー名
  password: # 任意のパスワード
  host: db # サービス名を記述する
  port: 5432
  • DBを作成する
docker compose run web rails db:create 
  • コンテナーを立ち上げる
docker compose up -d 
  • Rspecを導入する
docker exec ruby_debug_environment bundle exec rails g rspec:install

Railsを構築する際に参考にした手順

デバッグの設定方法

launch.jsonの設定

  • 通常のデバッグとRspecのデバッグの設定をlaunch.jsonに記載する
  • Rspecのデバッグをする場合は、ローカル環境にRubyRailsが動作する環境を構築する必要があります
launch.json
{
    "version": "0.2.0",
    "configurations": [
        # 通常のデバッグ設定
        {
            "type": "rdbg",
            "name": "Debug Ruby",
            "request": "attach",
            "debugPort": "localhost:12345",
            "localfsMap": "/app:${workspaceFolder}",
        },
        # Rspecのデバッグ設定
        {
            "type": "rdbg",
            "name": "Debug Rspec with current file",
            "rdbgPath": "bundle exec rdbg",
            "request": "launch",
            "command": "rspec",
            "script": "${file}",
            "args": ["-p", "port番号"],
            "askParameters": true,
            "env": {
                "DATABASE_URL": "データベースの種類://DBのユーザー名:DBのパスワード@localhost:port番号/接続するデータベースの名"
            } 
        }
    ]
}
  • envに、Rspecで使用するテストDBの接続情報を記載する事で、Rspecのデバッグ起動時に、そのDBを参照する
  • DATABASE_URLには、/config/database.ymltestに記載した内容を記述する
# 入力例
"env": {
    "DATABASE_URL": "postgresql://root:postgres@localhost:5432/ruby_debug_development_test"
}

デバッグの実施方法

1. VScodeのメニューバーにある[ファイル]、[開く]の順に押下する
2. [web]を選択して、[開く]を押下する

画像1.png

3. 任意の場所にブレイクポイントを設置し、ステップ実行でデバッグを行う
画像2.png

  • エラーが表示されるが、ステップ実行でのデバッグに影響はない
  • 下記のエラーは、ローカル環境にgem 'debug'がない為、表示される。もし、このエラーを解消させるには、ローカル環境に直接RubyRailsが動作する環境を作成し、gem install debugを行う事で解消される
[Start session]
{
    "d":{},
    "f":"*********-****-****-****-***********","g":"rdbg","h":"Debug Ruby",
    "i":{
            "uri":{"$mid":1,
            "fsPath":"/to/path/ruby_debug_environment/web",
            "external":"file:////to/path/ruby_debug_environment/web",
            "path":"/to/path/ruby_debug_environment/web",
            "scheme":"file"
        },
        "name":"web",
        "index":0
    },
    "j":{
        "type":"rdbg",
        "name":"Debug Ruby",
        "request":"attach",
        "debugPort":"localhost:12345",
        "localfsMap":"/web:/to/path/ruby_debug_environment/web",
        "__configurationTarget":6,
        "rdbgExtensions":["traceInspector"],
        "rdbgInitialScripts":[]
    }
}
zsh:1: command not found: rdbg

Error: /bin/zsh -lic 'rdbg --version': exit code is 127
Make sure to install rdbg command (`gem install debug`).
If you are using bundler, write `gem 'debug'` in your Gemfile.

おまけ

コードの設定

  • routes.rbの設定
web/config/routes.rb
Rails.application.routes.draw do
  get "up", to: "rails/health#show", as: :rails_health_check
  get "cat_fact", to: "application#cat_fact"
end
  • controllerの設定
web/app/controllers/application_controller.rb
require 'faraday'
require 'json'

class ApplicationController < ActionController::Base
  def cat_fact
    url = 'https://catfact.ninja/fact'
    response = Faraday.get(url)

    if response.success?
      data = JSON.parse(response.body)
      render plain: data['fact']
    else
      render plain: "Error: #{response.status}"
    end
  rescue Faraday::ConnectionFailed => e
    render plain: "Error: #{e.message}"
  end
end
  • エンドポイント
http://localhost:3000/cat_fact

GitHub

感想

このデバッグ環境を作成するのは、凄く苦労しました。ただ、Rspecのデバッグに課題があるので、公式のドキュメントで何らかの動きがあれば、追記したいと考えています。
 このデバッグシステムを導入すると開発が凄く楽になるので、是非試して頂ければと思います。

参考記事

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?