<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Devcontainer on ポンコツ地方エンジニアの技術ブログ</title><link>https://blog.ponkotools.com/tags/devcontainer/</link><description>Recent content in Devcontainer on ポンコツ地方エンジニアの技術ブログ</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><lastBuildDate>Wed, 13 May 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://blog.ponkotools.com/tags/devcontainer/index.xml" rel="self" type="application/rss+xml"/><item><title>Claude Code の認証情報とチャット履歴を devcontainer とホストで共有する</title><link>https://blog.ponkotools.com/posts/2026/05/13/claude-devcontainer-share/</link><pubDate>Wed, 13 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/13/claude-devcontainer-share/</guid><description>&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 24.04&lt;/li&gt;
&lt;li&gt;VSCode 1.119.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="きっかけ"&gt;&lt;a href="#%e3%81%8d%e3%81%a3%e3%81%8b%e3%81%91" class="header-anchor"&gt;&lt;/a&gt;きっかけ
&lt;/h2&gt;&lt;p&gt;devcontainer をリビルドするたびに Claude Code に再ログインするのが地味にストレスでした。さらに、ホスト側で進めていた会話の続きが devcontainer 側からは見えず、「あの修正の文脈どこに残してたっけ」となりがちでした。&lt;/p&gt;
&lt;h2 id="ゴール構成"&gt;&lt;a href="#%e3%82%b4%e3%83%bc%e3%83%ab%e6%a7%8b%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;ゴール構成
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ホスト・devcontainer のどちらで起動しても &lt;strong&gt;同じ認証情報&lt;/strong&gt; を使える&lt;/li&gt;
&lt;li&gt;ホストで途中まで進めた会話を devcontainer 側でも &lt;strong&gt;そのまま継続&lt;/strong&gt; できる&lt;/li&gt;
&lt;li&gt;リビルドしても再ログイン不要&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="claude-code-が何を見ているかを把握する"&gt;&lt;a href="#claude-code-%e3%81%8c%e4%bd%95%e3%82%92%e8%a6%8b%e3%81%a6%e3%81%84%e3%82%8b%e3%81%8b%e3%82%92%e6%8a%8a%e6%8f%a1%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;Claude Code が何を見ているかを把握する
&lt;/h2&gt;&lt;p&gt;設定の前に、Claude Code が以下の 2 つを参照していることを押さえておきます。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;種類&lt;/th&gt;
 &lt;th&gt;場所&lt;/th&gt;
 &lt;th&gt;役割&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;認証情報・設定&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;~/.claude.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;API キーなど&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;セッション履歴&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;~/.claude/projects/&amp;lt;エンコードしたパス&amp;gt;/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;プロジェクトごとの会話履歴&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ポイントは、セッション履歴の格納先が &lt;strong&gt;プロジェクトの絶対パスをスラッシュ → ハイフンに変換した名前&lt;/strong&gt; になっていることです。&lt;/p&gt;
&lt;p&gt;例えばホスト側で &lt;code&gt;/home/&amp;lt;username&amp;gt;/&amp;lt;project_name&amp;gt;&lt;/code&gt; を開いていた場合は、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/.claude/projects/-home-&amp;lt;username&amp;gt;-&amp;lt;project_name&amp;gt;/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;の下に履歴が溜まります。&lt;/p&gt;
&lt;p&gt;つまり、履歴を共有したいなら &lt;strong&gt;ホストとコンテナで「ワークスペースの絶対パス」を一致させる必要がある&lt;/strong&gt; ということです。&lt;code&gt;~/.claude&lt;/code&gt; だけ bind mount しても、コンテナ側のワークスペースパスがホストと違えば別フォルダ扱いになり、履歴は共有されません。&lt;/p&gt;
&lt;h2 id="設定する-2-つのマウント"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b-2-%e3%81%a4%e3%81%ae%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;設定する 2 つのマウント
&lt;/h2&gt;&lt;p&gt;必要なマウントは性質の違う 2 種類になります。&lt;/p&gt;
&lt;h3 id="1-claude--claudejson-のマウント--コンテナ側ユーザーの-home-に合わせる"&gt;&lt;a href="#1-claude--claudejson-%e3%81%ae%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88--%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e5%81%b4%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e3%81%ae-home-%e3%81%ab%e5%90%88%e3%82%8f%e3%81%9b%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;1. &lt;code&gt;.claude&lt;/code&gt; / &lt;code&gt;.claude.json&lt;/code&gt; のマウント (= コンテナ側ユーザーの home に合わせる)
&lt;/h3&gt;&lt;p&gt;Claude Code は &lt;strong&gt;そのプロセスの &lt;code&gt;$HOME/.claude&lt;/code&gt;&lt;/strong&gt; を読みに行きます。devcontainer のデフォルトユーザーは &lt;code&gt;vscode&lt;/code&gt; なので、&lt;code&gt;~&lt;/code&gt; は &lt;code&gt;/home/vscode&lt;/code&gt; です。したがってターゲットも &lt;code&gt;/home/vscode/.claude&lt;/code&gt; にします。&lt;/p&gt;
&lt;h3 id="2-ワークスペースのマウント--ホスト側の絶対パスに合わせる"&gt;&lt;a href="#2-%e3%83%af%e3%83%bc%e3%82%af%e3%82%b9%e3%83%9a%e3%83%bc%e3%82%b9%e3%81%ae%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88--%e3%83%9b%e3%82%b9%e3%83%88%e5%81%b4%e3%81%ae%e7%b5%b6%e5%af%be%e3%83%91%e3%82%b9%e3%81%ab%e5%90%88%e3%82%8f%e3%81%9b%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;2. ワークスペースのマウント (= ホスト側の絶対パスに合わせる)
&lt;/h3&gt;&lt;p&gt;こちらはセッション履歴のキーになる「プロジェクトの絶対パス」を一致させるのが目的なので、ターゲットを &lt;strong&gt;ホスト側と同じパス&lt;/strong&gt; にします。ホストの &lt;code&gt;~/&amp;lt;project_name&amp;gt;&lt;/code&gt; を開いているなら、コンテナ内でも &lt;code&gt;/home/&amp;lt;username&amp;gt;/&amp;lt;project_name&amp;gt;&lt;/code&gt; にマウントするということです。&lt;/p&gt;
&lt;p&gt;ターゲットの基準が違う (ユーザー基準 vs ホスト基準) のがややこしい部分なので、表にしておきます。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;マウント&lt;/th&gt;
 &lt;th&gt;ターゲット&lt;/th&gt;
 &lt;th&gt;基準&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;~/.claude&lt;/code&gt; &lt;code&gt;~/.claude.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/home/vscode/.claude&lt;/code&gt; &lt;code&gt;/home/vscode/.claude.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;コンテナ内ユーザー&lt;/strong&gt; の home&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ワークスペース&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/home/&amp;lt;username&amp;gt;/&amp;lt;project_name&amp;gt;&lt;/code&gt; 等&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;ホスト側&lt;/strong&gt; の絶対パス&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="devcontainerjson-の例"&gt;&lt;a href="#devcontainerjson-%e3%81%ae%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;devcontainer.json の例
