Windowsで起動しているDev Container内からGitのリモートリポジトリに操作を行うと Permission denied が発生する場合の対処方法
事象
解決策
- ホストのssh-agentのバージョンを上げる
winget install Microsoft.OpenSSH.Beta
- 記事執筆時にはBetaしかなかったが
winget search openssh
で正式版が出ているか確認すること
- Dev Containerのドキュメントにも注意書きがある
詳細の前置き
- Dev Containerはただのコンテナなので特に指定をしないとSSH接続の際に使用される秘密鍵は共有されない
- 共有されないということはGitHub等のリモートリポジトリを対象としたpull、pushなどもできない
- 開発時に使用されることを目的としているDev Containerとしては著しく体験が悪いのでssh-agentを使用して秘密鍵をDev Containerと共有する
- Windowsの管理者権限が必要なので注意
- 詳細: Visual Studio Code Remote Development Troubleshooting Tips and Tricks
- 管理者権限をもらえない環境の場合は
.ssh
をマウントすれば可能- ※当然鍵がそのままコンテナに入るのでセキュリティ的には注意が必要
- 参考: [add] mount .ssh folder by yamap55 · Pull Request #12 · yamazaki-seiya/nobiru_kun · GitHub
詳細とか詳細な手順とか
事象が発生することを確認
- DevConatainer内で
git pull
を行うことで発生 - privateリポジトリなのでpullで発生している
- publicリポジトリだとpushで発生するはず(自分のリポジトリでも発生する)
ちなみに python:3.11.4
のコンテナで発生した。( Docker Hub )
ssh-agentのバージョンを確認
- ssh-agentはsshについてくるものらしいので、sshのバージョンを確認
ssh -V
- ホストのWindows側(
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3
)- バージョン8.8以下
- Dev Container(
OpenSSH_9.2p1 Debian-2, OpenSSL 3.0.9 30 May 2023
)- バージョン8.9以上
- ホスト(Windows)でopensshの最新バージョンを調査
winget search openssh
- ホスト(Windows)にopensshをインストール
winget install Microsoft.OpenSSH.Beta
- wingetが動作しない場合には直接GitHubから取得してインストール
- sshのバージョンを確認
- ※私の環境だとインストールを行ったターミナルではだめだったので、別のターミナルを立ち上げて確認
- Dev Container内に秘密鍵が共有されていること、エラーが発生しないことを確認
参考
memo
- Gitコマンドではなく、
ssh-add -l
とかの結果を記載する方が本質的だったなと思った