<?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>Dev Container on @johtaniの日記 3rd</title>
    <link>https://blog.johtani.info/tags/dev-container/</link>
    <description>Recent content in Dev Container on @johtaniの日記 3rd</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja</language>
    <lastBuildDate>Thu, 27 Jul 2023 01:22:49 +0000</lastBuildDate><atom:link href="https://blog.johtani.info/tags/dev-container/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>VS CodeとDev Container(コンテナ名の指定)</title>
      <link>https://blog.johtani.info/blog/2023/07/27/container-name-in-devcontainer/</link>
      <pubDate>Thu, 27 Jul 2023 01:22:49 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/07/27/container-name-in-devcontainer/</guid>
      <description>&lt;p&gt;いくつかある環境をDev Containerで動くように変えていますが、最初に導入した時に疑問点だった「コンテナ名」について解消したのでメモを残しておきます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;いくつかある環境をDev Containerで動くように変えていますが、最初に導入した時に疑問点だった「コンテナ名」について解消したのでメモを残しておきます。&lt;/p&gt;
&lt;h2 id=&#34;コンテナ名の指定&#34;&gt;コンテナ名の指定&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2023/07/13/introduce-vs-code-and-dev-container/#container%E3%81%AE%E5%90%8D%E5%89%8D&#34;&gt;最初のDev Container導入の記事&lt;/a&gt;で、起動したコンテナの名前が自動で付与されて、ランダムに変わるという疑問点を書いていました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2023/07/21/multi-containers-with-dev-container/#%E5%89%AF%E6%AC%A1%E7%9A%84%E3%81%AA%E5%8A%B9%E6%9E%9C&#34;&gt;docker-compose.yml対応の記事では&lt;/a&gt;docker-compose.ymlを利用すると、コンテナ名はファイル内で定義されたサービス名で起動されて見やすくなると気づきました。&lt;/p&gt;
&lt;p&gt;やはり、Dev Containerでイメージを指定している場合もわかりやすいコンテナ名がいいなと思ったところで、「&lt;code&gt;runArgs&lt;/code&gt;」を思い出しました。
Dev Containerからコンテナを起動するときに渡す引数が書けるじゃないですか。そういえば、むかしdockerコマンドを使う時に名前を指定した記憶があったなと。ということで、Google検索です。「docker command args container name」で検索しましたｗ&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.docker.com/engine/reference/run/#name---name&#34;&gt;&lt;code&gt;--name&lt;/code&gt;というオプション&lt;/a&gt;で起動時のコンテナの名前の指定ができます。ということで、このブログを生成するためのdevcontainer.jsonに&amp;quot;runArgs&amp;quot;でコンテナ名を指定してコンテナ起動ができるようになりました（「&lt;a href=&#34;https://blog.johtani.info/blog/2023/07/24/introduce-dev-container-to-hugo-env/&#34;&gt;ブログ記述環境としてのDev Container&lt;/a&gt;」という記事のdevcontainer.jsonにrunArgsの行を追加しただけ）。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hugo - blog generator&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;mcr.microsoft.com/devcontainers/javascript-node:16&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;runArgs&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;--name&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;blog_generator&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;postCreateCommand&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/sh ./.devcontainer/postCreateCommand.sh&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded>
    </item>
    
    <item>
      <title>ブログ記述環境としてのDev Container</title>
      <link>https://blog.johtani.info/blog/2023/07/24/introduce-dev-container-to-hugo-env/</link>
      <pubDate>Mon, 24 Jul 2023 09:10:32 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/07/24/introduce-dev-container-to-hugo-env/</guid>
      <description>&lt;p&gt;このブログの生成には、&lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;を利用しています。
