<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">

  <channel>
    <title>Python on @johtaniの日記 3rd</title>
    <link>https://blog.johtani.info/tags/python/</link>
    <description>Recent content in Python on @johtaniの日記 3rd</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja</language>
    <lastBuildDate>Fri, 21 Jul 2023 10:13:30 +0900</lastBuildDate><atom:link href="https://blog.johtani.info/tags/python/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>VS CodeとDev Container（docker-compose.yml対応）</title>
      <link>https://blog.johtani.info/blog/2023/07/21/multi-containers-with-dev-container/</link>
      <pubDate>Fri, 21 Jul 2023 10:13:30 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/07/21/multi-containers-with-dev-container/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2023/07/13/introduce-vs-code-and-dev-container/&#34;&gt;前回の記事&lt;/a&gt;で、VS Code＋Dev Containerを導入しました。
残課題として「マルチコンテナ化」があるという話もしました。今回はDev Containerのdocker-compose.yml対応をした話をメモとして残しておきます。
実際、VS Code + Dev Containerに移行した後に、Esを起動してアプリからつなげるというのがうまくいかないというのがあったので対応がんばりました。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2023/07/13/introduce-vs-code-and-dev-container/&#34;&gt;前回の記事&lt;/a&gt;で、VS Code＋Dev Containerを導入しました。
残課題として「マルチコンテナ化」があるという話もしました。今回はDev Containerのdocker-compose.yml対応をした話をメモとして残しておきます。
実際、VS Code + Dev Containerに移行した後に、Esを起動してアプリからつなげるというのがうまくいかないというのがあったので対応がんばりました。。。&lt;/p&gt;
&lt;h2 id=&#34;dev-containerのdocker-compose設定&#34;&gt;Dev Containerのdocker compose設定&lt;/h2&gt;
&lt;p&gt;この記事ではすでにdocker-compose.ymlが存在している状態の話をします。
変更する前は、devcontainer.jsonでベースのコンテナイメージの指定、マウントの設定などを行っていましたが、docker-compose.ymlにいくつかを移動しないといけません。
対応した時の作業の流れは以下のような感じです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ワークスペース用のDockerfileの作成&lt;/li&gt;
&lt;li&gt;docker-compose.ymlにワークスペース用のサービスを追加&lt;/li&gt;
&lt;li&gt;devcontainer.jsonをdokcer-compose.ymlを利用する形に書き換え&lt;/li&gt;
&lt;li&gt;アプリでの接続文字列をlocalhostからdocker-compose.ymlのサービス名に変更&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;参考：&lt;a href=&#34;https://github.com/johtani/search-research/pull/17/commits/b6e75b1d641bbea74ff57d5914020929d70d2c42&#34;&gt;対応した時のコミットです&lt;/a&gt;。差分などはこちらをごらんください。&lt;/p&gt;
&lt;p&gt;devcontainerのリポジトリに&lt;a href=&#34;https://github.com/microsoft/vscode-dev-containers/tree/main/containers/python-3-postgres&#34;&gt;Python+PostgreSQLのサンプル&lt;/a&gt;が公開されており、こちらを参考にしながら作業をしました。&lt;/p&gt;
&lt;h3 id=&#34;1-dockerfileの作成&#34;&gt;1. Dockerfileの作成&lt;/h3&gt;
&lt;p&gt;docker-compose.ymlだけでも完結するのかもしれないですが、いろいろやりたいことも出てくるかもしれないので別のファイルに切り出しました。
といっても、コンテナのイメージはdevcontainer.jsonに記述していたものを使っています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ARG VARIANT=3.11-bookworm
FROM mcr.microsoft.com/devcontainers/python:${VARIANT}

ENV PYTHONUNBUFFERED 1
ENV TZ Asia/Tokyo
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;TZ&lt;/code&gt;はdevcontainer.jsonで指定していたものを、こちらに移行した形になります。
&lt;code&gt;PYTHONUNBUFFERED&lt;/code&gt;は参考にしたDockerfileの記載です。標準出力・エラーをバッファリングしない指定になっています。&lt;/p&gt;
&lt;h3 id=&#34;2-dokcer-composeymlにサービス追加&#34;&gt;2. dokcer-compose.ymlにサービス追加&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;backend&lt;/code&gt;という名前のサービスをdevcontainer（VS Code）から接続するコンテナのサービス名にしています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;services:
  backend:
    build:
      context: .
      dockerfile: .devcontainer/Dockerfile
    init: true
    environment:
      - TZ=Asia/Tokyo
    command: sleep infinity
    volumes:
      - .:/workspace/search-research:cached
      - venv-search-research-backend:/workspace/search-research/.venv
...
volumes:
  venv-search-research-backend:
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;1.で作成したDockerfileを利用します。docker-compose.ymlファイル自体は、プロジェクトのルートディレクトリに配置していますが、Dockerfileは&lt;code&gt;.devcontainer&lt;/code&gt;ディレクトリに入れたため、&lt;code&gt;context&lt;/code&gt;と&lt;code&gt;dockerfile&lt;/code&gt;はこのような指定になっています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;init&lt;/code&gt;は、&lt;code&gt;devcontainer.json&lt;/code&gt;で指定していた&lt;code&gt;&amp;quot;runArgs&amp;quot;: [&amp;quot;--init&amp;quot;],&lt;/code&gt;の設定になります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;command&lt;/code&gt;の部分は、コンテナが起動したままにしておくための設定です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;volumes&lt;/code&gt;では2つのボリュームに関しての指定があります。
1つ目の&lt;code&gt;/workspace...&lt;/code&gt;は、VS Codeがコンテナにプロジェクトをマウントする場所の指定です。
&lt;code&gt;devcontainer.json&lt;/code&gt;だけを利用していた場合は意識していませんでしたが、&lt;code&gt;/workspace/プロジェクト名&lt;/code&gt;というディレクトリにプロジェクトがマウントされていました。
docker-compose.ymlを利用する場合は、明示的に指定が必要です。
2つ目の&lt;code&gt;venv-...&lt;/code&gt;は&lt;code&gt;.venv&lt;/code&gt;のディレクトリをコンテナの中だけのものにする設定を移植したものになります。
前回の記事ではコンテナIDをボリューム名に含めていましたが、こちらのほうがわかりやすいかと思い、プロジェクトの名前とサービス名をつけるようにしてみました。
Dev Containerで起動した場合は&lt;code&gt;search-research_venv-search-research-backend&lt;/code&gt;という名前がついています（最初の部分はDev Containerがつけてるのかな？）&lt;/p&gt;
&lt;h3 id=&#34;3-dovcontainerjsonの変更&#34;&gt;3. dovcontainer.jsonの変更&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;devcountainer.json&lt;/code&gt;から呼び出すものの準備ができたので、&lt;code&gt;devcontainer.json&lt;/code&gt;を書き換えます。
&lt;a href=&#34;https://containers.dev/implementors/json_reference/#compose-specific&#34;&gt;公式のドキュメントとしてDocker Compose向けのプロパティが紹介されています&lt;/a&gt;。
変更したものは次のような形です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
  &amp;#34;name&amp;#34;: &amp;#34;search-research&amp;#34;,
  &amp;#34;dockerComposeFile&amp;#34;: &amp;#34;../docker-compose.yml&amp;#34;,
  &amp;#34;service&amp;#34;: &amp;#34;backend&amp;#34;,
  &amp;#34;workspaceFolder&amp;#34;: &amp;#34;/workspace/search-research&amp;#34;,
  &amp;#34;postCreateCommand&amp;#34;: &amp;#34;/bin/sh ./.devcontainer/postCreateCommand.sh&amp;#34;,
  &amp;#34;customizations&amp;#34;: {
