目的
Dockerの稼働中のコンテナ内をデバッグする。
メリット
- Docker内であっても、デバッグできる。
- ブレークポイントを仕掛けて一行一行デバッグできる!
方法
今回は、Visual Studio Codeの拡張機能、Remote SSHを使用してDocker内のデバッグをする。
背景
前回、つよつよエンジニアからSSH接続を用いてVisualStudioCodeでデバッグする方法を教わった。
そのときに、ついでに、Docker内にも入ってのデバッグ方法を教えてもらった。
SSHで接続してVSCodeに持ち替えるだけでいっぱいいっぱいだったため、「後で読む」をクリックするがごとくスルーしていた。バグが起きた時に覚えればいいだろう、と思ったのだった。
そしてすぐにプログラムが動かなくなり、肩をたたかれることになった。
手順
- Visual Studio CodeでRemoteSSHの拡張機能をインストールする(初回のみ。)
-
Dev Containers
もインストールする(初回のみ。)
- デバッグ用コードを記述する。
docker-compose.yamlにデバッグ用のコードを記述する。
例えば、起動したら無限ループして待っておいてもらうようにする。
command: bash -c "while true; do sleep 1; done"
こんな感じである。
こうすると、DockerfileのCMD ["python", "./main.py"]
のコマンドをオーバライドしてbashの無限ループにおきかえることができる。
- docker compose up --buildでコンテナを起動する
docker compose up --build
を用いてコンテナを起動する。
(main.py
などが実行されない。)
- Remote SSHで接続する
VisualStudioCodeの左下に現れるオレンジのアイコンをクリックする。
Attach to Running Container
を実行し、目当てのコンテナを選んで起動する。
- コンテナ内にも、いろいろな拡張機能を入れる。
表側にデバッグ用の環境が入っていても、コンテナ内には入っていない。
改めてインストールする必要がある。
Python、Pylance(デバッグ用)、PythonDebugger(デバッグ用)、それとこっちにもRemote-SSHやDev Containersをいれよう。
- 目当てのフォルダを選択する
たとえば俺の環境の場合はcode
というフォルダにコード一式が入っている。
rootではない。
初回で、コード類がイマイチどこにあるかよくわからないならls
コマンドやcd
コマンドを駆使して探しても良い。
このあいだは、結構待たされるので、コーヒーなり紅茶なりエナドリなりを用意してじっくり待つとよいだろう。
- Run and Debugを実行する
左のメニューから、Run and Debugを実行する。
(※別の設定をいじっているため、私の環境だとわかりやすく紅に染まっている)
mainで止まるようにブレークポイントを仕掛けておく。
止まってくれた!
これで変数の中身を覗きたい放題になる。
いえーい。
どういうときに活躍したか
「なんか動かねぇけど何が原因なの? これ」という絶望をしたときにとても良い。
例えば、テスト用インスタンスでは動くのに、本番用インスタンスになると動いてくれない件についてで起こったトラブルを解消できた。
例外が起こっているのがQdrantの関数呼び出し時だということが(loggingやprintを用いなくても)わかったのだ。