【发布时间】:2021-11-03 07:40:05
【问题描述】:
我在远程机器上有一个正在运行的容器。我通过 ssh 连接到机器。现在我想从容器中下载某个文件。 有人可以给我一些提示如何实现吗? 谢谢。 ????
【问题讨论】:
我在远程机器上有一个正在运行的容器。我通过 ssh 连接到机器。现在我想从容器中下载某个文件。 有人可以给我一些提示如何实现吗? 谢谢。 ????
【问题讨论】:
如果你想将文件从 docker 容器下载到本地机器,你可以使用 Docker 本身来完成(不需要 SSH):
docker cp <containerId>:/path/to/file /host/target/path
更新:我刚刚读到您已连接到远程容器。然后你可以使用 SCP:
scp user@host:/path/to/file /local/path
【讨论】:
听起来是 docker context 的一个很棒的应用程序。
docker context create myserver --docker "host=ssh://myserver.com"
docker --context myserver cp /local/path/file.txt containername:/path/in/container/
这也可以反过来,将文件从远程 docker 容器获取到本地文件系统。最好为您的远程服务器定义基于密钥的访问权限。
另一个解决方案是创建一个卷,临时启动一个 docker 容器,将这个卷导出到世界(ftp、smb、nfs,你可以命名它)。完成后,您可以将该卷挂载到目标容器并访问文件。这个也很明显,反过来也可以。
【讨论】:
假设当您连接到 docker 容器时,您必须首先使用公钥 SSH 到远程主机,sudo 使用密码登录 root,然后使用 docker exec 在容器中获取 shell。这很不方便,但这是我们得到的东西,我们可以解决这些限制。
当您连接时,您需要以下信息,因此执行复制的任何命令都需要此信息:
ssh_host: docker 主机名称ssh_user: docker 主机上的 SSH 用户sudo_password:主机上的root密码container_name: docker 容器名称file_dir: 包含远程主机上文件的目录file_name:要传输的文件名首先,让我们测试来自 localhost 的身份验证。以下命令应返回 docker 容器的主机名。
echo '<sudo_password>' | ssh '-oRequestTTY=no' <ssh_user>@<ssh_host> -- \
"sudo -p '' -S docker exec <container_name> hostname -f "
通过上述工作,下一个命令会将单个文件从 docker 容器传输到 localhost。我们将密码通过管道传输到 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 -
【讨论】: