👩‍💻

DevContainer を開くと Git が使えない問題

に公開

はじめに

Laravel Sail + VSCode DevContainer + WSL2 の環境構築後、
VSCode を DevContainer モードで開くと Git コマンドが使えない問題が発生しました。

通常は一度 「Reopen in WSL」 して Git 操作を行いますが、毎回切り替えるのは手間なので、
DevContainer 内でも Git / VSCode の Source Control を使えるようにする
ことを目的として設定を整理しました。

症状

  • VSCode 左下が「Dev Container: ...」の状態でターミナルを開くとgitのコマンドが使えない
  • WSL ターミナルに切り替えられない
root@XXXXX:/var/www/html# fatal: not a git repository (or any of the parent directories):

原因

  1. DevContainer では コンテナ内の Linux が動いているだけ
    → WSL の Gitの認証設定を参照しない
  2. DevContainer のパス設定でbind mount が正しく設定されていない
    →WSLのフォルダ と一致していない

解決

1. devcontainer.jsonに以下を記載する

  "workspaceFolder": "/var/www/html",
  "mounts": [
    "source=${localWorkspaceFolder},target=/var/www/html,type=bind"
  ],
設定値 意味
workspaceFolder VSCode がコンテナ内で開く作業ディレクトリを指定(※Laravel Sailでは/var/www/html)
mounts ホストのフォルダとコンテナのフォルダを同期(マウント)する設定
source=${localWorkspaceFolder} ホスト側(WSL)のディレクトリ
target=/var/www/html コンテナ側(DevContainer)の作業ディレクトリ
type=bind マウントの設定

※WSL → DevContainer へのマウントをしている

2. 「Rebuild Container」ボタンを押下しコンテナを再作成する

3. DevContainerでgitのコマンドが使用できること、Source Controlからコミットできることを確認

おわりに

DevContainer は「新しい Linux を Docker 上に作る」仕組みなので、そのままだと WSL の Git やファイルを認識しません。
今回の mounts 設定を入れておくことで、

  • Git 操作を DevContainer 内に統一できる
  • WSL とコンテナの「二重管理」が解消される
  • Laravel Sail と DevContainer を併用しやすくなる

というメリットが得られます。

参考URL

https://blog.lycheejam.net/posts/devcontainer-settings-tips/

Discussion