🥑

Docker on Lima で ssh-agent forwarding

2022/04/29に公開

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段階のフォワーディングが必要になる。

  1. ホストの ssh-agent を Lima インスタンスにフォワードする
  2. ホストからフォワードした 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