&lt;/h2&gt;&lt;p&gt;上記を踏まえた &lt;code&gt;.devcontainer/devcontainer.json&lt;/code&gt; の抜粋です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsonc" data-lang="jsonc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;my-devcontainer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;build&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;dockerfile&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Dockerfile&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ホストの $HOME を build arg として Dockerfile に渡す
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// (workspace の親ディレクトリを事前に作るために使う。後述)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;WORKSPACE_PARENT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${localEnv:HOME}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ワークスペースのマウント先をホスト側の絶対パスと一致させる。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// フォルダ名は localWorkspaceFolderBasename で動的解決するので、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ホスト側を rename しても devcontainer.json の編集は不要。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;workspaceMount&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;source=${localWorkspaceFolder},target=${localEnv:HOME}/${localWorkspaceFolderBasename},type=bind,consistency=cached&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;workspaceFolder&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${localEnv:HOME}/${localWorkspaceFolderBasename}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mounts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// .claude / .claude.json はコンテナ内ユーザー (vscode) の home にマウント
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;source=${localEnv:HOME}/.claude,target=/home/vscode/.claude,type=bind,consistency=cached&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;source=${localEnv:HOME}/.claude.json,target=/home/vscode/.claude.json,type=bind,consistency=cached&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;remoteUser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;vscode&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;${localEnv:HOME}&lt;/code&gt; は &lt;strong&gt;ホスト側&lt;/strong&gt; の &lt;code&gt;$HOME&lt;/code&gt; (例: &lt;code&gt;/home/&amp;lt;username&amp;gt;&lt;/code&gt;)、&lt;code&gt;${localWorkspaceFolderBasename}&lt;/code&gt; は VSCode が開いているフォルダ名 (例: &lt;code&gt;&amp;lt;project_name&amp;gt;&lt;/code&gt;) に展開されます。両者を組み合わせることで、ホストで開いているパスと完全に同じ絶対パスをコンテナ内に作れます。&lt;/p&gt;
&lt;h2 id="dockerfile-側で親ディレクトリを用意しておく"&gt;&lt;a href="#dockerfile-%e5%81%b4%e3%81%a7%e8%a6%aa%e3%83%87%e3%82%a3%e3%83%ac%e3%82%af%e3%83%88%e3%83%aa%e3%82%92%e7%94%a8%e6%84%8f%e3%81%97%e3%81%a6%e3%81%8a%e3%81%8f" class="header-anchor"&gt;&lt;/a&gt;Dockerfile 側で親ディレクトリを用意しておく
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;workspaceFolder&lt;/code&gt; に指定したパスの &lt;strong&gt;親ディレクトリ&lt;/strong&gt; がコンテナ内に存在しないと、Dev Containers の起動チェックで「ワークスペースが存在しません」とエラーになります。bind mount はマウント時にターゲットを作ってくれますが、Dev Containers のチェックがそれより先に走るためです。&lt;/p&gt;
&lt;p&gt;そこで Dockerfile 側で親ディレクトリだけ先に作っておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/devcontainers/base:bookworm&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# devcontainer.json の workspaceFolder (= ホストの $HOME/&amp;lt;フォルダ名&amp;gt;) と&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 同じ絶対パスをコンテナ内に用意しておく。&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ARG&lt;/span&gt; &lt;span class="nv"&gt;WORKSPACE_PARENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/vscode&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; mkdir -p &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKSPACE_PARENT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ARG のデフォルト値を &lt;code&gt;/home/vscode&lt;/code&gt; にしておけば、build arg を渡し忘れても既存ユーザーのホームが使われるだけで build が壊れることはありません。&lt;/p&gt;
&lt;h2 id="ユーザーは-vscode-のままでよい"&gt;&lt;a href="#%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e3%81%af-vscode-%e3%81%ae%e3%81%be%e3%81%be%e3%81%a7%e3%82%88%e3%81%84" class="header-anchor"&gt;&lt;/a&gt;ユーザーは vscode のままでよい
&lt;/h2&gt;&lt;p&gt;「ワークスペースが &lt;code&gt;/home/&amp;lt;username&amp;gt;/&amp;lt;project_name&amp;gt;&lt;/code&gt; なのに &lt;code&gt;whoami&lt;/code&gt; すると &lt;code&gt;vscode&lt;/code&gt; になっている」というアンバランスさが気になるかもしれませんが、機能上は問題ありません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;devcontainers/base の &lt;code&gt;vscode&lt;/code&gt; ユーザーは UID 1000&lt;/li&gt;
&lt;li&gt;ホスト側の Linux ユーザーも通常 UID 1000&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;UID が一致していれば bind mount したファイルにそのまま読み書きできるためです。&lt;code&gt;vscode&lt;/code&gt; ユーザーが自分の home (&lt;code&gt;/home/vscode/&lt;/code&gt;) 以外の場所で作業すること自体は何も問題を起こしません。&lt;/p&gt;
&lt;p&gt;ユーザー名まで揃えようとすると base image の改造が必要になり、devcontainer features が前提にしている &lt;code&gt;vscode&lt;/code&gt; ユーザーが消えて壊れがちです。&lt;strong&gt;ホストと揃えるのは「絶対パス」だけで十分&lt;/strong&gt; と割り切るのが楽です。&lt;/p&gt;
&lt;h2 id="注意点"&gt;&lt;a href="#%e6%b3%a8%e6%84%8f%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;注意点
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ホスト側に &lt;code&gt;~/.claude&lt;/code&gt; と &lt;code&gt;~/.claude.json&lt;/code&gt; が存在している必要があります&lt;/strong&gt;。なければ bind mount に失敗します。ホスト側でも一度 Claude Code を起動して認証を済ませておくのが手っ取り早いです。&lt;/li&gt;
&lt;li&gt;セッション履歴を &lt;strong&gt;ホストと同時に書き込まない&lt;/strong&gt; よう注意してください。両方から同じプロジェクトを同時に触ると、ファイルロック等の衝突で履歴が壊れることがあります。基本「どちらか一方で作業する」運用が安全です。&lt;/li&gt;
&lt;li&gt;設定変更後は VSCode の &lt;strong&gt;Dev Containers: Rebuild Container&lt;/strong&gt; でリビルドしないと反映されません。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="まとめ"&gt;&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81" class="header-anchor"&gt;&lt;/a&gt;まとめ
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Claude Code のセッション履歴は &lt;strong&gt;プロジェクトの絶対パスをキー&lt;/strong&gt; にして格納される。&lt;/li&gt;
&lt;li&gt;なので「ホストとセッション共有したい」ならコンテナ内のワークスペースパスをホスト側と完全一致させる必要がある。&lt;/li&gt;
&lt;li&gt;マウント先は 2 系統で基準が違う:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.claude&lt;/code&gt; / &lt;code&gt;.claude.json&lt;/code&gt; は &lt;strong&gt;コンテナ内ユーザーの home&lt;/strong&gt; に合わせる&lt;/li&gt;
&lt;li&gt;ワークスペースは &lt;strong&gt;ホスト側の絶対パス&lt;/strong&gt; に合わせる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ワークスペースの親ディレクトリは Dockerfile 側で &lt;code&gt;mkdir -p&lt;/code&gt; しておく必要がある。&lt;/li&gt;
&lt;li&gt;フォルダ名は &lt;code&gt;${localWorkspaceFolderBasename}&lt;/code&gt; で動的解決すれば、rename にも追従する。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>GitHub CLI (gh auth login) で Git の HTTPS 認証を安全にする</title><link>https://blog.ponkotools.com/posts/2026/05/11/github-cli-auth/</link><pubDate>Mon, 11 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/11/github-cli-auth/</guid><description>&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 24.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="きっかけ"&gt;&lt;a href="#%e3%81%8d%e3%81%a3%e3%81%8b%e3%81%91" class="header-anchor"&gt;&lt;/a&gt;きっかけ
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;git remote -v&lt;/code&gt; を眺めていたら、Personal Access Token (PAT) が remote URL に丸ごと埋め込まれている状態になっていました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;origin https://ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxx@github.com/USER/REPO.git (fetch)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;origin https://ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxx@github.com/USER/REPO.git (push)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;.git/config&lt;/code&gt; はリポジトリに含まれないため「push しても外には出ない」ものの、ローカルで露出する経路は意外と多くあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;シェル履歴 (&lt;code&gt;~/.bash_history&lt;/code&gt; &lt;code&gt;~/.zsh_history&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;エディタや CI のログ、画面共有・スクリーンショット&lt;/li&gt;
&lt;li&gt;うっかり配布した dotfiles リポジトリ&lt;/li&gt;
&lt;li&gt;マルウェアやリモートアクセスで &lt;code&gt;.git/config&lt;/code&gt; が読まれる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;しかも classic PAT はスコープが粗く、&lt;code&gt;repo&lt;/code&gt; 権限があれば private リポジトリ全体の閲覧・書き換え、強制 push による履歴破壊、GitHub Actions secrets の窃取まで可能になります。攻撃者は奪った瞬間には何もせず静かに watch することもできるため、「使われた形跡がない」では安心できません。&lt;/p&gt;
&lt;p&gt;これを機に、PAT を URL に埋めず GitHub CLI (&lt;code&gt;gh&lt;/code&gt;) の credential helper に任せる構成に切り替えました。&lt;/p&gt;
&lt;h2 id="ゴール構成"&gt;&lt;a href="#%e3%82%b4%e3%83%bc%e3%83%ab%e6%a7%8b%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;ゴール構成
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;remote URL は素の &lt;code&gt;https://github.com/USER/REPO.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;認証は &lt;code&gt;gh&lt;/code&gt; が credential helper として処理 (トークンは OS のセキュアストア管理)&lt;/li&gt;
&lt;li&gt;devcontainer を作り直しても再ログイン不要&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="手順"&gt;&lt;a href="#%e6%89%8b%e9%a0%86" class="header-anchor"&gt;&lt;/a&gt;手順
&lt;/h2&gt;&lt;h3 id="1-露出したトークンを-revoke-最優先"&gt;&lt;a href="#1-%e9%9c%b2%e5%87%ba%e3%81%97%e3%81%9f%e3%83%88%e3%83%bc%e3%82%af%e3%83%b3%e3%82%92-revoke-%e6%9c%80%e5%84%aa%e5%85%88" class="header-anchor"&gt;&lt;/a&gt;1. 露出したトークンを revoke (最優先)
&lt;/h3&gt;&lt;p&gt;remote URL を書き換える前に、まず GitHub 側でトークンを無効化します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;classic PAT: &lt;a class="link" href="https://github.com/settings/tokens" target="_blank" rel="noopener"
 &gt;https://github.com/settings/tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;fine-grained PAT: &lt;a class="link" href="https://github.com/settings/personal-access-tokens" target="_blank" rel="noopener"
 &gt;https://github.com/settings/personal-access-tokens&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;該当トークンを Delete した瞬間に無効になります。順序として &lt;strong&gt;これを先にやる&lt;/strong&gt; ことが大切です。後の手順を待っている間に古いトークンが他経路で使われるリスクを断ちます。&lt;/p&gt;
