LoginSignup
7

More than 3 years have passed since last update.

posted at

updated at

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

概要

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

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
7