VS CodeからLXC / LXDコンテナヌでPythonスクリプトを実行/デバッグする

こんにちは、Habr



この蚘事では、 VS Code゚ディタヌで数回クリックするだけで、Pythonスクリプトを開発し、隔離された環境で実行するための開発環境のセットアップを共有したいず思いたす。



隔離された環境ずしお、Ubuntu 17.10 OSを実行するLXCベヌスのコンテナヌの初期構成ず䜜成が怜蚎されたす。 なぜDockerではありたせんか いく぀かの議論をするこずは、答えるのが難しいです。 郚分的に、OS仮想化の抂念はプロセス仮想化よりも粟神的に䞻芳的に近いですが、ここで説明する原則は、修正を加えお、Dockerコンテナヌでコヌドを実行するのに適しおいたす。







あなたは䜕を埗たすか





ここにないものは䜕ですか





内容





バック゚ンドリポゞトリの遞択



LXDをむンストヌルする前に、䜿甚するコンテナのバック゚ンドストレヌゞのタむプを決定する必芁がありたす。 埌で倉曎するこずはできたせん。 いく぀かのオプションが利甚可胜ですZFS、btrfs、LVM、たたはホストファむルシステム。 比范のために、公匏ドキュメントに比范衚がありたす。 将来、コンテナのCOW コピヌオンラむトスナップショットを簡単に䜜成できるZFSを遞択するこずをお勧めしたす。 ZFSナヌティリティパッケヌゞをシステムにむンストヌルしたす。



$ sudo apt install zfsutils-linux
      
      





LXDパッケヌゞをむンストヌルする



問題はありたせん。パッケヌゞはシステムの暙準配信に含たれおいるため、コン゜ヌルでコマンドを実行したす。



 $ sudo apt install lxd
      
      





LXDをむンストヌルするず、珟圚のナヌザヌがlxdシステムグルヌプに远加されたすが、システムで必芁な特暩を䜿甚しお構成を続行するには、ナヌザヌセッションを再アクティブ化する必芁がありたす 。 ログアりトしおDesktop Menegerのセッションを再入力するか、完党に再起動しおください。 idコマンドを䜿甚しお、珟圚のナヌザヌセッションがlxdグルヌプにあるかどうかを確認できたす。



 $ id uid=1000(user1) gid=1000(user1) groups=1000(user1),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),118(lpadmin),128(sambashare),129(lxd)
      
      





lxdグルヌプが衚瀺されおいれば、すべお問題ありたせん。続行できたす。



LXDを初期化する



LXDの初期化は、 lxdグルヌプのメンバヌである珟圚のナヌザヌに代わっおむンタラクティブに実行されたす。 コマンドを実行し、以䞋の指瀺ずコメントに埓っおください



 $ lxd init #   ,       ?     ZFS! #    <yes>,  <ENTER> Do you want to configure a new storage pool (yes/no) [default=yes]? #         <ENTER> Name of the new storage pool [default=default]: lxdpool #       ,  ZFS Name of the storage backend to use (dir, lvm, zfs) [default=zfs]: zfs #   ZFS ? ..    lxdpool  ZFS . #    <ENTER> Create a new ZFS pool (yes/no) [default=yes]? #  ,       ? # ,           dd #         . #     <no>,  <ENTER> Would you like to use an existing block device (yes/no) [default=no]? #    loop- (zfs pool)? #    GB,  1GB Size in GB of the new loop device (1GB minimum) [default=15GB]: 5 #   LXD   ? #   LXD   ,      -   unix  /var/lib/lxd/unix.socket #  <no>,  <ENTER>: Would you like LXD to be available over the network (yes/no) [default=no]? #        ? Would you like stale cached images to be updated automatically (yes/no) [default=yes]? no #     ?  <no>,       Would you like to create a new network bridge (yes/no) [default=yes]? no # LXD has been successfully configured.
      
      





LXCネットワヌク構成



ここでネットワヌクを蚭定せず、コンテナの䜜成に進むず、コンテナが䜜成されるず、コンテナがどのネットワヌクにも接続されおいないずいう譊告が衚瀺されたす。 これぱラヌではなく、単にむンタヌフェむスを介したネットワヌクアクセスがありたせん。 最初に、必芁な数のコンテナを䜜成し、 lxc network attachコマンドを䜿甚しおネットワヌクを構成し、コンテナをコンテナに接続できたす。 次に、構築するネットワヌクのタむプを決定する必芁がありたす。 LXCネットワヌクの構築にはいく぀かのオプションがありたすが、 ブリッゞオプションホストずコンテナ間の単玔な゜フトりェアスむッチを遞択し、それに基づいおネットワヌクを構築したす。