&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;ブログ移行日記（その1）&lt;/a&gt;に書いてありますが、当時は&lt;code&gt;brew&lt;/code&gt;でインストールしていました。
また、Windowsに移行したタイミングで、WSL2のUbuntuに&lt;code&gt;apt&lt;/code&gt;でhugoをインストールして利用していました。
WSL2の環境が壊れなければこのままでもいいのですが、最近Dev Containerを触っていたので、このブログを書く環境（おもにHugo）もDev Containerにできるのでは？と気づきました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;このブログの生成には、&lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;を利用しています。
&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;ブログ移行日記（その1）&lt;/a&gt;に書いてありますが、当時は&lt;code&gt;brew&lt;/code&gt;でインストールしていました。
また、Windowsに移行したタイミングで、WSL2のUbuntuに&lt;code&gt;apt&lt;/code&gt;でhugoをインストールして利用していました。
WSL2の環境が壊れなければこのままでもいいのですが、最近Dev Containerを触っていたので、このブログを書く環境（おもにHugo）もDev Containerにできるのでは？と気づきました。&lt;/p&gt;
&lt;p&gt;ということで、Hugo＋αの環境をDev Container化したので、そのメモです。&lt;/p&gt;
&lt;h2 id=&#34;必要なもの&#34;&gt;必要なもの&lt;/h2&gt;
&lt;p&gt;ブログを書いて、記事を構築して、公開するところまでに利用するのは次のようなものです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;li&gt;Hugo&lt;/li&gt;
&lt;li&gt;node&lt;/li&gt;
&lt;li&gt;atomic-algolia&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GitHubのプライベートリポジトリでHugoのプロジェクトを管理しています。
また、GitHub Pagesで公開しており、生成したHTMLもgitコマンドを利用してGitHubにpushしています。
このため、gitコマンドが必要です。&lt;/p&gt;
&lt;p&gt;コンテンツの生成はHugoコマンドを利用します（テーマの適用とかいろいろ）。&lt;/p&gt;
&lt;p&gt;あと、Algoliaでブログを検索できるようにしており（&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/28/introduce-algolia/&#34;&gt;ブログ移行日記（その4）参照&lt;/a&gt;）、Algoliaへドキュメントのデータをアップロードするために、atomic-algoliaを利用しています。こちらは、nodeのモジュールであるので、nodeの環境も必要です。&lt;/p&gt;
&lt;h2 id=&#34;ベースにするイメージ&#34;&gt;ベースにするイメージ&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/devcontainers/templates/&#34;&gt;Dev Container Templates&lt;/a&gt;というリポジトリが公開されています。
こちらを探すと、元となるdevcontainer.jsonが見つかることがあります。
Hugoのものがあるか探してみましたが、残念ながら見つかったのはJekyllのテンプレートでした。
今回は、nodeの環境が必要なので&lt;a href=&#34;https://github.com/devcontainers/templates/tree/main/src/javascript-node&#34;&gt;javascript-node&lt;/a&gt;を元に編集していきます。&lt;/p&gt;
&lt;p&gt;手元のUbuntuのnodeのバージョンが16だったので、バージョン16のイメージを指定します(devcontainer.jsonは後述)。&lt;/p&gt;
&lt;h2 id=&#34;hugoの追加&#34;&gt;Hugoの追加&lt;/h2&gt;
&lt;p&gt;Hugoのテンプレートはなかったのですが、&lt;a href=&#34;https://github.com/devcontainers/features/blob/main/README.md&#34;&gt;Dev Container Features&lt;/a&gt;に&lt;a href=&#34;https://github.com/devcontainers/features/tree/main/src/hugo&#34;&gt;Hugoのfeature&lt;/a&gt;が用意されていました。
&lt;code&gt;features&lt;/code&gt;に1行追加するだけでコンテナにHugoをインストールしてくれる便利ものです。&lt;/p&gt;
&lt;h2 id=&#34;markdownの環境&#34;&gt;Markdownの環境&lt;/h2&gt;
&lt;p&gt;Dev Container Templatesを探索していて&lt;a href=&#34;https://github.com/devcontainers/templates/tree/main/src/markdown&#34;&gt;見つけたMarkdownのテンプレート&lt;/a&gt;も参考にしてみました。
VS CodeのMarkdown向けの拡張機能がいくつかリストアップされていたので、ついでに追加です。
&lt;code&gt;markdown-all-in-one&lt;/code&gt;や&lt;code&gt;markdownlint&lt;/code&gt;はこれまでも利用していたので、他のものも便利だろうということで。
他の物はどんなものかを後で調べてみる予定です。&lt;/p&gt;
&lt;h2 id=&#34;作ったdevcontainerの設定はこちら&#34;&gt;作った.devcontainerの設定はこちら&lt;/h2&gt;
&lt;p&gt;ということで、出来上がった設定は以下の通りです。&lt;/p&gt;
&lt;h3 id=&#34;devcontainerjson&#34;&gt;devcontainer.json&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hugo - blog generator&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;mcr.microsoft.com/devcontainers/javascript-node:16&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;postCreateCommand&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/sh ./.devcontainer/postCreateCommand.sh&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;features&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;ghcr.io/devcontainers/features/hugo:1&amp;#34;&lt;/span&gt;: {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;customizations&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;vscode&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;extensions&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;yzhang.markdown-all-in-one&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;streetsidesoftware.code-spell-checker&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DavidAnson.vscode-markdownlint&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;shd101wyy.markdown-preview-enhanced&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bierner.github-markdown-preview&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;postCreateCommand.sh&lt;/code&gt;では、npm installで、必要なモジュールのインストールをコンテナビルド後に実行できるようにしました。
（&lt;code&gt;apt update&lt;/code&gt;はなくてもいいな）&lt;/p&gt;
&lt;h3 id=&#34;postcreatecommandsh&#34;&gt;postCreateCommand.sh&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# postCreateCommand.sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;START Install&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo chown -R vscode:vscode .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;FINISH Install&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、ここ最近Dev Containerについて色々調べていたのでサクッとDev Container化ができました。
まぁ、HugoのFeatureが用意されていて、他に大したことをやっていないというのが大きいのですが。
このブログは今回構築したDev Containerで生成して公開した記事になります。&lt;/p&gt;
</content:encoded>
    </item>
    
    <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>
    
  </channel>
</rss>
