ITエンジニア日記 ~NO SKILL, NO LIFE~

学んだ技術や、気になることをアウトプットしていきます。プログラミング, インフラ, etc...

DockerでPythonの開発環境を作成してみる その2

今回は、「DockerでPythonの開発環境を作成してみる その2」となります。前回、DockerfileからDockerイメージを作成してコンテナを起動、そしてPythonスクリプトファイルを実行するところまで環境を作りました。
今回は、ホストのVSCodeからコンテナ上のPythonデバッグ実行できるようにする環境を構築していきます。


※前回の「DockerでPythonの開発環境を作成してみる その1」から読みたい方は、こちらからどうぞ。

ittech-nsnl.hatenablog.com


【目次】

1. VSCodeへの拡張機能のインストール

まずは、VSCode側の準備として、拡張機能をインストールします。
インストールするのは「Remote - Containers」です。
VSCodeでDockerコンテナ上で動作している開発環境に接続して、あたかもコンテナ上でVSCodeを使っているようにするようなものです。 (あってるかな?)
では、Remote - Containersをインストールしていきます。

VSCode拡張機能の検索バーに「remote」と入力する
②検索バーの下の検索結果に「Remote - Containers」が出てくるのでそれを選択します。
③「Remote - Containers」のインストール画面が開いたら「install」ボタンを押下して、インストールを実施します。

f:id:masakiXX0:20191120215446j:plain
Remote - Containersをインストール

サイドバーに下図のような「Remote - Containers」アイコンが追加されればインストール成功です。

f:id:masakiXX0:20191120220028j:plain
Remote - Containersのアイコンが追加される

2. コンテナを起動する

前回作成したPythonの開発環境のコンテナを起動します。
前回コンテナを停止していた場合は、コンテナをstartコマンドで起動します。

PS D:\docker\python3> docker container start pythonwork
pythonwork

lsコマンドで稼働しているコンテナを確認します。

PS D:\docker\python3> docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
19a1a6291e4d        pythondev           "/bin/bash"         4 minutes ago       Up 8 seconds        8080/tcp            pythonwork

3. VSCodeからコンテナに接続

VSCodeのサイドバーの「Remote - Containers」アイコンを選択します。
「Remote - Containers」の画面が開き、リモートコンテナーと書いてある表示領域に先ほど起動したコンテナ「pythonwork」が存在することが確認できます。

f:id:masakiXX0:20191120221235j:plain
Remote - Containersを開いたところ

接続したいコンテナ名にカーソルを合わせると、コンテナ名の左側に下図のようなアイコンが表示されます。
このアイコンをクリックします。

f:id:masakiXX0:20191120221714j:plain
コンテナに接続する

すると新しいウインドウが開きます。
しばらく待つと新しく開いたVSCodeのウインドウの左下に「Attached Container pythondev(pythonwork)」と表示され、コンテナに接続されたことが確認できました。

f:id:masakiXX0:20191120222111j:plain
コンテナに接続が完了したところ

次は、マウント先のディレクトリを選択します。
まず、サイドバーの一番上のエクスプローラアイコンを選択します。
表示されたが画面で「フォルダーを開く」ボタンを押下します。

f:id:masakiXX0:20191120233007j:plain
エクスプローラー ⇒ フォルダーを開く

画面中央にコンテナ側のディレクトリを選択するコンボボックスが表示されます。
コンテナ作成時に作成した「workdir」を選択して「OK 」ボタンを押下します。

f:id:masakiXX0:20191120222843j:plain
workdir を選択 ⇒ 「OK」ボタン

マウント側のディレクトリと同じ内容が表示されれば成功です。

f:id:masakiXX0:20191120223321j:plain
ディレクトリの内容が表示される

4. VSCodeで新規ファイルを追加してみる

VSCode側で新規ファイルを追加してみます。
VSCodeで「新しいファイル」ボタンを押下します。

f:id:masakiXX0:20191120223844j:plain
「新しいファイル」ボタン

ファイル名を入力しEnterキーを押下すると、ファイルが作成されてウインドウ右側に作成したファイルが開かれます。

f:id:masakiXX0:20191120224059j:plain
新しいファイルが作成された

この新規作成したファイル「newTestFile.py」がコンテナ側にも存在することを確認してみます。
下記コマンドでコンテナのbashを起動します。

PS D:\docker\python3> docker container exec -it pythonwork /bin/bash                                                       

bashが起動したら、ディレクトリ「workdir」配下のファイルを確認してみます。

root@19a1a6291e4d:/workdir# ls -l
total 1
-rwxr-xr-x 1 root root  0 Nov 20 13:39 newTestFile.py
-rwxr-xr-x 1 root root 80 Nov 12 13:28 test.py

VSCodeで作成したファイル「newTestFile.py」がコンテナにも存在することが確認できました。

5. コンテナ側にVSCode拡張機能をインストール

ローカルでVSCodeにインストールされている拡張機能は、コンテナ側にはインストールされていません。
必要であれば、コンテナ側にも拡張機能をインストールしてください。

f:id:masakiXX0:20191120224820j:plain
コンテナ側の拡張機能

コンテナ側に拡張機能をインストールするときは、「install」ボタンが、
「Install in Attached Container コンテナ名(イメージ名)」
に変わります。

6. デバッグ実行してみる

VSCode側からデバッグ実行をしてみます。
先ほど作成した新規Pythonファイルに下記のようなコードを書いて保存します。

def main():
    hoge = "hogehoge"
    print("Hello" + hoge +  "World!")

if __name__ == "__main__":
    main()

print文のところにブレイクポイントを追加します。

f:id:masakiXX0:20191120230154j:plain
ブレイクポイントを追加

ウインド上部メニューの「デバッグ」から「デバッグの開始」を選択します。
コマンドパレットが表示されるので「Python File」を選択します。

f:id:masakiXX0:20191120230430j:plain
Python File」を選択

デバッグ実行が開始され、ブレイクポイントの位置で止まります。
変数の中の値が確認できたり、ステップ実行が可能であることがわかります。

f:id:masakiXX0:20191120230705j:plain
ブレイクポイントの位置で止まった

実行し終わると、画面下部のターミナル領域にプログラムの実行結果が表示されました。

f:id:masakiXX0:20191120230934j:plain
プログラムの実行結果が表示された

7. まとめ

ホストのVSCodeからコンテナ上のPythonデバッグ実行する環境を作ることができました。また、実際にデバッグ実行をして、ローカルで開発するのと同じ感覚でデバッグができることもわかりました。
これの何がいいかというと、ローカルにPythonをインストールする必要がなくなくなるので、ローカル環境を汚さずに済むということ。
開発環境が不要になったらコンテナを削除すればいいだけなの、とってもお手軽です。
あと、開発環境のコンテナを一つ作って開発メンバに配れば、メンバ全員が全く同じ開発環境で開発可能になります。

長くなりましたが、興味がある方はぜひDockerを使っての開発環境構築お試しあれ。

参考

WINGSプロジェクト阿佐志保 「プログラマのためのDocker教科書 第2版」 株式会社翔泳社