はじめに
Dev ContainerでLaTeXの環境構築をしたはいいものの、自分のプライベートリポジトリをSSHを使ってクローンしようとしたら、うまくいきませんでした。どうやら、コンテナ内でSSH接続するには一工夫必要なようで、今回はそれをやってみました。
前提
- VS Codeがインストールされている
- WSL2がインストールされている
- Dockerがインストールされている
筆者の環境
- Windows11
- WSL2のディストリビューション:ubuntu-22.04
- Docker Desktop
1. WSLでSSH接続する
SSHキーの生成
WSLを開いて、ターミナルで、
cd ~/.ssh
と打ち、.sshフォルダに移動します。なければ作ってください。
次に、
ssh-keygen -t rsa
と打ちます。何か聞かれるので、3回エンターを押せば大丈夫です。
これで、.sshフォルダにid_rsaファイルとid_rsa.pubファイルが生成されます。このうち、id_rsaは秘密鍵が書かれているので、他人に見せないようにしましょう。
GitHubへの登録
次に、id_rsaに書かれている公開鍵をGitHubにアップします。https://github.com/settings/ssh に移動して、New SSH keyを押します。

Titleには、好きなSSHキーの名前を入力します。どのデバイスで使っているキーなのかを判別するために、わかりやすい名前を推奨します。
Keyには、id_rsa_pubに書かれている公開鍵をコピーして貼り付けます。

入力が終わったらAdd SSH keyを押します。
接続の確認
WSLで
ssh -T git@github.com
と打ち、
Hi (account名)! You've successfully authenticated, but GitHub does not provide shell access.
と返ってきたら接続は成功しています。
2. Dev ContainerでSSH接続する
devcontainer.jsonの記述
ワークスペースのdevcontainer.jsonを以下を記述します。
{
"name": "texlive",
"image": "texlive/texlive:latest",
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {},
"ghcr.io/devcontainers/features/git:1": {}
},
"mounts": [
{
"target": "${containerWorkspaceFolder}/build",
"type": "volume"
},
"source=${localEnv:SSH_AUTH_SOCK},target=${localEnv:SSH_AUTH_SOCK},type=bind"
],
"remoteEnv": {
"SSH_AUTH_SOCK": "${localEnv:SSH_AUTH_SOCK}"
},
"customizations": {
"vscode": {
"extensions": [
"James-Yu.latex-workshop"
]
}
}
}
ここでは、SSH接続に関係するものだけ説明します。
-
"mounts"で、ホストのディレクトリやファイルをコンテナにマウントする設定を記述します。ホストOS側のSSH Agentソケットをコンテナ内にマウントすることで、コンテナ内からホストOS側のSSH鍵を利用できるようにしています。 -
"remoteEnv"で、コンテナ内の環境変数を設定します。SSH_AUTH_SOCKに、ホスト側のSSH Agentソケットのパスを設定します。
.bashrcの設定
.bashrcに以下を記述します。
if [ -z "$SSH_AUTH_SOCK" ]; then
SSH_AGENT_ENV="$HOME/.ssh/ssh-agent"
if [ ! -f "$SSH_AGENT_ENV" ]; then
mkdir -p "$HOME/.ssh"
ssh-agent -s > "$SSH_AGENT_ENV"
fi
if [ -f "$SSH_AGENT_ENV" ]; then
eval "$(cat "$SSH_AGENT_ENV")" > /dev/null
fi
if [ -z "$SSH_AUTH_SOCK" ] || [ ! -S "$SSH_AUTH_SOCK" ]; then
mkdir -p "$HOME/.ssh"
ssh-agent -s > "$SSH_AGENT_ENV"
eval "$(cat "$SSH_AGENT_ENV")" > /dev/null
fi
ssh-add ~/.ssh/id_rsa 2>/dev/null
fi
これを書くことで、シェルを起動したときに自動的にSSH Agentが起動し、秘密鍵を登録してくれます。
コンテナの起動
左下の><を押して、「Reopen in Container」(日本語なら「コンテナーで再度開く」)を選択します。

コンテナが起動したら、ポップアップで「コンテナー構成ファイルが変更されました。変更を反映するには再構築する必要があります。」と出ると思うので、左下の><を押して、「Rebuild Container」(日本語なら「コンテナーのリビルド」)を選択します。

接続の確認
リビルドが完了したら、Dev Container上でSSH接続が使えるようになっているはずです。試しにターミナルで、
ssh -T git@github.com
を実行してみましょう。WSLの場合と同様の返事が返ってきたら成功です。
3. おわりに
私の知識不足や調べ不足かもしれませんが、Dev Container上でSSH接続するのにかなり苦労しました。同じ内容で困っている人がいたら、少しでも解決の手助けになればと思います。
参考