LoginSignup
13
7

More than 5 years have passed since last update.

Dockerコンテナでsshする時の鍵をホストから持ってくる

Last updated at Posted at 2018-08-07

概要

docker コンテナから scp などしたい場合、 private key をホストから持ってくる必要があります。
agent-forwarding で sock ファイルをマウントすれば完了、と思ったらそうでもなかったのでメモ。

docker内にprivate keyを持ち込むのは危険な行為です。自身の責任で実行してください。

前提

// docker-composeを使っていることを前提としていなかったので追記しました

  • docker-composeを使用します。
    使わなくてもできますが、最近もうdocker-composeにべったりなもんで・・・

Linuxの場合

ホストで agent-forward でログインするか、 ssh-agent が起動していればこれで sock ファイルがマウントされます。

docker-compose.yml
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 をマウントしてしまいます。

docker-compose.yml
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する動きにします。

docker-compose.yml
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するケース自体がレアなので、とりあえずこれで暫定的に対処しました。

13
7
0

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
  3. You can use dark theme
What you can do with signing up
13
7