LoginSignup
4

More than 1 year has passed since last update.

posted at

updated at

Dockerコンテナ内からホストのsshエージェント転送する場合

デプロイなどでDocker内からsshする場合(capistrano等)にホスト側のssh-agent転送する方法です。

LinuxやWSL2等の場合

docker-compose.yml
services:
  web:
    volumes:
      - "$SSH_AUTH_SOCK:/tmp/ssh-agent.sock"
    environment:
      SSH_AUTH_SOCK: "/tmp/ssh-agent.sock"

ホスト側のssh-agentのsockファイルの$SSH_AUTH_SOCKを中継すればいい形でシンプルです。

Docker Desktop for Macの場合

services:
  web:
    volumes:
      - "/run/host-services/ssh-auth.sock:/tmp/ssh-agent.sock"
    environment:
      SSH_AUTH_SOCK: "/tmp/ssh-agent.sock"

何故か標準の$SSH_AUTH_SOCKでは動かなく別のsockファイルの/run/host-services/ssh-auth.sockだと動くようです。

この仕組み自体が下記githubのissue見ると2020年にようやく解決したみたいで4年かかったようで。。
$SSH_AUTH_SOCK is not being forwarded to docker · Issue #410 · docker/for-mac
https://github.com/docker/for-mac/issues/410

参考

LinuxとMac混在のクロスプラットフォーム対応

.envファイルでsockファイルを自分用の環境に書き換えるようにして吸収しました。
無理くりです。。macが標準のSSH_AUTH_SOCKでできるようになれば簡単に解決なんですが。。

※docker-compose自体が.envファイルに対応しているので別途ミドルウェア不要です。

docker-compose.yml
services:
  web:
    volumes:
      - "$SSH_AUTH_SOCK_APP:/tmp/ssh-agent.sock"
    environment:
      SSH_AUTH_SOCK: "/tmp/ssh-agent.sock"
.env
# mac以外の場合は下記を利用する  (WSL2など)
SSH_AUTH_SOCK_APP=${SSH_AUTH_SOCK}
# macの場合は下記を利用する  (macだと$SSH_AUTH_SOCKのデフォルトだと動かなかった)
#SSH_AUTH_SOCK_APP=/run/host-services/ssh-auth.sock

ちなみにわざわざSSH_AUTH_SOCKではなくSSH_AUTH_SOCK_APPと別名をつけているのは.envで定義したものよりシェルの値のほうが優先されるという仕様があったためです。

シェル内にて設定される値は、.envファイル内のものよりも優先されます。

docker-compose.ymlでif文使えたらいいんですが無さそうでした。
Rancherというのを入れればできるそうですがよほどデファクトでない限りは入れたくはないので。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4