...
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;dockerComposeFile : 利用するdocker-compose.ymlのファイルパス&lt;/li&gt;
&lt;li&gt;service：VS Codeが利用するワークスペース用のサービス名&lt;/li&gt;
&lt;li&gt;workspaceFoldeer：VS Codeがコンテナに接続したときに開くフォルダのパス&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を指定します。これで、VS Codeでこのプロジェクトを開いた時に、Dev Containerがdocker-compose.ymlを使ってコンテナの起動（ビルドとか）を行ってくれます。&lt;/p&gt;
&lt;h3 id=&#34;4-アプリの接続文字列の書き換え&#34;&gt;4. アプリの接続文字列の書き換え&lt;/h3&gt;
&lt;p&gt;こちらはおまけです。
PythonのアプリからElasticsearchに接続するときの文字列として、Dev Container化の前は、&lt;code&gt;http://localhost:9200&lt;/code&gt;と指定をしていました。
Elasticsearch用のサービス（&lt;code&gt;es&lt;/code&gt;）で、ポートフォワードをしていたためです。&lt;/p&gt;
&lt;p&gt;アプリ側もコンテナ化したので、Docker Composeが名前の解決をしてくれるので、&lt;code&gt;http://es:9200&lt;/code&gt;という接続文字列で接続ができるようになりました。&lt;/p&gt;
&lt;p&gt;ということで、ここまでで、VS Codeでプロジェクトを開くと、2つのコンテナ（&lt;code&gt;backend&lt;/code&gt;と&lt;code&gt;es&lt;/code&gt;）が起動してVS Code上でPythonアプリからEsへの接続ができるようになりました。&lt;/p&gt;
&lt;h2 id=&#34;追加の変更&#34;&gt;追加の変更&lt;/h2&gt;
&lt;p&gt;参考のプルリクでは、上記まででしたがさらにいくつかの変更をそのあとやっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;起動するサービスの指定(開発だけするときはEsを起動したくない)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;devcontainer.json&lt;/code&gt;で&lt;code&gt;runServices&lt;/code&gt;を使って指定できます（&lt;a href=&#34;https://containers.dev/implementors/json_reference/#compose-specific&#34;&gt;公式ドキュメント&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GPUをコンテナから利用できるように
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;devcontainer.json&lt;/code&gt;で&lt;code&gt;features&lt;/code&gt;の&lt;code&gt;nvidia-cuda&lt;/code&gt;を指定し、docker-compose.ymlで&lt;code&gt;nvidia&lt;/code&gt;のドライバーなどを設定することで対応しました。&lt;/li&gt;
&lt;li&gt;nvidiaが公開しているcuda対応のコンテナイメージでもよかったのですが、こちらのほうが楽そうだったという理由です。&lt;code&gt;features&lt;/code&gt;とコンテナのビルド、postCreateCommandの順序などはもうちょっと勉強しないといけない気がしています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらの対応は&lt;a href=&#34;https://github.com/johtani/search-research/commit/10a4741ab6fa2003f6f050864758a8176a9090cb&#34;&gt;こちらのコミット&lt;/a&gt;で対応しています。&lt;/p&gt;
&lt;p&gt;GPUの対応は、私個人の環境はこれでいいのですが、複数の人がこのリポジトリを使う場合はどうやって切り替えたりするんだろう？という疑問が残っています。。。
今回はrinna/japanese-clipのモデルを使って、テキストからベクトルを生成する部分の処理のためにGPUを使いたいというモチベーションがあり、コンテナでもGPUを使えるようにしています（CPUだと時間がすごくかかる。。。）。&lt;/p&gt;
&lt;h3 id=&#34;サービス起動の新たな問題点&#34;&gt;サービス起動の新たな問題点&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;runServices&lt;/code&gt;で起動するサービス名を指定したのはよかったのですが、Elasticsearchのサービスを起動して、データ登録や検索の確認を行おうと思った時に、EsのコンテナをVS Codeだけで起動する方法がまだわかっていません。。。
一度コンテナをビルドした後なら、「Remote Explorer」でOther Containerというくくりで表示され、右クリックで起動や停止ができそうなのだけど、新規サービスをdocker-compose.ymlに追加した場合は、自分でターミナルなどでコンテナのビルドをしないといけないかもしれないです。もうちょっと調べてみないとなぁ。&lt;/p&gt;
&lt;h2 id=&#34;副次的な効果&#34;&gt;副次的な効果&lt;/h2&gt;
&lt;p&gt;Docker Compose対応をしたことで、前回の記事での疑問点のうち、「コンテナ名」「VolumeのID」については懸念点がなくなりました。&lt;/p&gt;
&lt;p&gt;「コンテナ名」は、docker-compose.ymlのサービス名がコンテナ起動時に名前として利用されるため、Docker Desktopで見た時などの探しにくさはなくなりました。
ただ、「イメージ名」については、いまだに2つできています。「-uid」がつかないものの代わりに、&lt;code&gt;search-research-backend&lt;/code&gt;というイメージが作られています。
ただし、実際に利用されるのは前回の記事に書いたような&lt;code&gt;vsc-search-research-bf04371c017c8d2f1dd5ad2529841b02e9ea1d1aaa4354c19edf53cef3f0c13b-uid&lt;/code&gt;という名前のイメージです。&lt;/p&gt;
&lt;p&gt;「VolumeのID」については、docker-compose.ymlのファイルで自分で名前をつけるようにしたので、コンテナのIDが利用されなくなったという次第です。
代わりに、プロジェクト名である「search-research」という名前を直接記述しているので、変数などで置き換えたほうがいいのかも？という気がしています。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、複数のコンテナを利用するプロジェクトでVS Code+Dev Container対応ができそうだということがわかりました。
ついでに、GPU対応もできたのでこれで、やっと他の検索エンジン対応などができる気がしています。
（その前にpre-commitを保存時にチェックする形に変更かなぁ）
やりたいことからちょっとずつ外れている気もするけれど、新しいことを調べるのは楽しいですね。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>VS CodeとDev Containerの導入（まだ途中）</title>
      <link>https://blog.johtani.info/blog/2023/07/13/introduce-vs-code-and-dev-container/</link>
      <pubDate>Thu, 13 Jul 2023 22:15:23 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/07/13/introduce-vs-code-and-dev-container/</guid>
      <description>&lt;p&gt;前回の記事で、&lt;code&gt;pre-commit&lt;/code&gt;と&lt;code&gt;PyCharm&lt;/code&gt;と&lt;code&gt;Windows&lt;/code&gt;の組み合わせで困っていることを書きました。
