我在远程计算机上有一个正在运行的容器。我通过ssh连接到机器。现在我想从容器中下载某个文件。 有人可以给我一些如何实现的提示吗? 谢谢。
答案 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。这很不方便,但这是我们需要处理的事情,我们可以解决这些限制。
当您连接时,您需要以下信息,因此执行复制的任何命令都需要此信息:
ssh_host
:docker 主机名ssh_user
:docker 主机上的 SSH 用户sudo_password
:主机上的 root 密码container_name
:docker 容器名称file_dir
:包含远程主机上文件的目录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 将管道转发到 sudo
。 docker 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 -