VS CodeとDev Containerの導入(まだ途中)

Posted by johtani on Thursday, July 13, 2023

目次

前回の記事で、pre-commitPyCharmWindowsの組み合わせで困っていることを書きました。 これについて、知り合いとチャットで話をしていて、それほどPyCharmにこだわりもないよなぁということになり、 であれば、ISIDのブログ(Dev Containerを使ってステップバイステップで作るPythonアプリケーション開発環境 - ISID テックブログ)を試してみるとすっきりするかもしれないとなり、Dev Container対応をブログを参考に行ってみました。

順を追ってブログで説明されているので、どういう仕組みなのか、どの設定が何を意味しているのか?がとてもよくわかりやすくすんなり対応することができました。

ブログの手順をなぞっているところでいくつか固有の手順や疑問点が出てきたのでブログに書き記しておきます。 結果は、コミットしてあるものを見てください。

ブログとは違う手順

まずはISIDのブログとは違う点をいくつか。

.venvはいったん削除

ブログでは新規のプロジェクトを作成していく過程で、コンテナ化した環境を作った後に.venvをDockerコンテナのボリュームにして、最後に仮想環境のPythonを生成していました。 私の場合は、すでにホストOS(実際にはWSL2のUbuntuだけど)で.venvのディレクトリを作成してある状態だったので、いったん削除する必要がありました。 すでに存在する.venvがbindマウントされてしまっている状態になるため、Dockerのボリュームとの整合性が取れなくなるようです。

この作業を行う前か、途中でDev Containerを停止した状態で、.venvを削除することで問題なくDockerのボリュームに仮想環境のPythonが登録されるようになります。

postCreateCommand.shの呼び出し方

ファイルに実行権限がないと、実行権限エラーが出ました。 実行権限を与えるか、次のような記述で動くようになりました。 今は、ファイルに実行権限をつけるのではなく、次のような記述にしていますが、何か問題あるかな?

 "postCreateCommand": "/bin/sh ./.devcontainer/postCreateCommand.sh",

実際に動作しているログを見ると

/bin/sh -c /bin/sh ./.devcontainer/postCreateCommand.sh

となっているので、少し気持ち悪いのだけれども。。。

postCreateCommand.shの追加処理

今回Dev Containerを適用したプロジェクトでは、sentencepieceを利用します。 この、sentencepiecepoetryがインストールするタイミングで、cmakeを要求してきました。 今回利用しているDocker Imageにはcmakeは含まれていないため、以下の処理を追加しています。

sudo apt update
sudo apt-get install cmake -y

また、rinna/japanese-clipも利用しているのですが、こちらは、poetryで追加してインストールでは依存するパッケージがインストールされないため、pipコマンドを利用するようにしています。

pip install git+https://github.com/rinnakk/japanese-clip.git

コンテナイメージを作った後にやりたいことを、自由にスクリプトで書けるのは便利ですね。

pre-commitのスクリプトの再生成

こちらも、既存の環境が残っているとPythonへのパスの違いの問題が出たので、作り直しました。 .git/hooks/pre-commitのファイルを削除し、pre-commit installをやったものをリポジトリにコミットしてあります。

疑問点

作業をしていて疑問点もいくつか出てきたのでメモを残しておきます。ちなみに、これらの疑問について実際に調べるまでには至っていません。 時間を見て解決できればなぁと(できるのか?)。

Imageが2つ

Dev Containerの設定を書いた後に、コンテナをビルドすると、Docker DesktopのImagesにイメージが出来上がります。 この時、イメージが2つできあがっています(なぜ?)。

REPOSITORY                                                                                          TAG       IMAGE ID       CREATED      SIZE
vsc-search-research-bf04371c017c8d2f1dd5ad2529841b02e9ea1d1aaa4354c19edf53cef3f0c13b-features-uid   latest    25c7e23416ec   3 days ago   1.69GB
vsc-search-research-bf04371c017c8d2f1dd5ad2529841b02e9ea1d1aaa4354c19edf53cef3f0c13b-features       latest    fcf9eaeb2187   3 days ago   1.69GB

