【VSCode】Docker上で動くPythonに接続してリモートデバッグする方法ここあんぐるここから見えるモノ、やれるコトを。アプリDockerコンテナ上で実行されているpythonプログラムでもステップ実行(リモートデバッグ)できれば開発効率が向上します。Code(VSCode)と「ptvsd」というMicrosoftが開発するリモートデバッグ用ライブラリを組み合わせるとそれが可能になるので、その環境を構築してみました。私の環境は以下の通りです。Macなどで、Dockerコンテナをローカルマシンで起動できることを前提として話を進めます。DockerのホストOSがWindowsでも、同様の流れでリモートデバッグが可能です。Python」をインストール前回の記事を参考に、以下をホストOSにインストールします。【VSCode】Pythonを1行毎に変数の中身見ながらステップ実行する方法VSCodeでPythonプログラムをステップ実行するための環境構築の手順をまとめました。ステップ実行ができると、プログラムの動きを把握しやすくなります。ブレークポイントやショートカットを駆使できるとより効率的にデバッグできます。18:13サンプルプログラムを作成する概要(ディレクトリ構成)ローカル側に以下のディレクトリ構成でファイルを作成し、VSCodeでこのディレクトリを開きます。sample.py後述するコンテナ起動時に、この構成をリモート側にそのままマウントします。sample.pyリモートデバッグにおけるローカル側とリモート側のpyファイルの役割は、以下の通りです。書かれたプログラムを実行する今回はマウントする方針ですが、sample.pyをDockerfileのCOPYコマンドなどでコピーしてもリモートデバッグは可能です。同一のディレクトリ構成で、同一のプログラムファイルがローカル側とリモート側の双方に存在することが重要です。Dockerfile以下の環境のコンテナを起動するDockerfileを作成します。"/opt/app/sample.py"]ptvsdのバージョンは3.0.0である必要があります。これ以降のバージョンはまだサポートされておらず、正常に動きません。sample.py例として、以下をサンプルプログラムとして使用します。file.read()print(content)file.close()これがやっていることをプログラム中のコメントに書こうとしましたが、長くなるので以下に記します。1〜4行目ライブラリ「ptvsd」を使用して、リモートデバッグの準備をしています。2行目で、pythonプログラムが外部(ポート番号3000で任意のIPアドレス)からアタッチ(リモートデバッグの開始)されるのを許可しています。3〜4行目で、アタッチされるのを待機して、アタッチされたら次の行(6行目)で強制的にブレーク(処理を停止)させています。ついてアタッチの待機が不要の場合、両方とも削除可能です。今回はリモートデバッグでブレークさせる説明のため採用しています。wait_for_attach()のみだと、その直後の行にブレークポイントを設置してもブレークしません(ブレークできるようになるまで少し時間がかかる)。この2つのメソッドが必要な理由は、こちらのissueを参照ください。6行目以降ここから実際に動かしたいプログラムを書きます。やっていることは、ゲストOSの/etc/os-releaseの中身(LinuxOSのバージョン情報)を表示しているだけです。/etc/os-release)と同一の内容を表示します。v3.7"HOME_URL="http://alpinelinux.org"BUG_REPORT_URL="http://bugs.alpinelinux.org"$構成(launch.json)を修正するVSCodeでローカル側とリモート側にあるpyファイルのディレクトリ位置をそれぞれ設定します。どのファイルとどのファイルが同一のものであるか、リモートデバッグするために必要な情報です。[Python]を選択します。開いているディレクトリ配下に.vscode/launch.jsonが自動生成され、VSCodeに表示されます。以下のように赤文字の部分を修正すればOKです。使用して利用可能な属性を学べます。既存の属性の説明をホバーして表示します。{...省略...コンテナにlocalhost以外でアクセスする場合は、"host"にコンテナのIPアドレス(192.168.x.xなど)やドメイン(xxx.localなど)を設定します。Dockerコンテナを起動するDocker上でpythonプログラムを実行させるために、コンテナを起動します。83.4MB$ビルドしたイメージからコンテナを起動オプションを使って、以下の設定でコンテナを起動する。sample_container$これで前述したsample.pyがコンテナ内で実行され、ptvsd.wait_for_attach()の行でアタッチ待機の状態になりました。Dockerコンテナ上のプログラムにリモートデバッグする初回のリモートデバッグVSCodeで以下の操作をします。Attach」を選択ひとつ上の「Python」を選択すると、ローカルデバッグ(ホストOS上でpythonを実行)になってしまうので注意。ここまでの設定がうまく出来ているとリモート側でアタッチ待機しているプログラムに接続され、リモートプログラムの動作をVSCodeで操作可能になります。以下のようにptvsd.break_into_debugger()の次の行でブレークされます。9行目まで処理を進めると、変数contentにマウスカーソルを重ねるとその中身が見れたり、print文でAlpineOSのバージョン情報がデバッグコンソールに出力されます。(下記画像は冒頭のものと同一です。)F5を押してsample.pyの実行を完了させると、コンテナのSTATUSがExitedになって終了します。sample_container$2回目以降のリモートデバッグ以下の操作を繰り返してプログラムを開発していくことができます。プログラム修正コンテナ起動(=プログラム実行)リモートデバッグプログラムを修正する今度はファイルの中身の1行目だけを読み出すように、sample.pyの7行目をfile.read()からfile.readline()に修正してみました。再度、コンテナを起動するプログラムを修正後、以下のコマンドでコンテナを再度起動して、リモートプログラムを実行させます。sample_container$再度、リモートデバッグする今度はF5を押して、リモートプログラムにアタッチします。Attach」を選択したのと同じ操作になります。修正した通り、/etc/os-releaseの1行目だけが出力されるようになりました。このような流れで、VSCodeを使ってDocker上で実行されるプログラムを修正しながら、リモートデバッグが可能です。まとめローカルマシンで動くDockerコンテナ上で実行されているpythonプログラムを、VSCodeでリモートデバッグする手順をまとめました。今まではリモートで動くpythonプログラムの変数の中身を確認する方法はログ出力くらいしか無いと思っていましたが、これで開発がかなり効率化できます。VSCode、なかなか使えそうです。【SourceTree】「ファイルのサイズまたは形式のためdiffを止めた」からdiffを表示させる方法SourceTreeで「ファイルのサイズまたは形式のためdiffを止めた」というエラーが出た時の対処法をまとめました。サイズ制限の値を増加させる方法か、外部Diffツールを使う方法が有効です。記事を読む【Gmail】狭いサイドバーの幅を広げるには「Stylish」が使えるGoogle拡張機能「Stylish」で、Gmailの狭いサイドバーの幅を広げて、ラベルが途切れず見えるようにする使い方をまとめました。Stylishは見ているサイトのCSSにスタイルを追加して、サイトのデザインを一部変更できるツールです。記事を読む【Mac】Atomエディタの挙動が変でアンインストールしたら動いたMacのAtomを完全にアンインストールするには、アプリケーションディレクトリにあるAtom.appを削除するだけでは不足です。様々なディレクトリに散らばっている関連ファイルを削除する必要があるため、それらをまとめました。記事を読む【SourceTree】diffツール「P4Merge」で差分を横並びで表示させる方法SourceTreeの見にくい縦並びのdiffの表示ですが、Diff外部ツールとして「P4Merge」を使うと横並びで画面いっぱいにdiffを表示でき、両者のコードを効率よく比較することができます。記事を読む【Atom】Markdownで書けないテーブル縦横結合をTextileでリアルタイムプレビューさせる方法ブラウザまたはAtomでテーブル縦横のセル結合をTextile記法で書いてリアルタイムプレビューする手順をまとめました。TextileはMarkdownと同様、文書からHTMLに変換でき、Markdownに比べて表現の幅が広いです。する手順をまとめました。Chromeの検索履歴に比べ日付指定をして履歴の検索をすることが可能で、Googleアカウントを作成した当時の検索履歴も見ることができます。記事を読む【Atom】テキストのみで書いたUMLを「PlantUML」でリアルタイムプレビューさせる方法AtomでPlantUML形式のコードをリアルタイムプレビューさせる環境の構築手順をまとめました。テキストのみで書くためgitで管理がしやすいです。パーツの位置は自動調整され、リアルタイムでUMLを確認できるので、UML作成が捗ります。Macの共有ディレクトリを設定して、vオプションでコンテナ内から参照する手順をまとめました。Macにあるファイルをコンテナからアクセスするには、共有ディレクトリを設定する必要があります。GUIを操作するだけで簡単です。記事を読む【Mac】Evernoteでダブルクォートの意図しない自動変換を無効にする方法Evernoteやテキストエディットでダブルクォートなどが自動変換されてしまう時は、Mac側の設定から「スマート引用符とスマートダッシュを使用」のチェックをオフにするだけでこれを無効化できます。記事を読む見えない文字「U+0008」の潜伏場所をSublimeTextとCotEditorで暴く方法テキストエディタ「SublimeText」と「CotEditor」を使い、「U+0008」という見えない文字を探してエラーを解消できました。それぞれのエディタは文字の位置とUnicodeのコードポイントを表示する機能があります。コメントをキャンセルメールアドレスが公開されることはありません。