これについて、知り合いとチャットで話をしていて、それほどPyCharmにこだわりもないよなぁということになり、
であれば、ISIDのブログ（&lt;a href=&#34;https://tech.isid.co.jp/entry/2023/05/02/Dev_Container%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%83%90%E3%82%A4%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E4%BD%9C%E3%82%8BPython%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1&#34;&gt;Dev Containerを使ってステップバイステップで作るPythonアプリケーション開発環境 - ISID テックブログ&lt;/a&gt;）を試してみるとすっきりするかもしれないとなり、Dev Container対応をブログを参考に行ってみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;前回の記事で、&lt;code&gt;pre-commit&lt;/code&gt;と&lt;code&gt;PyCharm&lt;/code&gt;と&lt;code&gt;Windows&lt;/code&gt;の組み合わせで困っていることを書きました。
これについて、知り合いとチャットで話をしていて、それほどPyCharmにこだわりもないよなぁということになり、
であれば、ISIDのブログ（&lt;a href=&#34;https://tech.isid.co.jp/entry/2023/05/02/Dev_Container%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%83%90%E3%82%A4%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E4%BD%9C%E3%82%8BPython%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1&#34;&gt;Dev Containerを使ってステップバイステップで作るPythonアプリケーション開発環境 - ISID テックブログ&lt;/a&gt;）を試してみるとすっきりするかもしれないとなり、Dev Container対応をブログを参考に行ってみました。&lt;/p&gt;
&lt;p&gt;順を追ってブログで説明されているので、どういう仕組みなのか、どの設定が何を意味しているのか？がとてもよくわかりやすくすんなり対応することができました。&lt;/p&gt;
&lt;p&gt;ブログの手順をなぞっているところでいくつか固有の手順や疑問点が出てきたのでブログに書き記しておきます。
結果は、コミットしてあるものを見てください。&lt;/p&gt;
&lt;h2 id=&#34;ブログとは違う手順&#34;&gt;ブログとは違う手順&lt;/h2&gt;
&lt;p&gt;まずはISIDのブログとは違う点をいくつか。&lt;/p&gt;
&lt;h3 id=&#34;venvはいったん削除&#34;&gt;.venvはいったん削除&lt;/h3&gt;
&lt;p&gt;ブログでは新規のプロジェクトを作成していく過程で、コンテナ化した環境を作った後に&lt;code&gt;.venv&lt;/code&gt;をDockerコンテナのボリュームにして、最後に仮想環境のPythonを生成していました。
私の場合は、すでにホストOS（実際にはWSL2のUbuntuだけど）で&lt;code&gt;.venv&lt;/code&gt;のディレクトリを作成してある状態だったので、いったん削除する必要がありました。
すでに存在する&lt;code&gt;.venv&lt;/code&gt;がbindマウントされてしまっている状態になるため、Dockerのボリュームとの整合性が取れなくなるようです。&lt;/p&gt;
&lt;p&gt;この作業を行う前か、途中でDev Containerを停止した状態で、&lt;code&gt;.venv&lt;/code&gt;を削除することで問題なくDockerのボリュームに仮想環境のPythonが登録されるようになります。&lt;/p&gt;
&lt;h3 id=&#34;postcreatecommandshの呼び出し方&#34;&gt;postCreateCommand.shの呼び出し方&lt;/h3&gt;
&lt;p&gt;ファイルに実行権限がないと、実行権限エラーが出ました。
実行権限を与えるか、次のような記述で動くようになりました。
今は、ファイルに実行権限をつけるのではなく、次のような記述にしていますが、何か問題あるかな？&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; &amp;#34;postCreateCommand&amp;#34;: &amp;#34;/bin/sh ./.devcontainer/postCreateCommand.sh&amp;#34;,
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;実際に動作しているログを見ると&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/bin/sh -c /bin/sh ./.devcontainer/postCreateCommand.sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;となっているので、少し気持ち悪いのだけれども。。。&lt;/p&gt;
&lt;h3 id=&#34;postcreatecommandshの追加処理&#34;&gt;postCreateCommand.shの追加処理&lt;/h3&gt;
&lt;p&gt;今回Dev Containerを適用したプロジェクトでは、&lt;code&gt;sentencepiece&lt;/code&gt;を利用します。
この、&lt;code&gt;sentencepiece&lt;/code&gt;を&lt;code&gt;poetry&lt;/code&gt;がインストールするタイミングで、&lt;code&gt;cmake&lt;/code&gt;を要求してきました。
今回利用しているDocker Imageには&lt;code&gt;cmake&lt;/code&gt;は含まれていないため、以下の処理を追加しています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt update
sudo apt-get install cmake -y
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;また、&lt;code&gt;rinna/japanese-clip&lt;/code&gt;も利用しているのですが、こちらは、&lt;code&gt;poetry&lt;/code&gt;で追加してインストールでは依存するパッケージがインストールされないため、&lt;code&gt;pip&lt;/code&gt;コマンドを利用するようにしています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install git+https://github.com/rinnakk/japanese-clip.git
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;コンテナイメージを作った後にやりたいことを、自由にスクリプトで書けるのは便利ですね。&lt;/p&gt;
&lt;h3 id=&#34;pre-commitのスクリプトの再生成&#34;&gt;pre-commitのスクリプトの再生成&lt;/h3&gt;
&lt;p&gt;こちらも、既存の環境が残っているとPythonへのパスの違いの問題が出たので、作り直しました。
&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;のファイルを削除し、&lt;code&gt;pre-commit install&lt;/code&gt;をやったものをリポジトリにコミットしてあります。&lt;/p&gt;
&lt;h2 id=&#34;疑問点&#34;&gt;疑問点&lt;/h2&gt;
&lt;p&gt;作業をしていて疑問点もいくつか出てきたのでメモを残しておきます。ちなみに、これらの疑問について実際に調べるまでには至っていません。
時間を見て解決できればなぁと（できるのか？）。&lt;/p&gt;
&lt;h3 id=&#34;imageが2つ&#34;&gt;Imageが2つ&lt;/h3&gt;
&lt;p&gt;Dev Containerの設定を書いた後に、コンテナをビルドすると、Docker DesktopのImagesにイメージが出来上がります。
この時、イメージが2つできあがっています（なぜ？）。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こんな感じで、最後に&lt;code&gt;-uid&lt;/code&gt;がついているかいないかの違いです。
実際にコンテナ起動時に利用されるのは&lt;code&gt;-uid&lt;/code&gt;がついているものになります。
なぜ2つになっているのか、1つにする設定などがあるのか？といったところが気になるところです。&lt;/p&gt;
&lt;h3 id=&#34;containerの名前&#34;&gt;Containerの名前&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;devcontainer.json&lt;/code&gt;の設定を書き換えて、コンテナをリビルドすると起動したコンテナの名前が自動で割り振られているようです。
今は、&lt;code&gt;fervent_hopper&lt;/code&gt;となっています。ランダムにつけられているようなのですが、名前を付ける方法はないのかなぁ？と。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;devcontainer.json&lt;/code&gt;には&lt;code&gt;name&lt;/code&gt;というプロパティもあるのですが、この値がどこで使われているのかはよくわかっていません。
Remote Explorerでコンテナの一覧が見えますが、ここでは、リポジトリ名が利用されているようです。&lt;/p&gt;
&lt;h3 id=&#34;volumeのidはどこから&#34;&gt;VolumeのIDはどこから？&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;devcontainer.json&lt;/code&gt;で次のような記述で、&lt;code&gt;.venv&lt;/code&gt;のディレクトリようにDockerにボリュームを作っています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  &amp;#34;mounts&amp;#34;: [
    &amp;#34;source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume&amp;#34;
  ],
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;実際にコンテナでマウントされている情報を見ると&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/workspaces/search-research/.venv
/var/lib/docker/volumes/venv-04emir9hi2caivtjunfe3l17452hkbb3hdut1qflbrn8n924ho5c/_data
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;となっています。
&lt;code&gt;04emir9hi2caivtjunfe3l17452hkbb3hdut1qflbrn8n924ho5c&lt;/code&gt;が&lt;code&gt;devcontainerId&lt;/code&gt;に相当するのだとは思うのですが、誰がつけたものかなどがまだよくわかっていません。
もうちょっとわかりやすいものが使えるほうが嬉しいかも？と思っていたりします。
（複数Dev Containerを使い始めると、Docker Desktopで見ると、どのボリュームがどのDev Containerに紐づいているかがぱっと見ではわからない）&lt;/p&gt;
&lt;h3 id=&#34;vscodeディレクトリどうしよう&#34;&gt;.vscodeディレクトリどうしよう？&lt;/h3&gt;
&lt;p&gt;たぶん、VS Codeを触っている過程で、何かの設定をしてしまったのだとは思うのですが、
&lt;code&gt;.vscode/settings.json&lt;/code&gt;というファイルができており、次のような内容になっています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
  &amp;#34;git.ignoreLimitWarning&amp;#34;: true
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;何か意味があるかも？ということで、コミットしてリポジトリに入れたのですが、いらないのかもしれないなぁと。&lt;/p&gt;
&lt;h2 id=&#34;残作業&#34;&gt;残作業&lt;/h2&gt;
&lt;p&gt;とりあえず、VS CodeでPython環境ができて、VS CodeのTerminalでPythonのプログラムが実行できるのはわかった段階です。
いくつか、今後調べながらやる必要があるものが残っているのでメモとして残しておきます。&lt;/p&gt;
&lt;h3 id=&#34;マルチコンテナ化&#34;&gt;マルチコンテナ化&lt;/h3&gt;
&lt;p&gt;今回Dev Containerに対応したプロジェクトでは、検索エンジンもDockerのコンテナとして起動して、Pythonのプログラムから接続したいと思っています。
となると、docker composeでいろいろと起動するほうがネットワークなどの設定も楽になるのでは？と思っているところです。
Dev Containerのテンプレートがいくつか用意されており、その中に&lt;a href=&#34;https://github.com/devcontainers/templates/blob/main/src/postgres/README.md&#34;&gt;「Python 3 &amp;amp; PostgreSQL (postgres)」&lt;/a&gt;というのを見つけたので、このあたりが参考になるのでは？と考えているところです。&lt;/p&gt;
&lt;h3 id=&#34;pre-commitではなく保存時にフォーマット&#34;&gt;pre-commitではなく、保存時にフォーマット&lt;/h3&gt;
&lt;p&gt;pre-commit＋localのコマンドも動くようにはなったのですが、保存時にフォーマットなどをかける設定もISIDのブログで記載がありました。
コミットしようとして、怒られるよりも、保存時に怒られたりするほうがいいかも？という気分になってきています。
どこまでが切り替え可能なのか？なども見ながら対応してみようかなと。&lt;/p&gt;
&lt;h3 id=&#34;もう少し開発してみて改善点を探っていく&#34;&gt;もう少し開発してみて改善点を探っていく&lt;/h3&gt;
&lt;p&gt;とりあえず動いたという段階です。
PyCharmとの違いがあるはずで（たとえば、git周りのGUIの違いとか）、そのあたりでどんな違いがあり、どんなものがあると嬉しいのか？といったものを調べる必要もあるかなと考えています。
Terminalで&lt;code&gt;Ctrl+r&lt;/code&gt;がうまく使えなかったり(Auto Hot Keyで検索のショートカットに割り当ててしまっているから。。。)などもあるので、この辺も調べていきたいなと。
Windows Terminalを使えたりするのかなぁ？&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;さて、とりあえず、VS CodeでPythonのDev Container環境を作って動くところまでは来ました。
PyCharmを使いこなしていなかったのもあり、それほど違和感なく移行できるような気がしています。
調べることはまだまだあるし、プログラム書くつもりが、環境を整える方向に話がずれている気もしますが、まぁ面白いのでよしとするかなぁ。
いろいろまだまだ知らないことだらけです。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>pre-commitとvenvとPyCharm（困ったな？）</title>
      <link>https://blog.johtani.info/blog/2023/07/10/pre-commit-and-python/</link>
      <pubDate>Mon, 10 Jul 2023 10:55:48 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/07/10/pre-commit-and-python/</guid>
      <description>&lt;p&gt;最近、趣味（&lt;a href=&#34;https://github.com/johtani/search-research&#34;&gt;検索エンジンに関する趣味プロジェクト&lt;/a&gt;）でPythonのプログラムを書き始めました。&lt;/p&gt;
