概要
docker コンテナから scp などしたい場合、 private key をホストから持ってくる必要があります。
agent-forwarding で sock ファイルをマウントすれば完了、と思ったらそうでもなかったのでメモ。
docker内にprivate keyを持ち込むのは危険な行為です。自身の責任で実行してください。
前提
// docker-composeを使っていることを前提としていなかったので追記しました
- docker-composeを使用します。
使わなくてもできますが、最近もうdocker-composeにべったりなもんで・・・
Linuxの場合
ホストで agent-forward でログインするか、 ssh-agent が起動していればこれで sock ファイルがマウントされます。
services:
sshclient:
environment:
SSH_AUTH_SOCK: "/tmp/ssh-agent.sock"
volumes:
- "$SSH_AUTH_SOCK:/tmp/ssh-agent.sock"
macOS の場合
macOSだと sock ファイルをvolumesでマウントしても使えませんでした。
なので .ssh/id_rsa をマウントしてしまいます。
services:
sshclient:
volumes:
- "~/.ssh/id_rsa:/root/.ssh/id_rsa"
が、これだと id_rsa が存在するホストだと動きますが、
前述のlinuxのようにagent-forwardされた環境だと id_rsa が存在しないので、
マウントすると /root/.ssh/id_rsa/ というディレクトリが作成されてしまい、sshコマンドを実行するとエラーが発生します。
両方の環境で動くように
面倒ですがentrypointでid_rsaがあればコピーしてsshする動きにします。
services:
sshclient:
image: [sshコマンドのあるimage]
environment:
SSH_AUTH_SOCK: "/tmp/ssh-agent.sock"
volumes:
- "$SSH_AUTH_SOCK:/tmp/ssh-agent.sock"
- "~/.ssh/:/root/.ssh_dir/"
entrypoint: ["bash", "-l", "-c", "[ -f /root/.ssh_dir/id_rsa ] && mkdir -p /root/.ssh/ && cp -p /root/.ssh_dir/id_rsa /root/.ssh/id_rsa\nssh -A user@host" ]
あまりよろしくないですが、sshするケース自体がレアなので、とりあえずこれで暫定的に対処しました。