将文件从本地主机复制到远程服务器上的Docker容器

ha5z0ras  于 2023-01-20  发布在  Docker
关注(0)|答案(3)|浏览(212)

我的笔记本电脑(localhost)上有一个大文件。我想将此文件复制到位于远程服务器上的Docker容器中。我知道如何分两步完成此操作,即首先将文件复制到远程服务器,然后将文件从远程服务器复制到Docker容器中。但是,出于明显的原因,我希望避免这种情况。
一个类似的问题,其中有一个复杂的答案是涵盖在这里:Copy file from remote docker container
但是在这个问题中,方向相反,文件从远程容器复制到本地主机。
其他要求:有没有可能这个上传可以分段完成,或者在网络故障的情况下,我可以从它停止的地方恢复上传,而不必再次上传整个文件?我问,因为文件是相当大,~ 13 GB.

kyxcudwk

kyxcudwk1#

在https://docs.docker.com/engine/reference/commandline/cp/#corner-cases和https://www.cyberciti.biz/faq/howto-use-tar-command-through-network-over-ssh-session/中,您只需执行以下操作:

tar Ccf $(dirname SRC_PATH) - $(basename SRC_PATH) | ssh you@host docker exec -i CONTAINER tar Cxf DEST_PATH -

tar Ccf $(dirname SRC_PATH) - $(basename SRC_PATH) | ssh you@host docker cp - CONTAINER:DEST_PATH

或者未经测试,不知道这是否可行:

DOCKER_HOST=ssh://you@host docker cp SRC_PATH CONTAINER:DEST_PATH
j9per5c4

j9per5c42#

如果您运行的是 *nix服务器和带有ssh服务器的Docker,这将有效。
您可以按照以下步骤在远程服务器上创建本地通道:

mkfifo host_to_docker
netcat -lkp your_public_port < host_to_docker | nc docker_ip_address 22 > host_to_docker &

第一个命令将创建一个可以使用file host_to_docker检查的管道。
第二个是netcat,它接受一个tcp连接并将其转发给另一个netcat示例,接收底层ssh消息并将其转发给运行在docker上的ssh服务器,然后将其响应写入我们创建的管道。
最后一步是:

scp -P your_public_port payload.tar.gz user@remote_host:/dest/folder
iszxjhcz

iszxjhcz3#

您可以使用DOCKER_HOST环境变量和rsync来存档您的目标。
首先,设置DOCKER_HOST,这将使Docker客户机(即docker CLI实用程序)通过SSH连接到远程服务器的Docker守护进程,这可能需要为目标服务器创建一个ssh-config条目。

export DOCKER_HOST="ssh://<your-host-name>"

接下来,您可以结合使用docker execrsync将数据复制到目标容器中,这需要您通过docker ps等获取容器ID,注意,rsync必须安装在容器中。

# 
rsync -ar -e 'docker exec -i' <local-source-path> <container-id>:/<destintaion-in-the-container>

由于使用了rsync,这还允许您在以后的某个时间点恢复(如果使用了适当的标志)上载。

相关问题