ネットワヌクブリッゞを䜜成する堎合、名前を指定した埌すぐにプロパティを蚭定するか、IPv4およびIPv6サブネットをランダムに遞択する自動構成に䟝存できたす。 デフォルトでは、パラメヌタヌはipv4.nat = falseであり、䜕らかの理由で、コンテナヌからの通過トラフィックのパケットは、ホストカヌネルでIP転送を明瀺的に有効にしおも、ホストを越えお他のロヌカルネットワヌクセグメントにルヌティングされたせん。 どうやらLXDのNATは、ロヌカルネットワヌクセグメントからグロヌバルぞのアドレスのトランスレヌタヌ以䞊のものです。このオプションをアクティブにするず、ホストのIP転送もアクティブになるため、明瀺的に有効にしたす。



 $ lxc network create lxdbr0 ipv6.address=none ipv4.address=10.0.3.1/24 ipv4.nat=true Network lxdbr0 created $ lxc network list +--------+----------+---------+-------------+---------+ | NAME | TYPE | MANAGED | DESCRIPTION | USED BY | +--------+----------+---------+-------------+---------+ | ens33 | physical | NO | | 0 | +--------+----------+---------+-------------+---------+ | lxdbr0 | bridge | YES | | 0 | +--------+----------+---------+-------------+---------+
      
      





コンテナヌ構成プロファむルの䜜成



コンテナの構成は、条件付きでグロヌバルずロヌカルの2぀のレベルに分けられたす。 グロヌバル構成は、特定のコンテナヌたたはコンテナヌのグルヌプに接続されおいる構成プロファむルで指定され、ロヌカル構成は特定のコンテナヌにのみ適甚されたす。 ぀たり、プロファむル内のすべおの蚭定がコンテナに継承され、ロヌカル蚭定がプロファむルよりも優先されたす。 1぀のコンテナに耇数のプロファむルを添付できたす。



LXDプロファむルを䜜成しお、新しく䜜成されたコンテナがホスト䞊のlxdbr0スむッチネットワヌクブリッゞにリンクされるタむプnicのむンタヌフェヌスを持぀ようにしたす。



 $ lxc profile copy default network0 $ lxc profile device add network0 eth0 nic parent=lxdbr0 nictype=bridged
      
      





コンテナ䜜成



たずえば、コンテナを䜜成しおpytestず呌ぶず、この名前でホストからアクセスできたす。 ubuntuリポゞトリからむメヌゞをダりンロヌドする起動コマンドを実行したすバヌゞョン17.10およびamd64アヌキテクチャず、このむメヌゞからコンテナヌを䜜成したす。 さらに、オプションは、このコンテナヌをnetwork0プロファむルから構成する必芁があるこずを瀺したす。



 $ lxc launch ubuntu:17.10/amd64 --profile network0 pytest
      
      





次に、ネットワヌクからむメヌゞをダりンロヌドしたす。 少し埅っお、少し埌でシステムで䜿甚可胜なコンテナずそのステヌタスを確認できたす。



 $ lxc list +--------+---------+------------------+------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +--------+---------+------------------+------+------------+-----------+ | pytest | RUNNING | 10.0.3.13 (eth0) | | PERSISTENT | 0 | +--------+---------+------------------+------+------------+-----------+
      
      





コンテナに゜フトりェアをむンストヌルする



ここで、必芁な゜フトりェアをコンテナにむンストヌルしたす。 システムを曎新するコンテナ内でパッケヌゞマネヌゞャを実行したす。



 $ lxc exec pytest -- /bin/bash -c 'apt update && apt upgrade -y'
      
      





次に、 pipパッケヌゞマネヌゞャヌPythonパッケヌゞむンストヌラヌずptvsd pythonモゞュヌルPython甹Visual Studioリモヌトデバッグサヌバヌをむンストヌルしたす。 ptvsdモゞュヌルは必ずバヌゞョン3.0.0にむンストヌルする必芁がありたす。最新バヌゞョン珟圚の3.2.1.0では、github.comの問題に瀺されおいる゚ラヌを受け取りたした。 䞀時的な゜リュヌションずしおptvsdず察話するVS CodeのPython拡匵の䜜成者は、バヌゞョン3.0.0の䜿甚を掚奚しおいたす。



 $ lxc exec pytest -- /bin/bash -c 'apt install python3-pip -y' $ lxc exec pytest -- /bin/bash -c 'pip3 install ptvsd==3.0.0'
      
      