こんな感じで、最後に-uidがついているかいないかの違いです。 実際にコンテナ起動時に利用されるのは-uidがついているものになります。 なぜ2つになっているのか、1つにする設定などがあるのか?といったところが気になるところです。

Containerの名前

devcontainer.jsonの設定を書き換えて、コンテナをリビルドすると起動したコンテナの名前が自動で割り振られているようです。 今は、fervent_hopperとなっています。ランダムにつけられているようなのですが、名前を付ける方法はないのかなぁ?と。

devcontainer.jsonにはnameというプロパティもあるのですが、この値がどこで使われているのかはよくわかっていません。 Remote Explorerでコンテナの一覧が見えますが、ここでは、リポジトリ名が利用されているようです。

VolumeのIDはどこから?

devcontainer.jsonで次のような記述で、.venvのディレクトリようにDockerにボリュームを作っています。

  "mounts": [
    "source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume"
  ],

実際にコンテナでマウントされている情報を見ると

/workspaces/search-research/.venv
/var/lib/docker/volumes/venv-04emir9hi2caivtjunfe3l17452hkbb3hdut1qflbrn8n924ho5c/_data

となっています。 04emir9hi2caivtjunfe3l17452hkbb3hdut1qflbrn8n924ho5cdevcontainerIdに相当するのだとは思うのですが、誰がつけたものかなどがまだよくわかっていません。 もうちょっとわかりやすいものが使えるほうが嬉しいかも?と思っていたりします。 (複数Dev Containerを使い始めると、Docker Desktopで見ると、どのボリュームがどのDev Containerに紐づいているかがぱっと見ではわからない)

.vscodeディレクトリどうしよう?

たぶん、VS Codeを触っている過程で、何かの設定をしてしまったのだとは思うのですが、 .vscode/settings.jsonというファイルができており、次のような内容になっています。

{
  "git.ignoreLimitWarning": true
}

何か意味があるかも?ということで、コミットしてリポジトリに入れたのですが、いらないのかもしれないなぁと。

残作業

とりあえず、VS CodeでPython環境ができて、VS CodeのTerminalでPythonのプログラムが実行できるのはわかった段階です。 いくつか、今後調べながらやる必要があるものが残っているのでメモとして残しておきます。

マルチコンテナ化

今回Dev Containerに対応したプロジェクトでは、検索エンジンもDockerのコンテナとして起動して、Pythonのプログラムから接続したいと思っています。 となると、docker composeでいろいろと起動するほうがネットワークなどの設定も楽になるのでは?と思っているところです。 Dev Containerのテンプレートがいくつか用意されており、その中に「Python 3 & PostgreSQL (postgres)」というのを見つけたので、このあたりが参考になるのでは?と考えているところです。

pre-commitではなく、保存時にフォーマット

pre-commit+localのコマンドも動くようにはなったのですが、保存時にフォーマットなどをかける設定もISIDのブログで記載がありました。 コミットしようとして、怒られるよりも、保存時に怒られたりするほうがいいかも?という気分になってきています。 どこまでが切り替え可能なのか?なども見ながら対応してみようかなと。

もう少し開発してみて改善点を探っていく

とりあえず動いたという段階です。 PyCharmとの違いがあるはずで(たとえば、git周りのGUIの違いとか)、そのあたりでどんな違いがあり、どんなものがあると嬉しいのか?といったものを調べる必要もあるかなと考えています。 TerminalでCtrl+rがうまく使えなかったり(Auto Hot Keyで検索のショートカットに割り当ててしまっているから。。。)などもあるので、この辺も調べていきたいなと。 Windows Terminalを使えたりするのかなぁ?

まとめ

さて、とりあえず、VS CodeでPythonのDev Container環境を作って動くところまでは来ました。 PyCharmを使いこなしていなかったのもあり、それほど違和感なく移行できるような気がしています。 調べることはまだまだあるし、プログラム書くつもりが、環境を整える方向に話がずれている気もしますが、まぁ面白いのでよしとするかなぁ。 いろいろまだまだ知らないことだらけです。。。


comments powered by Disqus

See Also by Hugo


Related by prelims-cli