&lt;h3 id="2-gh-をインストール"&gt;&lt;a href="#2-gh-%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;2. &lt;code&gt;gh&lt;/code&gt; をインストール
&lt;/h3&gt;&lt;p&gt;devcontainer 環境なら &lt;code&gt;ghcr.io/devcontainers/features/github-cli&lt;/code&gt; feature で &lt;code&gt;gh&lt;/code&gt; がすでに入っています。&lt;/p&gt;
&lt;p&gt;ホスト (Ubuntu 24.04) に入れる場合は、以下の記事を参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.ponkotools.com/posts/2026/05/09/github-cli/" &gt;GitHub CLI (gh) のインストールと基本的な使い方&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-gh-auth-login-で認証"&gt;&lt;a href="#3-gh-auth-login-%e3%81%a7%e8%aa%8d%e8%a8%bc" class="header-anchor"&gt;&lt;/a&gt;3. &lt;code&gt;gh auth login&lt;/code&gt; で認証
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh auth login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;対話で以下のように選びます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;? Where do you use GitHub? GitHub.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;? What is your preferred protocol for Git operations? HTTPS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;? Authenticate Git with your GitHub credentials? Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;? How would you like to authenticate GitHub CLI? Login with a web browser
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Authenticate Git with your GitHub credentials? → Yes&lt;/code&gt; が肝で、これが &lt;code&gt;git config --global credential.helper&lt;/code&gt; を &lt;code&gt;gh&lt;/code&gt; 経由に書き換えてくれます。以後 &lt;code&gt;git push&lt;/code&gt; のたびに &lt;code&gt;gh&lt;/code&gt; が裏でトークンを取り出して認証してくれます。&lt;/p&gt;
&lt;p&gt;devcontainer のようなヘッドレス環境ではブラウザは自動で開きません。表示される 8 桁のワンタイムコードをコピーし、ホスト側のブラウザで &lt;a class="link" href="https://github.com/login/device" target="_blank" rel="noopener"
 &gt;https://github.com/login/device&lt;/a&gt; に貼って承認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✓ Authentication complete.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✓ Logged in as USER
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-remote-url-からトークンを除去"&gt;&lt;a href="#4-remote-url-%e3%81%8b%e3%82%89%e3%83%88%e3%83%bc%e3%82%af%e3%83%b3%e3%82%92%e9%99%a4%e5%8e%bb" class="header-anchor"&gt;&lt;/a&gt;4. remote URL からトークンを除去
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote set-url origin https://github.com/USER/REPO.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;トークン部分が消えていれば OK です。&lt;code&gt;git fetch origin&lt;/code&gt; がパスワードを聞かれずに通れば認証は機能しています。&lt;/p&gt;
&lt;h3 id="5-シェル履歴の残骸を確認"&gt;&lt;a href="#5-%e3%82%b7%e3%82%a7%e3%83%ab%e5%b1%a5%e6%ad%b4%e3%81%ae%e6%ae%8b%e9%aa%b8%e3%82%92%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;5. シェル履歴の残骸を確認
&lt;/h3&gt;&lt;p&gt;revoke 済みでも、ローカル履歴に残ったトークン文字列は気持ちが悪いものです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -rn &lt;span class="s1"&gt;&amp;#39;ghp_&amp;#39;&lt;/span&gt; ~/.bash_history ~/.zsh_history 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ヒットしたら該当行を削除します (&lt;code&gt;history -d &amp;lt;行番号&amp;gt;&lt;/code&gt; でメモリ上を消した後、ファイルも編集しておきます)。&lt;/p&gt;
&lt;h2 id="devcontainer-での認証共有"&gt;&lt;a href="#devcontainer-%e3%81%a7%e3%81%ae%e8%aa%8d%e8%a8%bc%e5%85%b1%e6%9c%89" class="header-anchor"&gt;&lt;/a&gt;devcontainer での認証共有
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;gh&lt;/code&gt; の認証情報は &lt;code&gt;~/.config/gh/hosts.yml&lt;/code&gt; (と OS のセキュアストア) に保存されます。devcontainer をリビルドすると &lt;code&gt;~/.config/gh&lt;/code&gt; が消えて再ログインが必要になるため、ホストの設定を bind mount で共有します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.devcontainer/devcontainer.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsonc" data-lang="jsonc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;mounts&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;source=${localEnv:HOME}/.claude,target=/home/vscode/.claude,type=bind,consistency=cached&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;source=${localEnv:HOME}/.claude.json,target=/home/vscode/.claude.json,type=bind,consistency=cached&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;source=${localEnv:HOME}/.config/gh,target=/home/vscode/.config/gh,type=bind,consistency=cached&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;前提として &lt;strong&gt;ホスト側に &lt;code&gt;~/.config/gh&lt;/code&gt; ディレクトリが存在している必要があります&lt;/strong&gt; (なければ bind mount に失敗します)。ホストにも &lt;code&gt;gh&lt;/code&gt; を入れて &lt;code&gt;gh auth login&lt;/code&gt; 済みにしておくのが一番シンプルです。事情があってホスト側で &lt;code&gt;gh&lt;/code&gt; を使わない場合でも、空ディレクトリだけ作っておけばマウント自体は通ります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p ~/.config/gh &lt;span class="c1"&gt;# ホスト側で実行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;設定変更後は VSCode の &lt;strong&gt;Dev Containers: Rebuild Container&lt;/strong&gt; でリビルドすると反映されます。&lt;/p&gt;
&lt;h2 id="補足-ssh-鍵にしないのか"&gt;&lt;a href="#%e8%a3%9c%e8%b6%b3-ssh-%e9%8d%b5%e3%81%ab%e3%81%97%e3%81%aa%e3%81%84%e3%81%ae%e3%81%8b" class="header-anchor"&gt;&lt;/a&gt;補足: SSH 鍵にしないのか
&lt;/h2&gt;&lt;p&gt;SSH 鍵認証もアリですが、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;鍵ファイル自体の管理 (&lt;code&gt;~/.ssh&lt;/code&gt; のパーミッション、複数マシン間の同期) が発生します&lt;/li&gt;
&lt;li&gt;GitHub Actions など他用途で &lt;code&gt;gh&lt;/code&gt; をどのみち使うことが多いです&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そのため、個人開発の HTTPS なら &lt;code&gt;gh auth login&lt;/code&gt; ひとつに寄せた方がメンテが楽だと感じています。複数アカウントの切替も &lt;code&gt;gh auth switch&lt;/code&gt; で済むのが良いところです。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81" class="header-anchor"&gt;&lt;/a&gt;まとめ
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;PAT を URL に埋めるのは「公開リポジトリに含まれない」だけでローカル経路の露出リスクは大きいです。露出に気付いた時点で revoke が最優先となります。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gh auth login&lt;/code&gt; で credential helper を任せれば URL からトークンを排除でき、トークンは OS のセキュアストアに隔離されます。&lt;/li&gt;
&lt;li&gt;devcontainer ではホストの &lt;code&gt;~/.config/gh&lt;/code&gt; を bind mount しておくと、リビルドのたびに再ログインしなくて済みます。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ターミナルから GitLab を操る：公式 CLI「glab」導入・活用ガイド</title><link>https://blog.ponkotools.com/posts/2026/05/10/glab/</link><pubDate>Sun, 10 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/10/glab/</guid><description>&lt;p&gt;ブラウザを開かずに Issue を確認したり、MR（マージリクエスト）を作成したり、CI/CD パイプラインの状況を監視したりできるため、エンジニアの生産性を大きく向上させてくれます。&lt;/p&gt;
&lt;h2 id="1-インストール方法"&gt;&lt;a href="#1-%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;1. インストール方法
&lt;/h2&gt;&lt;p&gt;devcontainer を使っていない場合は、ホスト側に &lt;code&gt;glab&lt;/code&gt; をインストールして使います。devcontainer を使う場合は、コンテナイメージに &lt;code&gt;glab&lt;/code&gt; をインストールしておくか、devcontainer の &lt;code&gt;Dockerfile&lt;/code&gt; / &lt;code&gt;devcontainer.json&lt;/code&gt; で導入しておきます。&lt;/p&gt;
&lt;p&gt;一般的な手順としては、&lt;code&gt;Dockerfile&lt;/code&gt; に &lt;code&gt;curl&lt;/code&gt; で &lt;code&gt;glab&lt;/code&gt; の公式パッケージを取得して &lt;code&gt;apt install&lt;/code&gt; するか、&lt;code&gt;apt&lt;/code&gt; リポジトリからインストールする形です。コンテナ内で &lt;code&gt;glab --version&lt;/code&gt; を実行して、インストールが正しくできていることを確認してください。&lt;/p&gt;
&lt;p&gt;OS ごとの主要なインストールコマンドは以下の通りです。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;OS&lt;/th&gt;
 &lt;th&gt;インストールコマンド&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;macOS&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;brew install glab&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Windows (winget)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;winget install glab&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Windows (scoop)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;scoop install glab&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Linux (Ubuntu/Debian)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;sudo apt install glab&lt;/code&gt;（※公式リポジトリ推奨）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;インストール後、&lt;code&gt;glab --version&lt;/code&gt; で正常にインストールされたか確認しましょう。&lt;/p&gt;