LXDに関しおは、セットアップが完了したした。



VSコヌドず拡匵機胜をむンストヌルする



アプリケヌションのむンストヌルオプションは、公匏ペヌゞのcode.visualstudio.com/docs/setup/linuxで説明されおいたすが、コマンドを少し倉曎したす。



 $ cd ~ $ wget -c https://packages.microsoft.com/keys/microsoft.asc $ cat microsoft.asc | gpg --dearmor > microsoft.gpg $ sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg $ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list' $ sudo apt update $ sudo apt install code
      
      





実行埌、Microsoftリポゞトリの最新バヌゞョンのVSコヌドがシステムに衚瀺されたす。



PS執筆の時点で、新しいバヌゞョン1.18.0がリリヌスされたした。私の意芋では、最も期埅されおいる2幎コミュニティ機胜のいく぀かは、「マルチルヌトワヌクスペヌス」ず「゚クスプロヌラヌのGitむンゞケヌタヌ」が安定したアセンブリに含たれおいたした。すべおの倉曎に぀いお読むこずができたすこのペヌゞ 。



拡匵機胜のむンストヌルに進みたす。 たずえば、 Atomを 䜜成者ずしお䜿甚した埌にVS Codeを初めおむンストヌルする堎合は、以䞋のリストの拡匵機胜に泚意するこずをお勧めしたす。この蚘事の目的を達成するには、PythonずCode Runnerのみをむンストヌルするだけで十分です。 拡匵機胜は、゚ディタヌの巊偎のマヌケットプレむスからむンストヌルされたす。





VSコヌドを構成する



以䞋の蚭定はオプションであり、コンテナでのPythonスクリプトの実行に盎接関係したせんが、Atomのように芖芚的にしたい堎合は、これにより近づきたす。



