Ssh-agentを使用してキーをDockerイメージに転送し、プライベートなgithubリポジトリからプルしたいと思います。
Yosemiteのboot2dockerで https://github.com/phusion/passenger-docker のわずかに変更されたバージョンを使用しています。
ssh-add -l
...key details
boot2docker up
それから私は多くの場所で見たコマンドを使用します(つまり https://Gist.github.com/d11wtq/8699521 ):
docker run --rm -t -i -v $SSH_AUTH_SOCK:/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent my_image /bin/bash
ただし、動作しないようです。
root@299212f6fee3:/# ssh-add -l
Could not open a connection to your authentication agent.
root@299212f6fee3:/# eval `ssh-agent -s`
Agent pid 19
root@299212f6fee3:/# ssh-add -l
The agent has no identities.
root@299212f6fee3:/# ssh [email protected]
Warning: Permanently added the RSA Host key for IP address '192.30.252.128' to the list of known hosts.
Permission denied (publickey).
ワンライナー:
Debian Jessieイメージを実行しているUbuntu 16で設定する方法は次のとおりです。
docker run --rm -it --name container_name \
-v $(dirname $SSH_AUTH_SOCK):$(dirname $SSH_AUTH_SOCK) \
-e SSH_AUTH_SOCK=$SSH_AUTH_SOCK my_image
https://techtip.tech.blog/2016/12/04/using-ssh-agent-forwarding-with-a-docker-container/
@wilwilsonの答えを拡張して、OSX boot2docker環境でエージェント転送をセットアップするスクリプトを作成しました。
https://Gist.github.com/rcoup/53e8dee9f5ea27a51855
#!/bin/bash
# Use a unique ssh socket name per-invocation of this script
SSH_SOCK=boot2docker.$$.ssh.socket
# ssh into boot2docker with agent forwarding
ssh -i ~/.ssh/id_boot2docker \
-o StrictHostKeyChecking=no \
-o IdentitiesOnly=yes \
-o UserKnownHostsFile=/dev/null \
-o LogLevel=quiet \
-p 2022 docker@localhost \
-A -M -S $SSH_SOCK -f -n \
tail -f /dev/null
# get the agent socket path from the boot2docker vm
B2D_AGENT_SOCK=$(ssh -S $SSH_SOCK docker@localhost echo \$SSH_AUTH_SOCK)
# mount the socket (from the boot2docker vm) onto the docker container
# and set the ssh agent environment variable so ssh tools pick it up
docker run \
-v $B2D_AGENT_SOCK:/ssh-agent \
-e "SSH_AUTH_SOCK=/ssh-agent" \
"$@"
# we're done; kill off the boot2docker ssh agent
ssh -S $SSH_SOCK -O exit docker@localhost
~/bin/docker-run-ssh
、chmod +x
それを使用し、docker-run-ssh
の代わりに docker run
。
私は同様の問題に遭遇し、コントロールソケットを使用してマスターモードでsshを使用し、次のようなスクリプトですべてをラップすることで、物事をかなりシームレスにすることができました。
#!/bin/sh
ssh -i ~/.vagrant.d/insecure_private_key -p 2222 -A -M -S ssh.socket -f [email protected] tail -f /dev/null
Host_SSH_AUTH_SOCK=$(ssh -S ssh.socket [email protected] env | grep "SSH_AUTH_SOCK" | cut -f 2 -d =)
docker run -v $Host_SSH_AUTH_SOCK:/ssh-agent \
-e "SSH_AUTH_SOCK=/ssh-agent" \
-t hello-world "$@"
ssh -S ssh.socket -O exit [email protected]
宇宙で最もかわいらしいことではありませんが、SSHセッションを手動で開いたままIMOを維持するよりもはるかに優れています。
キーを転送するためにssh-agentにアクセスする私にとって、OSX Mavericksとdocker 1.5では次のように動作しました:
boot2dockerにssh VM with boot2docker ssh -A
。認証エージェント接続の転送を有効にするオプション-Aを使用することを忘れないでください。
Boot2docker sshセッション内:
docker@boot2docker:~$ echo $SSH_AUTH_SOCK
/tmp/ssh-BRLb99Y69U/agent.7750
このセッションは開いたままにする必要があります。 SSH_AUTH_SOCK環境変数の値をメモします。
別のOS X端末で、次のように手順2のSSH_AUTH_SOCK値を指定してdocker runコマンドを発行します。
docker run --rm -t -i \
-v /tmp/ssh-BRLb99Y69U/agent.7750:/ssh-agent \
-e SSH_AUTH_SOCK=/ssh-agent my_image /bin/bash
root@600d0e9b443d:/# ssh-add -l
2048 6c:8e:82:08:74:33:78:61:f9:9a:74:1b:65:46:be:eb
/Users/dev/.ssh/id_rsa (RSA)
これを機能させるためにboot2docker sshセッションを開いたままにしておく必要があるという事実はあまり好きではありませんが、より良い解決策が見つかるまで、これは少なくとも私にとってはうまくいきました。
ソケット転送はまだOS Xでは動作しません。 boot2dockerの代わりにDocker for Macを使用して2019年に導入された@henrjk回答のバリエーションは次のとおりです。
まず、コンテナでsshサーバーを実行します。/tmpはエクスポート可能なボリューム上にあります。このような
docker run -v tmp:/tmp -v \
${HOME}/.ssh/id_rsa.pub:/root/.ssh/authorized_keys:ro \
-d -p 2222:22 arvindr226/Alpine-ssh
次に、エージェント転送でこのコンテナにsshします
ssh -A -p 2222 root@localhost
そのsshセッションの内部でssh-agentの現在のソケットを見つけます
3f53fa1f5452:~# echo $SSH_AUTH_SOCK
/tmp/ssh-9zjJcSa3DM/agent.7
これで、実際のコンテナーを実行できます。以下のSSH_AUTH_SOCKの値を、上記のステップで取得した値に置き換えてください
docker run -it -v tmp:/tmp \
-e SSH_AUTH_SOCK=/tmp/ssh-9zjJcSa3DM/agent.7 \
vladistan/ansible
認証エージェントへの接続を開けませんでした。
このエラー 発生時期$SSH_AUTH_SOCK
env varがホストで正しく設定されていないか、まったく設定されていません。試すことができるさまざまな回避策があります。しかし、私の提案は LinuxとmacOSのデュアルブート です。
追加のリソース:
バージョン2.2.0.0
、macOS用dockerを使用すると、コンテナー内のホストのSSHエージェントにアクセスできます。
これを実行させるコマンドの例を次に示します。
docker run --rm -it \
-v /run/Host-services/ssh-auth.sock:/ssh-agent \
-e SSH_AUTH_SOCK="/ssh-agent" \
my_image
特定のパスをマウントする必要があることに注意してください(/run/Host-services/ssh-auth.sock
)に含まれるパスの代わりに$SSH_AUTH_SOCK
環境変数。Linuxホストで行うのと同じです。