&lt;p&gt;きちんとPythonのプログラムをプロジェクトとして書いたことがないので、
Pythonのプロジェクトのディレクトリ構成などを手探りで進めているところです。
コードのフォーマットとかもやらないとなぁ？と知り合いのいるSlackでつぶやいたところ、gitのpre-commitフェーズで&lt;code&gt;black&lt;/code&gt;などのフォーマットやスタイルを修正してくれるツールを実行する方法を教えてもらいました（PRまで送ってもらえたのでありがたい）。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;最近、趣味（&lt;a href=&#34;https://github.com/johtani/search-research&#34;&gt;検索エンジンに関する趣味プロジェクト&lt;/a&gt;）でPythonのプログラムを書き始めました。&lt;/p&gt;
&lt;p&gt;きちんとPythonのプログラムをプロジェクトとして書いたことがないので、
Pythonのプロジェクトのディレクトリ構成などを手探りで進めているところです。
コードのフォーマットとかもやらないとなぁ？と知り合いのいるSlackでつぶやいたところ、gitのpre-commitフェーズで&lt;code&gt;black&lt;/code&gt;などのフォーマットやスタイルを修正してくれるツールを実行する方法を教えてもらいました（PRまで送ってもらえたのでありがたい）。&lt;/p&gt;
&lt;p&gt;で、pre-commit周りの設定などを変えている段階で遭遇した問題点についてログを残しておこうと重いブログを書いています。
残念ながら現時点では解決してないんですけどね。。。&lt;/p&gt;
&lt;h2 id=&#34;手元の環境&#34;&gt;手元の環境&lt;/h2&gt;
&lt;p&gt;簡単に環境を書いておくとこんな感じです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows上のPyCharmを開発で使用&lt;/li&gt;
&lt;li&gt;プロジェクトのディレクトリはWSL2のUbuntu上&lt;/li&gt;
&lt;li&gt;Python、gitはUbuntuのものを利用&lt;/li&gt;
&lt;li&gt;プロジェクトのルートディレクトリにある&lt;code&gt;.venv&lt;/code&gt;にvenvでPythonの仮想環境を作成してある&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;問題点&#34;&gt;問題点&lt;/h2&gt;
&lt;p&gt;遭遇した&lt;code&gt;pre-commit&lt;/code&gt;の問題点は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pre-commitの設定で&lt;code&gt;repo:local&lt;/code&gt;でローカルのプロジェクトにインストールしたコマンドを利用するように変更&lt;/li&gt;
&lt;li&gt;すると、PyCharmでコミットすると、&lt;code&gt;black&lt;/code&gt;などのコマンドが見つからない&lt;/li&gt;
&lt;li&gt;ターミナルでコミットするときはきちんと動作する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;色々調べて試行錯誤した結果、現在は&lt;code&gt;repo:local&lt;/code&gt;でのローカルコマンドを使用する方法はあきらめました。
移行は、作業記録みたいなものです。どういう流れでpre-commitを取り込み、ローカルに切り替え、切り戻したかという話です。&lt;/p&gt;
&lt;h2 id=&#34;pre-commitとpre-commit&#34;&gt;pre-commitとpre-commit&lt;/h2&gt;
&lt;p&gt;最初に少し戸惑ったのは、&lt;code&gt;pre-commit&lt;/code&gt;というツールと&lt;code&gt;git&lt;/code&gt;の&lt;code&gt;pre-commitフック&lt;/code&gt;です。
gitのpre-commitのフックのために作られたPython製の&lt;code&gt;pre-commit&lt;/code&gt;というツールがあります。&lt;/p&gt;
&lt;p&gt;このPython製のツールを利用することで、プロジェクトに&lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;という設定ファイルを置けば設定に記述されたツールをgit commitのタイミングで実行してくれます。
実際には、&lt;code&gt;pre-commit&lt;/code&gt;というツールの初期設定のタイミングで&lt;code&gt;pre-commit install&lt;/code&gt;というコマンドを実行して
&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;というスクリプトが生成されます。
gitコマンドはcommitされた時に（commit前のフェーズ）でこのスクリプトを実行し、そこで&lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;が参照されています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;の記述は次のようなものになります（最初にもらったPRより）。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;repos:
  - repo: https://github.com/psf/black
    rev: 23.3.0
    hooks:
      - id: black
        args: [&amp;#34;--line-length&amp;#34;, &amp;#34;120&amp;#34;, &amp;#34;.&amp;#34;]
  - repo: https://github.com/pycqa/flake8
    rev: 6.0.0
    hooks:
      - id: flake8
  - repo: https://github.com/pycqa/isort
    rev: 5.12.0
    hooks:
      - id: isort
        args: [&amp;#34;--profile&amp;#34;, &amp;#34;black&amp;#34;, &amp;#34;--filter-files&amp;#34;, &amp;#34;--multi-line&amp;#34;, &amp;#34;3&amp;#34;]
  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: v1.4.1
    hooks:
      - id: mypy
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;実際に、PRを取り込んで動かしてみたところ、&lt;code&gt;black&lt;/code&gt;などが動いて行末のスーペースの除去や未使用のimportについて指摘をしてくれました。
便利だなと思ったのですが、ここで疑問が。&lt;/p&gt;
&lt;p&gt;今回は対象とするプロジェクトは&lt;code&gt;poetry&lt;/code&gt;で依存パッケージの管理を行っています。
今回、上記を動かすために&lt;code&gt;poetry&lt;/code&gt;に追加されたものは&lt;code&gt;pre-commit&lt;/code&gt;だけでした。
「あれ？&lt;code&gt;black&lt;/code&gt;とかはどこにあって、どうやって動いてるんだ？」という疑問が出てきます。
コンフィグファイルにはパスなどの記載をせず、それぞれのgithubリポジトリの記載とバージョンがあるからです。&lt;/p&gt;
&lt;h2 id=&#34;pre-commitが使用するツールのインストール先&#34;&gt;pre-commitが使用するツールのインストール先&lt;/h2&gt;
&lt;p&gt;調べてみたところ、どうやらホームディレクトリにある&lt;code&gt;.cache/pre-commit&lt;/code&gt;に&lt;code&gt;black&lt;/code&gt;などのコマンドが見つかりました。
&lt;code&gt;pre-commit&lt;/code&gt;ツールが設定ファイルを基に、必要なコマンドをgithubからダウンロードしてきて実行時に利用しているようです。
pre-commitは便利なのだけど、せっかくPythonのプロジェクトだしそれぞれのツールはpoetryでpyproject.tomlでバージョンや設定を管理したほうがすっきりするのではないか？ということで、少し調べてみました。&lt;/p&gt;
&lt;p&gt;同じようなことを考えている方がブログを残していてくれました（&lt;a href=&#34;https://rcmdnk.com/blog/2023/02/07/computer-python/&#34;&gt;Pythonレポジトリ用のpre-commit環境を整える&lt;/a&gt;）。
設定をpyproject.tomlに移行し、そのあと、ローカルのpetryで&lt;code&gt;black&lt;/code&gt;などのコマンド類をインストールして利用する設定に書き換えています。
先人の肩に乗っかって、手元で同じように&lt;code&gt;pre-commit&lt;/code&gt;の設定ファイルの&lt;code&gt;repo&lt;/code&gt;を&lt;code&gt;local&lt;/code&gt;に書き換えていき（&lt;a href=&#34;https://github.com/johtani/search-research/commit/565f5ad84bf1006659047c8d23014b5b0502b03a&#34;&gt;その時のコミット&lt;/a&gt;）、ターミナルで&lt;code&gt;poetry run pre-commit run -a&lt;/code&gt;で動作確認できました。&lt;/p&gt;
&lt;h2 id=&#34;pycharmでコミットしたらエラー&#34;&gt;PyCharmでコミットしたらエラー&lt;/h2&gt;
&lt;p&gt;ですが、実際に変更した状態でPyCharmからコミットしたら、コマンドが見つかりませんというエラーが出ます。。。
WSL2のターミナルで&lt;code&gt;git commit&lt;/code&gt;した場合は問題ありません。
どうして？となりますよね。。。。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;はPyCharm、ターミナルのどちらからも実行されています。
ですが、PyCharmではblackなどが見つからないというエラーが出ました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;を見てみると、python実行するためのpythonのパスはプロジェクトにある&lt;code&gt;.venv/bin/python&lt;/code&gt;を指定しています。
デバッグのために、このスクリプトに&lt;code&gt;echo $PATH&lt;/code&gt;を差し込んで、git commitをPyCharmとターミナルからそれぞれ実行してみたところ、大きな違いがあります。&lt;/p&gt;
&lt;p&gt;ターミナルで実行した場合は、&lt;code&gt;&amp;lt;プロジェクトのディレクトリ&amp;gt;/.venv/bin&lt;/code&gt;もPATH環境変数に存在していました。このため、&lt;code&gt;.venv/bin&lt;/code&gt;にある&lt;code&gt;black&lt;/code&gt;などを実行できています。&lt;/p&gt;
&lt;p&gt;PyCharmはWindowsから起動しています。プロジェクトのインタプリタとしては、WSL2のUbuntuにある&lt;code&gt;.venv/bin/python&lt;/code&gt;を指定しているためもあり（？）、出力されたパスは&lt;code&gt;/mnt/c/&lt;/code&gt;などのWindowsのパスなども入っていたりしますが、&lt;code&gt;&amp;lt;プロジェクトのディレクトリ&amp;gt;/.venv/bin&lt;/code&gt;は見つかりません。&lt;/p&gt;
&lt;p&gt;ここからはソースコードは読んでいないので憶測ですが、&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;で呼び出されている&lt;code&gt;pre-commit&lt;/code&gt;ツール（Python製）は、設定ファイルで指定されたコマンド（&lt;code&gt;black&lt;/code&gt;など）を、コマンドとして今の呼び出されたコンテキストで実行しているのではないかということです。
実際、ターミナル上でも&lt;code&gt;source .venv/bin/activate&lt;/code&gt;を実行していない状態だとコマンドが見つからないというエラーが出ました。&lt;/p&gt;
&lt;h2 id=&#34;対処方法は&#34;&gt;対処方法は？&lt;/h2&gt;
&lt;p&gt;ということで、今考えられる対処方法としては次の通りです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;のスクリプトを修正して、&lt;code&gt;&amp;lt;プロジェクトのディレクトリ&amp;gt;/.venv/bin&lt;/code&gt;のパスを見えるようにする&lt;/li&gt;
&lt;li&gt;PyCharmで何かしらの設定を探す&lt;/li&gt;
&lt;li&gt;PyCharmではgit操作しない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;repo:local&lt;/code&gt;はあきらめて、&lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;で&lt;code&gt;black&lt;/code&gt;などは管理して、&lt;code&gt;pyproject.toml&lt;/code&gt;からは除外する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1.ですが、&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;は&lt;code&gt;precommit intall&lt;/code&gt;を実行すると自動で生成されるスクリプトです。自分の環境で書き換えたとしても他の人が同じ環境を作るときにパッチを当てるなどをしないといけなくなります。&lt;/p&gt;
&lt;p&gt;2.はそれらしい設定を見つけることができませんでした。&lt;/p&gt;
&lt;p&gt;3.はめんどくさいですよね。。。ターミナルでgitのコメントを日本語で書くためにいくつか他の設定を考えないといけないです。。。&lt;/p&gt;
&lt;p&gt;ということで、今回は4.の対処をとりました。やりたいことは、ツールや環境をそろえるのではなく、プロジェクトでやりたいことをやることなので。。。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;最終的には元に戻ってしまいました（&lt;code&gt;pyproject.toml&lt;/code&gt;に設定周りは移動した）。
Windows環境がちょっとややこしくしてるかもな？というのと、個人のプロジェクトなのでそこまで気にしなくてもいいのでは？というのもありそうです。
それにしても、世の中の皆さんはフォーマッターとかどのタイミングで動かしてるんだろう？とかどういう環境構築してるんだろう？とか気になってます。
最近だとこういうディレクトリ構造にする、こういうツールを使うと便利などあれば、コメントいただけると嬉しいです。&lt;/p&gt;
&lt;p&gt;教えてもらったISIDのブログ（&lt;a href=&#34;https://tech.isid.co.jp/entry/2023/05/02/Dev_Container%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%83%90%E3%82%A4%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E4%BD%9C%E3%82%8BPython%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1&#34;&gt;Dev Containerを使ってステップバイステップで作るPythonアプリケーション開発環境 - ISID テックブログ&lt;/a&gt;）も参考にさせてもらおうと思ってるところです。Pythonの環境をコンテナに移動したいなぁというのもあるので。ただ、PyCharmだからこのブログの通りには行かないけど（VS Codeに移るのも検討したほうがいいのかなぁ）。&lt;/p&gt;
&lt;h2 id=&#34;参考サイト&#34;&gt;参考サイト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF&#34;&gt;Git - Git フック&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pre-commit.com/&#34;&gt;pre-commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://rcmdnk.com/blog/2023/02/07/computer-python/&#34;&gt;Pythonレポジトリ用のpre-commit環境を整える&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://tech.isid.co.jp/entry/2023/05/02/Dev_Container%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%83%90%E3%82%A4%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E4%BD%9C%E3%82%8BPython%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1&#34;&gt;Dev Containerを使ってステップバイステップで作るPythonアプリケーション開発環境 - ISID テックブログ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
  </channel>
</rss>
