MoriKen's Journal

MoriKen's Journal

アラサー社会人博士による徒然日記。技術についてつらつら。だけだとコンテンツが貧弱なので、会社公認で大学院博士課程に進学した経緯や、独学でTOEICを475→910にしたノウハウを共有します。

起動中の Docker コンテナに VSCode から接続して Python コードを「ローカル側から」デバッグする

Sponsored Link

下記事では、Docker コンテナ内から直接デバッグ対象のプログラムをデバッグ実行する方法を記載しました。

www.moriken254.com

ところが、ユースケースというのは増えるものです。コンテナで実行しているプログラムを、リモートからデバッグしたいという場面もあったりします。

その方法も忘れないうちに。

前提

すでに対象の Docker コンテナは起動済みであるとします。また、「ローカル側から」アタッチしてコードをデバッグすることを想定します。

リモートマシンとローカルマシンでの環境構築は、下記を参考に行いました。

qiita.com

リモート側で大事なこと

コード内に直接下記を挿入します。好きなところに入れられるので、割と便利です。

        import ptvsd
        print("waiting...")
        ptvsd.enable_attach()
        ptvsd.wait_for_attach()

launch.json にリモートアタッチ用の設定を追加

リモートアタッチ用のコンフィグレーションを追加します。

例によって、VSCode 左側のメニューから、下図の項目を選択します。

Select Debug Configuration が表示されたら、Remote Attach を選択します。

Remote Debugging (1/2) にて、リモートの IP アドレスを入力します。同一 PC なら、まずlocalhostで大丈夫です。

Remote Debugging (2/2) にて、ポート番号を入力します。空いていればなんでも良いので、デフォルトの 5678 で大丈夫です。

これで、デフォルトのコンフィグレーションが追加されます。

        {
            "name": "Python: Attach",
            "type": "python",
            "request": "attach",
            "connect": {
                "host": "localhost",
                "port": 5678,
            }
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}", 
                    "remoteRoot": "."
                }
            ],
            "justMyCode": false,
        },

launch.json を調整

実際に動作させる環境に合わせて、微調整が必要です。

"localRoot" がターゲットのコードのパスと異なると、break point をセットしてもキャッチされません。

よくあるのが、VSCode はリポジトリのルートディレクトリで開いているけど、デバッグしたいコードは結構下層のプロジェクトフォルダの中だったりする、というケース。

このような場合、ターゲットのコードがエントリポイントなら、"localRoot" を ${workspaceFolder} に書き換えることで、コードがあるフォルダを動的に指定することができます。

基本的な変数は下記に記載されていました。

qiita.com

用意されている変数でうまくいかないときは、任意の絶対パスに書き換えることで対応も可能です。

デバッグ実行

まずは、リモートで対象コードを実行します。

waiting... と表示されたら、準備完了です。

ローカル側で対象コードの任意の行に break point をつけて、デバッグ実行してみましょう。catch に成功するはずです。

あとは、ライブラリ内のデバッグもしたいなら、"justMyCode" の設定を false にすることも忘れずに。

www.moriken254.com