如何将本地卷移动到远程docker机上

我有我的本地docker机和云端的远程docker机。 我的docker-compose应用程序有一个带有这个configuration的web容器:

 web: container_name: web restart: always build: ./web expose: - "8000" links: - postgres:postgres volumes: - /usr/src/app/static - ./data:/usr/src/app/data env_file: .env command: /usr/local/bin/gunicorn --workers 4 --timeout 120 --bind :8000 app:app 

重要的是第二卷。 我有这个名为数据的本地文件夹中有一些10GB的数据。 我首先把它做成了一个卷,因为否则build造这个容器是永远的。 现在,该应用程序是生产就绪,我想部署它。 一个问题:现在我的远程web容器中有一个空的数据文件夹。 那么如何将数据从本地机器移动到远程docker计算机上的容器? 我甚可以把它移到哪里?

似乎有两个工具:

  • docker cp似乎不会像远程docker机
  • docker-machine scp这似乎是为此,对不对?

我几乎是积极的,我需要使用其中的第二个,但是因为我不太了解docker机器是如何工作的或者它在哪里保存它的数据,我不知道要使用什么目标path:

  $ dm scp -r /Users/alex/Documents/Project/data remote-machine:/usr/src/app/data 

失败并显示错误消息:

scp: /usr/src/app/data: No such file or directory

我应该在哪里scp'ing这些数据,以便正确地安装在我的远程web容器上?

本地path与容器内path

假设您将使用本地使用的相同模型,请记住/usr/src/app/datapath是容器的path。 将文件从一个系统复制到另一个系统时,只需要将它们从当前系统复制到远程系统,然后将它们放到docker-compose知道如何find它们的path中,以装入新的容器。

所以你所要做的就是将它们从这里复制到那里,并使用相对于 docker-compose.yml的相同path。 它只知道你的外部卷为./data ,所以如果你把目录放在同一个地方(从docker-compose的angular度来看),一切都应该是一样的。

如何复制文件

至于如何做副本,这些只是文件,所以没关系。 scp -r应该工作,或者创build一个zip文件,将其复制,解压到正确的位置等等。复制文件有很多种方法,所以select最简单的方法。

究竟需要复制什么?

在您的评论中,您对docker机器中的本地操作和远程操作表示困惑,以及您需要复制哪些内容。 这里有一个更充分的解释:

在你的本地系统上(我假设你是自己的PC或者笔记本电脑),你已经安装了docker-machine,并且你已经使用它来完成所有这些开发。 完全独立于您想要部署的新云实例。

要在本地运行已有的云实例,云实例将需要具有以下内容。

  1. docker-compose.yml文件。

    只要你打算使用docker-compose来运行这个,那必须是可用的。

  2. 您的.env文件。

    由于您在此设置中使用的是环境文件,因此它必须可用或者docker-compose无法使用它。

  3. 您的web图片。

    你有这个容器的生成参数,但不是一个image参数。 所以目前你唯一能做的事情就是docker-compose build web一个docker-compose build web ,它将在本地生成一个图像,然后docker-compose就会知道如何运行。

    另一个select是添加一个image参数,并使用repository:tag (如myuser/myapp_web:1.0 ,然后将其推送到Docker Hub。 然后,在您的云实例上,可以从Docker Hub中检索图像,而不是在本地构build它。

    在这种情况下,您可以在docker-compose.yml的web容器中添加一个image参数,然后构build它并将其推送。

     docker-compose build web docker-compose push web 

    然后在云实例上,您可以获取它:

     docker-compose pull web 

    由于docker-compose.yml(也存在于云服务器上)中的image参数,docker-compose将知道使用该图像。

    参考: 在Docker Hub上创build一个新的存储库

    哪一个选项更好取决于你想如何pipe理事情。 任何一个都可以工作,但“本地构build”选项会要求您将任何必需的源文件也复制到您的云实例(在构build过程中使用的任何内容)。

  4. 我没有看到你的问题postgres容器来自哪里。 如果你也是定制这一个,那么networking也是一样的。 如果你正在使用公开的图像,那么你不需要复制任何东西; docker-compose将知道如何获取它,即你可以这样做:

     docker-compose pull postgres 

docker cp和docker-machine scp呢?

你提到docker cpdocker-machine scp在你的问题中。

正如你已经确定, docker cp不是一个解决scheme在这里。 该命令用于在容器和主机文件系统之间复制文件。 它与通过networking进行复制无关。

据我所知, docker-machine scp是在本地主机和docker-machine managed虚拟docker-machine之间复制文件。 要将文件复制到您的云实例,您可能更容易使用更通用的工具,如scp或sftp。

不知道作为哪个docker版本,但与问题中的声明和@Dan_Lowe答案相反这工作正常:

 docker cp ./data container:/usr/src/app/ 

docker cp是API的一个正常部分,所以它可以像任何其他命令一样工作,甚至是远程的。