&lt;p&gt;バージョンが古かったり、上記でインストールできない場合は、公式リリースからダウンロードしてインストールします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gitlab.com/gitlab-org/cli/-/releases" target="_blank" rel="noopener"
 &gt;https://gitlab.com/gitlab-org/cli/-/releases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://gitlab.com/gitlab-org/cli/-/releases/v1.97.0/downloads/glab_1.97.0_linux_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dpkg -i glab_1.97.0_linux_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="2-初期設定認証"&gt;&lt;a href="#2-%e5%88%9d%e6%9c%9f%e8%a8%ad%e5%ae%9a%e8%aa%8d%e8%a8%bc" class="header-anchor"&gt;&lt;/a&gt;2. 初期設定（認証）
&lt;/h2&gt;&lt;p&gt;インストールが完了したら、GitLab アカウントと連携させます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;glab auth login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行すると対話形式で以下の項目を聞かれます：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GitLab インスタンスの種類&lt;/strong&gt;: GitLab.com か 自前運用のサーバー（Self-Managed）かを選択。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;認証方法&lt;/strong&gt;: &lt;code&gt;Web&lt;/code&gt; を選択するとブラウザが開いて簡単に認証できます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;プロトコル&lt;/strong&gt;: &lt;code&gt;SSH&lt;/code&gt; または &lt;code&gt;HTTPS&lt;/code&gt; を選択。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;設定が完了すると、&lt;code&gt;~/.config/glab-cli/config.yml&lt;/code&gt; に設定が保存されます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-devcontainer-での認証情報共有"&gt;&lt;a href="#3-devcontainer-%e3%81%a7%e3%81%ae%e8%aa%8d%e8%a8%bc%e6%83%85%e5%a0%b1%e5%85%b1%e6%9c%89" class="header-anchor"&gt;&lt;/a&gt;3. devcontainer での認証情報共有
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;glab&lt;/code&gt; の認証情報は &lt;code&gt;~/.config/glab-cli/config.yml&lt;/code&gt; に保存されます。devcontainer をリビルドするとコンテナ内の &lt;code&gt;~/.config/glab-cli&lt;/code&gt; が消えて再ログインが必要になるため、ホスト側の設定を bind mount で共有しておくと便利です。&lt;/p&gt;
&lt;p&gt;一般的には、&lt;code&gt;.devcontainer/devcontainer.json&lt;/code&gt; の &lt;code&gt;mounts&lt;/code&gt; にホストの &lt;code&gt;~/.config/glab-cli&lt;/code&gt; を追加します。例:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsonc" data-lang="jsonc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;mounts&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;source=${localEnv:HOME}/.config/glab-cli,target=/home/vscode/.config/glab-cli,type=bind,consistency=cached&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;gh&lt;/code&gt; など別の CLI も devcontainer 内で使うなら、同じように &lt;code&gt;~/.config/gh&lt;/code&gt; を共有することもできます。&lt;/p&gt;
&lt;p&gt;ホスト側に &lt;code&gt;~/.config/glab-cli&lt;/code&gt; が存在していれば、ホストで一度 &lt;code&gt;glab auth login&lt;/code&gt; しておけばコンテナ側でも同じ認証を使えます。ホストにディレクトリがない場合は、&lt;code&gt;mkdir -p ~/.config/glab-cli&lt;/code&gt; で空ディレクトリを作成しておけばマウントが通ります。&lt;/p&gt;
&lt;p&gt;このようにしておけば、&lt;code&gt;glab&lt;/code&gt; の認証設定をホストと devcontainer で共通化し、コンテナ再構築後も再ログイン不要で作業を続けやすくなります。&lt;/p&gt;
&lt;h2 id="4-よく使う基本コマンド集"&gt;&lt;a href="#4-%e3%82%88%e3%81%8f%e4%bd%bf%e3%81%86%e5%9f%ba%e6%9c%ac%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e9%9b%86" class="header-anchor"&gt;&lt;/a&gt;4. よく使う基本コマンド集
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;glab&lt;/code&gt; のコマンド体系は &lt;code&gt;glab &amp;lt;リソース名&amp;gt; &amp;lt;アクション&amp;gt;&lt;/code&gt; という形式で、&lt;code&gt;gh&lt;/code&gt; と非常に似ています。&lt;/p&gt;
&lt;h3 id="-merge-request-mr-を操作する"&gt;&lt;a href="#-merge-request-mr-%e3%82%92%e6%93%8d%e4%bd%9c%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;■ Merge Request (MR) を操作する
&lt;/h3&gt;&lt;p&gt;開発のメイン作業となる MR 操作です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MR の一覧表示&lt;/strong&gt;: &lt;code&gt;glab mr list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MR の作成&lt;/strong&gt;: &lt;code&gt;glab mr create --fill&lt;/code&gt;（現在のブランチから自動入力で作成）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MR の詳細表示&lt;/strong&gt;: &lt;code&gt;glab mr view &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MR を承認&lt;/strong&gt;: &lt;code&gt;glab mr approve &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MR をマージ&lt;/strong&gt;: &lt;code&gt;glab mr merge &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-issue-課題-を管理する"&gt;&lt;a href="#-issue-%e8%aa%b2%e9%a1%8c-%e3%82%92%e7%ae%a1%e7%90%86%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;■ Issue (課題) を管理する
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Issue 一覧&lt;/strong&gt;: &lt;code&gt;glab issue list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Issue 作成&lt;/strong&gt;: &lt;code&gt;glab issue create -t &amp;quot;タイトル&amp;quot; -description &amp;quot;内容&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-cicd-パイプラインを確認する"&gt;&lt;a href="#-cicd-%e3%83%91%e3%82%a4%e3%83%97%e3%83%a9%e3%82%a4%e3%83%b3%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;■ CI/CD パイプラインを確認する
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;glab&lt;/code&gt; 独自の強力な機能の一つが、CI パイプラインのリアルタイム監視です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;パイプラインの状態表示&lt;/strong&gt;: &lt;code&gt;glab pipeline status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;実行中のログをリアルタイム表示&lt;/strong&gt;: &lt;code&gt;glab pipeline ci view&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;失敗したジョブの再実行&lt;/strong&gt;: &lt;code&gt;glab ci retry&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="4-gh-と-glab-の主な対応表"&gt;&lt;a href="#4-gh-%e3%81%a8-glab-%e3%81%ae%e4%b8%bb%e3%81%aa%e5%af%be%e5%bf%9c%e8%a1%a8" class="header-anchor"&gt;&lt;/a&gt;4. &lt;code&gt;gh&lt;/code&gt; と &lt;code&gt;glab&lt;/code&gt; の主な対応表
&lt;/h2&gt;&lt;p&gt;GitHub CLI に慣れている方向けのクイック比較です。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;機能&lt;/th&gt;
 &lt;th&gt;GitHub (&lt;code&gt;gh&lt;/code&gt;)&lt;/th&gt;
 &lt;th&gt;GitLab (&lt;code&gt;glab&lt;/code&gt;)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;認証&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;gh auth login&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;glab auth login&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PR / MR 作成&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;gh pr create&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;&lt;code&gt;glab mr create&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PR / MR チェックアウト&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;gh pr checkout &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;&lt;code&gt;glab mr checkout &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;リポジトリ作成&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;gh repo create&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;&lt;code&gt;glab project create&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CI 監視&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;gh run watch&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;&lt;code&gt;glab pipeline ci view&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="5-自社運用の-gitlab-self-managed-で使うコツ"&gt;&lt;a href="#5-%e8%87%aa%e7%a4%be%e9%81%8b%e7%94%a8%e3%81%ae-gitlab-self-managed-%e3%81%a7%e4%bd%bf%e3%81%86%e3%82%b3%e3%83%84" class="header-anchor"&gt;&lt;/a&gt;5. 自社運用の GitLab (Self-Managed) で使うコツ
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;glab&lt;/code&gt; は GitLab.com だけでなく、会社などで独自に立てている GitLab サーバーでも使えます。その場合、環境変数でホストを指定しておくと便利です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;GITLAB_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gitlab.example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="まとめ"&gt;&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81" class="header-anchor"&gt;&lt;/a&gt;まとめ
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;glab&lt;/code&gt; を導入することで、「コードを書く → プッシュする → ブラウザで MR を作る → CI の完了を待つ」という一連の流れをターミナルから一歩も出ずに行えるようになります。&lt;/p&gt;
&lt;p&gt;まずは &lt;code&gt;glab mr list&lt;/code&gt; から始めて、快適な GitLab ライフを送りましょう！&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;参考リンク:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/editor_extensions/gitlab_cli/" target="_blank" rel="noopener"
 &gt;GitLab CLI 公式ドキュメント&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gitlab.com/gitlab-org/cli" target="_blank" rel="noopener"
 &gt;GitHub リポジトリ (gitlab-org/cli)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>VSCode の Remote-Containers を起動したときに、マウントのパスに無効な文字が含まれているというエラーが表示された</title><link>https://blog.ponkotools.com/posts/2021/09/01/vscode/</link><pubDate>Wed, 01 Sep 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/09/01/vscode/</guid><description>&lt;p&gt;ホストのディレクトリをコンテナにマウントしたかったのですが、以下のようなエラーが表示されました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker: Error response from daemon: create /home/user/workspace: &amp;#34;/home/user/workspace&amp;#34; includes invalid characters for a local volume name, only &amp;#34;[a-zA-Z0-9][a-zA-Z0-9_.-]&amp;#34; are allowed. If you intended to pass a host directory, use absolute path.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;devcontainer.json&lt;/code&gt; の &lt;code&gt;mounts&lt;/code&gt; の設定は以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;mounts&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="s2"&gt;&amp;#34;source=${localWorkspaceFolder}/workspace,target=/workspace&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&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;type&lt;/code&gt; を省略してしまっていたのですが、&lt;code&gt;type&lt;/code&gt; のデフォルトは &lt;code&gt;volume&lt;/code&gt; なので、ボリュームをマウントしようとしてエラーになっていたみたいです。&lt;br&gt;
