Docker on Lima で ssh-agent forwarding
Docker コンテナ内でもホストの SSH 鍵を使いたいことがある。
例えば、Docker コンテナから Git のプライベートリポジトリにアクセスしたいような場合だ。
そんなときは、Docker コンテナに ssh-agent forwarding する。
Docker Desktop の場合
Docker Desktop で ssh-agent フォワーディングするには、
Docker コンテナ作成時に、ssh-agent のソケットを Docker コンテナにマウントし、
そのパスをDocker コンテナの環境変数 SSH_AUTH_SOCK
に設定すればよかった。
docker run --rm -it -v ${SSH_AUTH_SOCK}:/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent ubuntu bash
Docker on Lima の場合
Docker on Lima の場合、上記のコマンドではうまくいかない。
Docker on Lima で ssh-agent フォワーディングするには、
以下のように2段階のフォワーディングが必要になる。
- ホストの ssh-agent を Lima インスタンスにフォワードする
- ホストからフォワードした ssh-agent を Lima インスタンスから Docker コンテナにフォワードする
Step 1: Lima インスタンスにホストの ssh-agent をフォワードする
まず lima.yaml に以下の設定を追加し、
ssh:
# Forward ssh agent into the instance.
# Default: false
forwardAgent: true
インスタンスを再起動する。(以降、インスタンス名を docker
とする)
limactl stop docker
limactl start docker
再起動後、インスタンス内に環境変数 SSH_AUTH_SOCK
が設定されていることを確認する。
limactl shell docker printenv SSH_AUTH_SOCK
上記のコマンドを実行して /tmp/ssh-XXXXXXXXXX/agent.XXXX
のような出力が得られればOK。
Step 2: Docker コンテナにフォワードする
あとは、Docker Desktop のときのように、
Lima インスタンス上の ssh-agent のソケットを Docker コンテナにマウントし、
そのパスを Docker コンテナ内の環境変数 SSH_AUTH_SOCK
に設定すればよい。
docker run --rm -it -v $(limactl shell docker printenv SSH_AUTH_SOCK):/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent ubuntu bash
実行例
Lima の Docker コンテナから GitHub に SSH する例。
ssh-agent フォワーディングできているかどうかの確認に使える。
docker run --rm -it \
-v $(limactl shell docker printenv SSH_AUTH_SOCK):/ssh-agent \
-e SSH_AUTH_SOCK=/ssh-agent \
alpine:3.15 /bin/sh -c "apk update && apk add openssh && ssh -T git@github.com"
上記を実行して(途中で SSH 接続先確認プロンプトが出るので確認して yes と答え)、最後に以下のような出力が得られれば、ssh-agent フォワーディングに成功している。
Hi XXXXX! You've successfully authenticated, but GitHub does not provide shell access.
参考
SSH_AUTH_SOCK while building · Issue #683 · lima-vm/lima · GitHub
Discussion