目次
前回の記事で、pre-commit
とPyCharm
とWindows
の組み合わせで困っていることを書きました。
これについて、知り合いとチャットで話をしていて、それほど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
を利用します。
この、sentencepiece
をpoetry
がインストールするタイミングで、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
となっています。
04emir9hi2caivtjunfe3l17452hkbb3hdut1qflbrn8n924ho5c
がdevcontainerId
に相当するのだとは思うのですが、誰がつけたものかなどがまだよくわかっていません。
もうちょっとわかりやすいものが使えるほうが嬉しいかも?と思っていたりします。
(複数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
- VS CodeとDev Container(docker-compose.yml対応)
- pre-commitとvenvとPyCharm(困ったな?)
- VS CodeとDev Container(コンテナ名の指定)
- ブログ記述環境としてのDev Container
- Lunakey Miniを組み立てて、BLE+LPME-IO化してみた #DIYキーボード