以下のように &lt;code&gt;type=bind&lt;/code&gt; を指定したら上手くいきました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;mounts&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="s2"&gt;&amp;#34;source=${localWorkspaceFolder}/workspace,target=/workspace,type=bind&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/microsoft/vscode-remote-release/issues/2573" target="_blank" rel="noopener"
 &gt;https://github.com/microsoft/vscode-remote-release/issues/2573&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://code.visualstudio.com/docs/remote/devcontainerjson-reference" target="_blank" rel="noopener"
 &gt;https://code.visualstudio.com/docs/remote/devcontainerjson-reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>VSCode + Remote-Containers で python の開発環境を作成する</title><link>https://blog.ponkotools.com/posts/2021/06/18/vscode/</link><pubDate>Fri, 18 Jun 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/06/18/vscode/</guid><description>&lt;p&gt;VSCode の Remote-Containers を使い、python 開発用の docker コンテナを作成し、そのコンテナ中で python のデバッグをできるようにします。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;li&gt;Visual Studio Code 1.56.2&lt;/li&gt;
&lt;li&gt;Remote Development 0.21.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらはインストールされている前提です。&lt;/p&gt;
&lt;h2 id="設定ファイルの作成"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;設定ファイルの作成
&lt;/h2&gt;&lt;p&gt;コマンドパレットを開いて(&lt;code&gt;Shift + Ctrl + p&lt;/code&gt;)、&lt;code&gt;Remote-Container: Add Development Container Configuration Files&lt;/code&gt; を実行します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Python3&lt;/code&gt; を選択し、続いて Python のバージョンを選択します。&lt;br&gt;
その後、Node.js をインストールするかどうか表示されますが、今回は必要ないのでチェックを外しました。&lt;/p&gt;
&lt;p&gt;OK を押すと、以下のファイルが作成されます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.devcontainer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── Dockerfile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── devcontainer.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="コンテナ起動"&gt;&lt;a href="#%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;コンテナ起動
&lt;/h2&gt;&lt;p&gt;画面左下のマークを押し、&lt;code&gt;Reopen in Container&lt;/code&gt; を選択するとコンテナが起動します。&lt;/p&gt;
&lt;div class="separator" style="clear: both;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioggZB1AZm4gmlWlTjfEs7wm9zOu3doCLKbA_2gRtv_QoJGqNZqRMNW0d_BopWrum1d_qJD1EMaTENBnVhoC2_jn-5MVrPm-N1wAfg61Z3is2FAOoRG0fVUnn2SgkV5df_ualWeD2dIB4/s0/5.png" style="display: block; padding: 1em 0; text-align: center; "&gt;&lt;img alt="" border="0" data-original-height="126" data-original-width="149" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioggZB1AZm4gmlWlTjfEs7wm9zOu3doCLKbA_2gRtv_QoJGqNZqRMNW0d_BopWrum1d_qJD1EMaTENBnVhoC2_jn-5MVrPm-N1wAfg61Z3is2FAOoRG0fVUnn2SgkV5df_ualWeD2dIB4/s0/5.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h2 id="拡張機能のインストール"&gt;&lt;a href="#%e6%8b%a1%e5%bc%b5%e6%a9%9f%e8%83%bd%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;拡張機能のインストール
&lt;/h2&gt;&lt;p&gt;Remote-Containers を使う場合、VSCode の拡張機能もコンテナ用に別途インストールする必要があるみたいです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;devcontainer.json&lt;/code&gt; の &lt;code&gt;extensions&lt;/code&gt; に記載しておけば、コンテナ作成時に自動的に拡張機能もインストールされるようです。&lt;br&gt;
今回は設定ファイル作成時に Python を選択したので、最初から下記の２つが記載されていました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;extensions&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;ms-python.python&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;ms-python.vscode-pylance&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;従って、コンテナを起動した時点で &lt;code&gt;python&lt;/code&gt; と &lt;code&gt;pylance&lt;/code&gt; は最初から入っているはずなのですが、何故か私の環境ではインストールされていません。&lt;/p&gt;
&lt;div class="separator" style="clear: both;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjStQ_qPqostcKQAlkbdceNMbMO-BZNhP0tJreUP2ogN30FZOpjdzVCcu4e2vdAyi_oAjtjM4o7UvYC-sP6SLxwmy5rlr3j3WMBRzV5YDH1IP6ZtDtbNnLRqCA0s5Jb46IaHdyFF7m2_ZE/s448/6.png" style="display: block; padding: 1em 0; text-align: center; "&gt;&lt;img alt="" border="0" height="320" data-original-height="448" data-original-width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjStQ_qPqostcKQAlkbdceNMbMO-BZNhP0tJreUP2ogN30FZOpjdzVCcu4e2vdAyi_oAjtjM4o7UvYC-sP6SLxwmy5rlr3j3WMBRzV5YDH1IP6ZtDtbNnLRqCA0s5Jb46IaHdyFF7m2_ZE/s320/6.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;仕方がないので、手動でインストールしました。&lt;/p&gt;
&lt;h3 id="手動でのインストール"&gt;&lt;a href="#%e6%89%8b%e5%8b%95%e3%81%a7%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;手動でのインストール
&lt;/h3&gt;&lt;p&gt;まず、&lt;code&gt;DEV CONTAINER&lt;/code&gt; のところの雲のアイコンをクリックします。&lt;/p&gt;
&lt;div class="separator" style="clear: both;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPaSkx77AmbCpshhGicXrKyLZ9A_bq461WvDwsNco4naOEuPc_qGgZoyUQ7r-SDlfI37oHdyR3X5OqdfpCGxEoFP1kUfJ7N-8vWt0meJjGzdl9qWNeGiucc0utOiOgXxs3PH0M3a-7RJ8/s0/7.png" style="display: block; padding: 1em 0; text-align: center; "&gt;&lt;img alt="" border="0" data-original-height="78" data-original-width="314" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPaSkx77AmbCpshhGicXrKyLZ9A_bq461WvDwsNco4naOEuPc_qGgZoyUQ7r-SDlfI37oHdyR3X5OqdfpCGxEoFP1kUfJ7N-8vWt0meJjGzdl9qWNeGiucc0utOiOgXxs3PH0M3a-7RJ8/s0/7.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;ローカルにインストールされている拡張機能一覧が表示されるので、コンテナ内にインストールしたい拡張機能にチェックを入れます。&lt;/p&gt;
&lt;div class="separator" style="clear: both;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLy5xEDkJtQf2QhyphenhyphenrIcM24qYggb9utZZoxCAALJmIt932CzZfEKeDfVBahFzr2G_Dm42P5oad2cgrPqT-p7CYFwhYJB0Bs17ECzvAzTkHllag54Ey4oPh75VbYvYtjYaqtF4RcH2qM94o/s605/8.png" style="display: block; padding: 1em 0; text-align: center; "&gt;&lt;img alt="" border="0" width="320" data-original-height="458" data-original-width="605" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLy5xEDkJtQf2QhyphenhyphenrIcM24qYggb9utZZoxCAALJmIt932CzZfEKeDfVBahFzr2G_Dm42P5oad2cgrPqT-p7CYFwhYJB0Bs17ECzvAzTkHllag54Ey4oPh75VbYvYtjYaqtF4RcH2qM94o/s320/8.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;インストールが完了した後は一度 VSCode を再起動したほうがよいかと思います。&lt;/p&gt;
&lt;h2 id="デバッグを開始する"&gt;&lt;a href="#%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e3%82%92%e9%96%8b%e5%a7%8b%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;デバッグを開始する
&lt;/h2&gt;&lt;p&gt;あとはローカル環境で python のデバッグを行う場合と同じです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2020/01/vscode-python.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2020/01/vscode-python.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/sabure500/items/a117b8a1733193be455f" target="_blank" rel="noopener"
 &gt;https://qiita.com/sabure500/items/a117b8a1733193be455f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/bigengelt/items/780440a146e6a3bdffd4" target="_blank" rel="noopener"
 &gt;https://qiita.com/bigengelt/items/780440a146e6a3bdffd4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>