从远程docker容器复制文件

时间:2018-05-07 15:07:18

标签: docker ssh

我在远程计算机上有一个正在运行的容器。我通过ssh连接到机器。现在我想从容器中下载某个文件。 有人可以给我一些如何实现的提示吗? 谢谢。

2 个答案:

答案 0 :(得分:3)

如果要将文件从docker容器下载到本地计算机,可以使用Docker本身(不需要SSH):

docker cp <containerId>:/path/to/file /host/target/path

更新:我刚看到您已连接到远程容器。然后你可以使用SCP:

scp user@host:/path/to/file /local/path

答案 1 :(得分:0)

假设当您连接到 docker 容器时,您必须首先使用公钥通过 SSH 连接到远程主机,使用 sudo 使用密码获得 root 用户,并使用 docker exec 获取容器中的 shell。这很不方便,但这是我们需要处理的事情,我们可以解决这些限制。

当您连接时,您需要以下信息,因此执行复制的任何命令都需要此信息:

  1. ssh_host:docker 主机名
  2. ssh_user:docker 主机上的 SSH 用户
  3. sudo_password:主机上的 root 密码
  4. container_name:docker 容器名称
  5. file_dir:包含远程主机上文件的目录
  6. file_name:要传输的文件名

首先,让我们测试来自本地主机的身份验证。以下命令应返回 docker 容器的主机名。

echo '<sudo_password>' | ssh '-oRequestTTY=no' <ssh_user>@<ssh_host> --  \
   "sudo -p '' -S docker exec <container_name> hostname -f "

通过上述工作,下一个命令会将单个文件从 docker 容器传输到本地主机。我们将密码通过管道传送到 SSH,SSH 将管道转发到 sudodocker exec 将启动 tar 来存档文件并打开一个到 SSH 的管道,该管道将管道转发到本地主机上的 tar

echo '<sudo_password>' | ssh '-oRequestTTY=no' <ssh_user>@<ssh_host> \
   "sudo -p '' -S -- docker exec <container_name> tar cf - -C <file_dir> <file_name>" \
   | tar xvf - 

这种方法的一个问题是 root 密码将显示在 docker 主机上的进程列表中。如果我们让 SSH 使用密码转发环境变量,我们就可以解决这个问题。

例如,我们可以根据 /etc/ssh/sshd_config 中的配置选择一个我们知道会被转发的环境变量,并在 ~/.ssh/config 中进行设置。

Host ssh_host
    SetEnv LC_IDENTIFICATION=<sudo_password>

然后我们可以修改之前的命令以使用新变量。

ssh '-oRequestTTY=no' <ssh_user>@<ssh_host> \
   "echo \$LC_IDENTIFICATION | sudo -p '' -S -- docker exec <container_name> tar cf - -C <file_dir> <file_name>" \
   | tar xvf -