【问题标题】:Copy file from remote docker container从远程 docker 容器复制文件
【发布时间】:2021-11-03 07:40:05
【问题描述】:

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

【问题讨论】:

    标签: docker ssh


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我认为这不是问题的正确答案。第一个命令只是将文件从容器复制到远程计算机,第二个命令将文件从远程计算机复制到本地。问题是关于如何将文件从远程容器复制到本地机器。
    【解决方案2】:

    听起来是 docker context 的一个很棒的应用程序。

    • 创建上下文:docker context create myserver --docker "host=ssh://myserver.com"
    • copy files as usual: docker --context myserver cp /local/path/file.txt containername:/path/in/container/

    这也可以反过来,将文件从远程 docker 容器获取到本地文件系统。最好为您的远程服务器定义基于密钥的访问权限。

    另一个解决方案是创建一个卷,临时启动一个 docker 容器,将这个卷导出到世界(ftp、smb、nfs,你可以命名它)。完成后,您可以将该卷挂载到目标容器并访问文件。这个也很明显,反过来也可以。

    【讨论】:

      【解决方案3】:

      假设当您连接到 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:要传输的文件名

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

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

      通过上述工作,下一个命令会将单个文件从 docker 容器传输到 localhost。我们将密码通过管道传输到 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 -
      

      【讨论】:

        猜你喜欢
        • 2023-01-19
        • 1970-01-01
        • 2019-10-07
        • 2014-03-29
        • 2021-07-14
        • 2015-07-08
        • 1970-01-01
        相关资源
        最近更新 更多