「ruby on rails」開発環境(「WSL2」の「docker compose」で動作)にてリモートデバッグを使えるようにした話
はじめに
諸事情があり、
ruby '3.1.2'
'rails', '~> 7.0.3'
と古めのため
新しめのバージョンだと若干、変わるかもしれません。
すいません、詳しくは、わかってません。
現時点でわかったことだけ、記述しました。
今後、詳しくわかれば、加筆、修正するかもしれません。
各種構成
「.env」と「.env.example」を作成した
プロジェクトルートの直下に、
- .env
- .env.example
を作成した「.env」は「.gitignore」に追加した
.gitignore
(抜粋)
.idea
.DS_Store
.vscode
.env
.env.example
WORKSPACE_PATH=/path/to/your/workspace
.envは、同じフォーマットで、/path/to/your/workspaceの部分を
実際値とした。
なのですが、この記事では、
プロジェクトルートのフォルダを「/path/to/your/workspace」として
説明を書くこととする
この環境変数「WORKSPACE_PATH」は、
後述の「docker-compose.yml」で利用可能な状態として
実際に利用しているのは、後述の「Procfile.dev」である。
docker-compose.yml
- 12345ポートの追加
- 「foreman start」に「-f Procfile.dev」を追加
- 「environment:」に「- WORKSPACE_PATH=${WORKSPACE_PATH}」を追加した
対応前(該当箇所抜粋)
app:
build: .
volumes:
- .:/app
ports:
- "3000:3000"
command: bash -c "bundle install && bundle exec foreman start"
depends_on:
- mailcatcher
- redis
environment:
- TZ=Asia/Tokyo
対応後(該当箇所抜粋)
app:
build: .
volumes:
- .:/app
ports:
- "3000:3000"
- "12345:12345" # ★ rdbg用のデバッグポート
command: bash -c "bundle install && bundle exec foreman start -f Procfile.dev"
depends_on:
- mailcatcher
- redis
environment:
- TZ=Asia/Tokyo
- WORKSPACE_PATH=${WORKSPACE_PATH}
Procfile.dev
Procfile.devをプロジェクトルートの直下 ( docker-compose.ymlと同じ位置 )
に作って下記の中身にした
web: bash -lc 'printf "config set :no_quit true\nconfig set :map /app ${WORKSPACE_PATH}\n" > /tmp/rdbg.init && exec bundle exec rdbg -n -O --open --host 0.0.0.0 --port 12345 -x /tmp/rdbg.init -- bin/rails s -b 0.0.0.0 -p 3000'
sidekiq: bundle exec sidekiq -q default
docker-compose.ymlに
volumes:
- .:/app
の記述があるため、
rdbgデバッガーが、例として
コンテナ側のパス
/app/app/controllers/xxxx_controller.rb
が
ホスト側のパス
/path/to/your/workspace/app/controllers/xxxx_controller.rb
に対応していることを理解しなければならない
そのためのパスマッピングの設定が必要である
config set :map /app ${WORKSPACE_PATH}
の部分がそれに該当し、
${WORKSPACE_PATH}の値は、/path/to/your/workspace などとなり
実際の値は、.envに書いておくことにしている。
具体的な設定値は、/tmp/rdbg.init に書き込まれることとなり
それを読み込んだ、「exec bundle exec rdbg なにがし」の
内部として「bin/rails s -b 0.0.0.0 -p 3000」が起動するような構成にしてある。
Procfile
が下記の通り、存在し、「sidekiq: bundle exec sidekiq -q default」
の部分は、上記のProcfile.devではそのまま持ってきた
web: bin/rails s -p 3000 -b 0.0.0.0
sidekiq: bundle exec sidekiq -q default
Gemfile
group :development, :test do
の内部に、「gem 'debug'」の記述が必要であるとのこと
<抜粋>
group :development, :test do
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
gem 'debug', '~> 1.11.0', platforms: %i[mri mingw x64_mingw]
launch.json
{
"version": "0.2.0",
"configurations": [
{
"type": "rdbg",
"name": "Attach: Rails in Docker",
"request": "attach",
"rdbgPath": "rdbg",
"debugPort": "127.0.0.1:12345",
"localfsMap": "/app:${workspaceFolder}"
}
]
}
VS Code拡張機能
どれが決め手でデバッガーが動いたのか不明です
を入れた状況で
デバッガーの動作に成功しました。
Discussion