VSCode Remote ContainersでGitにSSH接続でpushする

VSCode Remote ContainersでGitにSSH接続でpushする

VSCode Remote Containers拡張機能を使うとdockerのコンテナに接続できます。

開発環境として使用する場合、GitにSSH接続する必要があります。
しかし、コンテナ内に開発者依存のSSHの秘密鍵を置くわけにはいきませんし、セキュリティ上危険なので.sshディレクトリをマウントしたりしてはいけません。

Remote Containers拡張機能に、コンテナ接続元の端末のSSHキー情報を転送する機能が備わっているので設定しましょう。

まずはdockerコンテナにGitをインストール

コンテナ内でgitコマンドを叩いてみて、git入ってないよ!って言われる場合は、まずはgitをインストールしましょう。
開発時に使用するだけなので、devcontainer.jsonにインストールコマンドを記述して、Remote Containerを使ってコンテナを起動したときだけ入るようにします。

devcontainer.jsonがない場合

Remote Containers拡張機能でコンテナに接続すると、ルートディレクトリに.devcontainerという名前でディレクトリが作成され、中にdevcontainer.jsonファイルが作成されます。

作成されなかったりする場合はVSCodeのコマンド実行(Ctrl+Shift+p)から手動で追加することも出来ます。

Remote-Containers: Add Development Container Configuration Files...

Gitインストール

postCreateCommandに記述したコマンドは、コンテナ作成後に自動で実行されます。
コマンドはコンテナに入っているパッケージマネージャーのコマンドに置き換えて下さい。

// Uncomment the next line to run commands after the container is created - for example installing git.
"postCreateCommand": "apt update && apt install -y git",

リモートリポジトリへSSH接続

SSH接続でgit pushやgit pullをするには、SSHキーが必要です。
SSHキーの作成・登録方法はここでは省略します。

参考
Visual Studio Code – Remote Development Tips and Tricks SSH Tips
https://code.visualstudio.com/docs/remote/troubleshooting#_ssh-tips

一般的にSSHキーはユーザーディレクトリ直下の.sshディレクトリに保存されています。
以下の場所にキーが存在していることを確認します。

[Windows]
%HOMEPATH%\.ssh

[Mac, Linux]
~/.ssh

ssh-agentを有効にする

ssh-agentを有効にしてSSHキーを追加すると、接続時にコンテナ内に自動でSSHキーが転送されます。

Windowsで設定する

PowerShellを管理者権限で起動して、ssh-agentを自動起動するように設定します。

Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
Get-Service ssh-agent

使用するSSHキーをPowerShellから追加します。
ディレクトリやキーの文字列は変更している場合は置き換えてください。

ssh-add $HOME/.ssh/id_rsa

WSL2でssh-agentで設定する

ディスク問題でdockerのパフォーマンスが落ちないようにWSL2上にファイルを置いて開発している場合は、WSL2のユーザールートの.sshディレクトリにキーを置いてlinuxのssh-agentを起動する必要があります。

ユーザールートに.bash_profileを作成して、bash実行時にssh-agentを自動的に起動します。
最終行でssh-agentにキーを追加しており、キー名が異なる場合は変更して下さい。

if [ -z "$SSH_AUTH_SOCK" ]; then
   # Check for a currently running instance of the agent
   RUNNING_AGENT="`ps -ax | grep 'ssh-agent -s' | grep -v grep | wc -l | tr -d '[:space:]'`"
   if [ "$RUNNING_AGENT" = "0" ]; then
        # Launch a new instance of the agent
        ssh-agent -s &> $HOME/.ssh/ssh-agent
   fi
   eval `cat $HOME/.ssh/ssh-agent`
fi

ssh-add $HOME/.ssh/id_rsa

WSL2ではキーが転送されないとissueが挙がっており、これだけでは上手く行かない場合は以下のアプリケーションを追加します。

参考

DevContainer: SSH und GPG agent forwarding for WSL2
https://github.com/microsoft/vscode-remote-release/issues/2925

sudo apt update && apt install openssh-client && apt install socat

動作確認

VSCodeコマンド Remote-Containers: Rebuild and Reopen in Containerからコンテナにリモート接続します。
SSH接続が必要なGitリポジトリに対してgit fetchを実行してみて、エラーが表示されずに正常に実行できるか確認しましょう。

参考

Visual Studio Code – Developing inside a Container
https://code.visualstudio.com/docs/remote/containers

プログラミングカテゴリの最新記事