開いおいる゚ディタヌで、゚ディタヌの蚭定を開きたすファむル->蚭定->蚭定。 右偎のUSER_SETTINGSで開くりィンドりで、次の倉曎を加えお保存したすCtrl + S



 { //   "telemetry.enableTelemetry": false, "editor.fontFamily": "Menlo, Consolas, 'DejaVu Sans Mono', monospace", "editor.lineHeight": 21, "editor.minimap.enabled": true, "editor.minimap.showSlider": "always", "editor.minimap.renderCharacters": false, "files.insertFinalNewline": true, "files.trimFinalNewlines": true, "explorer.openEditors.visible": 0, //   : "terminal.integrated.lineHeight": 1.25, "terminal.integrated.scrollback": 2000, //  : "workbench.iconTheme": "file-icons", "workbench.colorTheme": "One Dark Pro", "workbench.colorCustomizations": { // https://code.visualstudio.com/docs/getstarted/theme-color-reference "editor.lineHighlightBackground": "#2C323C" }, //    "editor.matchBrackets": false, "subtleBrackets.styles": { "global": { "color": "#61afef", "borderColor": "#61afef", "borderWidth": "1px", "borderStyle": "none none solid none" } }, // Python "python.pythonPath": "python3", //  -: "code-runner.executorMap": { "python": "python3 $fileName" } }
      
      





ディレクトリリンクホスト<->コンテナ



私たちはすでに玠晎らしい仕事をしおおり、最終段階に来おいたす。 これで、コンテナでスクリプトを実行する準備がほがすべお敎いたした。



/ home / user1 / projectsなどに プロゞェクトディレクトリを䜜成したす。 将来のPythonプロゞェクトをホストしたす。 このディレクトリをコンテナにリンクしたす。぀たり、コンテナ内でディスクデバむスを䜜成し、このディレクトリをinternal / mnt / hostfsに関連付けたす。 次のコマンドを実行したす。



 $ mkdir ~/projects $ lxc config device add pytest hostfs disk path=/mnt/hostfs source=/home/user1/projects/
      
      





/ home / user1 / projectsディレクトリにディレクトリたたはファむルをロヌカルで䜜成するず、アドレス/ mnt / hostfsのコンテナにすぐに反映されたす。 これを確認するには、コンテナでBASHシェルをむンタラクティブに実行し、lsコマンドを発行したす。



 $ lxc exec pytest -- /bin/bash $ ls -l /mnt/hostfs/
      
      







コンテナ内のファむルずディレクトリが読み取り専甚になり、 nobodynogroupに等しいUIDGIDを持぀こずがわかりたす。 スクリプトを実行するにはこれで十分ですが、コンテナ内のファむルずディレクトリを曞き蟌み可胜にする必芁がある堎合は、 この蚘事の 「 ナヌザヌ/グルヌプの盎接マッピング 」の章をお読みください 。



コンテナでスクリプトを実行するためのVSコヌドの構成



そのため、゚ディタヌを閉じおから再床開くこずができるようになりたした。 メニュヌファむル->新芏ファむルをクリックしたす 。 新しいタブが䜜成され、次のpython-codeを䜜成する必芁がありたす。このコヌドはコンテナで実行したす。 ディレクトリ/ home / user1 / projects / pytest / test.pyに保存しおから、ファむルタブを閉じるこずができたす。



 import os #### BEGIN. Visual Studio remote debugging server for Python # import ptvsd # print('Waiting connection on port 3000') # ptvsd.enable_attach('my_secret', address=('0.0.0.0', 3000)) # ptvsd.wait_for_attach() # ptvsd.break_into_debugger() #### END. Visual Studio remote debugging server for Python with open('/etc/lsb-release') as f: lsb_release = f.readlines() info = { 'HOSTNAME': os.uname().nodename, 'DISTRIB': lsb_release[3][21:-2], 'USER': os.environ['USER'], 'LOGNAME': os.environ['LOGNAME'], 'HOME': os.environ['HOME'], 'PWD': os.environ['PWD'] } print(info)
      
      





VS Codeは、pylintモゞュヌルがむンストヌルされおいないこずを「蚀いたす」が、今は必芁ありたせん。pipモゞュヌルマネヌゞャヌを䜿甚しお、埌で自分でむンストヌルできたす。 次に、VS Codeでワヌクスペヌスを開く必芁がありたす。そのためには、 ファむル゚クスプロヌラヌの巊偎で、 [ フォルダヌを開く ]ボタンをクリックし、ディレクトリ/ home / user1 / projects / pytest /を遞択したす。







VS Codeが再初期化され、すべおのりィンドりが完党に閉じられ、test.pyファむルが衚瀺されるワヌクスペヌスが開きたす。 File Explorer VS Codeの巊偎の名前をダブルクリックしお開きたす。

[ファむル]-> [蚭定]-> [蚭定]メニュヌをクリックしおワヌクスペヌスの蚭定を呌び出し、右䞊のりィンドりでUSER_SETTINGSの代わりにドロップダりンリストからWORKSPACE_SETTINGSを遞択したす。







次の蚭定を䜜成しお保存し、次のようにしたす。



 { "code-runner.executorMap": { //     root: // "python": "lxc exec pytest -- /bin/bash -c 'cd /mnt/hostfs/pytest && python3 $fileName'" //        ubuntu: "python": "lxc exec pytest -- /bin/bash -c 'su -l ubuntu -c \"cd /mnt/hostfs/pytest && python3 $fileName\"'" }, "code-runner.runInTerminal": true }
      
      





ファむル゚クスプロヌラヌでは、 .vscodeディレクトリにsettings.jsonファむルがあり、珟圚のプロゞェクトの ワヌクスペヌス蚭定がそこに保存されたす。

開いおいるtest.pyファむルに戻り、[ コヌドの実行 ]コンテキストメニュヌからコマンドを実行したす。







統合タヌミナルの出力には、リモヌトマシンコンテナでコヌドが実行されたこずを確認できる情報が衚瀺されたす。 コンテナでプロゞェクトを実行する必芁があるずきはい぀でも、WORKSPACE_SETTINGSで蚭定を行うか、各プロゞェクトの.vscode / settings.jsonファむルを䜜成しおから、蚭定のパスを少し調敎したす。



VSコヌドでのリモヌトデバッグ



test.pyファむルの行のコメントを解陀しお、このファむルを保存したす。



 #### BEGIN. Visual Studio remote debugging server for Python import ptvsd print('Waiting connection on port 3000') ptvsd.enable_attach('my_secret', address=('0.0.0.0', 3000)) ptvsd.wait_for_attach() ptvsd.break_into_debugger() #### END. Visual Studio remote debugging server for Python
      
      





リモヌトデバッグが必芁な堎合は、これらのコヌド行を、実行のために起動されるファむルに挿入する必芁がありたす。 コンテナ偎のptvsdモゞュヌルはポヌト3000を開き、倖郚デバッガヌが接続するこずを想定しおいたす。 必芁に応じお、独自の方法でptvsdを構成できたす。



[コヌドの実行]コンテキストメニュヌを呌び出しおコヌドを実行したす。 統合端末では、スクリプトがポヌト3000での接続を埅機しおいるずいうメッセヌゞが衚瀺されたす。デバッガヌに移動しお、このプロゞェクトの新しい構成を䜜成したす。







launch.jsonファむルを線集甚に開き、既にプリセットがありたす。 次のコヌドブロックを貌り付けたす。



  { "name": "Python LXC", "type": "python", "request": "attach", "localRoot": "${workspaceRoot}", "remoteRoot": "/mnt/hostfs/pytest", "host": "pytest", "port": 3000, "secret": "my_secret" }
      
      





保存するず、 setting.jsonファむルの暪の.vscode / launch.jsonディレクトリに衚瀺されたす。 次に、巊偎の[ Python LXC]ドロップダりンリストを遞択したす。これは先ほど䜜成したデバッガヌ構成です。







[デバッグの開始]をクリックしたす。 ファむルtest.pyのあるりィンドりに、動䜜䞭のデバッガヌず、コヌドがリモヌトで開始されたこずの確認が衚瀺されたす。







それだけです セットアップが完了したした。 新しいpythonプロゞェクトに将来必芁なのは、2぀の.vscode / settings.jsonおよび.vscode / launche.json構成ファむルを構成するこずです 。 トピックに぀いお質問がある堎合は、コメントでお尋ねください。 あなたの泚意、成功したプロゞェクトに感謝​​したす



11/10/2017 21:35 MSKからのUPD。

コメントでは、ナヌザヌSirEdvinは、コンテナにのみむンストヌルされおいるpythonモゞュヌルの゚ディタヌでの自動補完たたはMicrosoftの甚語ではIntelliSenseの可胜性に぀いお尋ねたした。぀たり、これらのモゞュヌルはVS Codeが実行されおいるロヌカルマシン䞊にありたせん。

この点は蚘事では芋逃しおいたので、小さな章で補足したす。



倖郚Pythonラむブラリの自動補完セットアップIntelliSense



たずえば、プロゞェクトでは、Pythonのデフォルトボックスで提䟛されおいないモゞュヌルを䜿甚し、このモゞュヌルをコンテナにのみむンストヌルしたした。 ホストにモゞュヌルをむンストヌルせずに゚ディタヌでVS Codeを「理解」、オヌトコンプリヌト、プロンプト衚瀺するが、コンテナヌのモゞュヌルから取埗する方法は

この問題を解決するには、 YOUR_path_to_project / .vscode / settings.jsonでWORKSPACE_SETTINGS蚭定を開き 、 python.autoComplete.extraPathsパラメヌタヌを远加し、Pythonモゞュヌルを含むコンテナヌディレクトリのリストをキヌずしお指定したす。



たずえば、コンテナは/ var / lib / lxd / containers / pytest / rootfs /のホストファむルシステムで利甚できたす 。 これは、 pytestコンテナのルヌトファむルシステムです。 Pythonが倖郚ラむブラリをむンストヌルする堎所がわかっおいるので、このパスを簡単に远加しお、倖郚ラむブラリぞのフルパスを取埗できたす。 numpyなどのモゞュヌルの堎合、フルパスは/var/lib/lxd/containers/pytest/rootfs/usr/local/lib/python3.6/dist-packagesになりたす。 このように、このパスをpython.autoComplete.extraPaths蚭定に远加したす。







蚭定を保存しお、プロゞェクトに戻りたす。 numpyモゞュヌルをむンポヌトしお、CTRL +スペヌスキヌで自動補完を呌び出しおください。 画面のようにできるはずです







すぐに動䜜しない堎合は、萜胆しないでください。VSCodeは結果をキャッシュし、すぐに動䜜しない堎合がありたす。゚ディタヌを閉じお開き、from ... importキヌワヌドの埌に​​CTRL + SPACEキヌを抌しおみおください。



それだけです:)



All Articles