デプロイなどでDocker内からsshする場合(capistrano等)にホスト側のssh-agent転送する方法です。
LinuxやWSL2等の場合
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
参考
-
ファイルシステム共有 [osxfs] — Docker-docs-ja 19.03 ドキュメント
https://docs.docker.jp/docker-for-mac/osxfs.html#ssh-ssh-agent-forwarding -
Dockerコンテナでsshする時の鍵をホストから持ってくる - Qiita
https://qiita.com/uwork/items/849f1035a765adb9c3af#linux%E3%81%AE%E5%A0%B4%E5%90%88
以前までは鍵ファイルをコピーするなどの案も
LinuxとMac混在のクロスプラットフォーム対応
.envファイルでsockファイルを自分用の環境に書き換えるようにして吸収しました。
無理くりです。。macが標準のSSH_AUTH_SOCKでできるようになれば簡単に解決なんですが。。
※docker-compose自体が.envファイルに対応しているので別途ミドルウェア不要です。
services:
web:
volumes:
- "$SSH_AUTH_SOCK_APP:/tmp/ssh-agent.sock"
environment:
SSH_AUTH_SOCK: "/tmp/ssh-agent.sock"
# 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で定義したものよりシェルの値のほうが優先されるという仕様があったためです。
- Compose における環境変数 | Docker ドキュメント
https://matsuand.github.io/docs.docker.jp.onthefly/compose/environment-variables/#the-env-file
シェル内にて設定される値は、.envファイル内のものよりも優先されます。
docker-compose.ymlでif文使えたらいいんですが無さそうでした。
Rancherというのを入れればできるそうですがよほどデファクトでない限りは入れたくはないので。
- Rancherでdocker-compose.ymlの条件分岐を試す - Yassan's Memo
https://yassan.hatenablog.jp/entry/advent-calendar-rancher-1213