我在云端有我的本地docker机器和远程docker机器。我的docker-compose应用程序有一个带有此配置的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
重要的是第二卷。我有一个名为data的本地文件夹,其中包含大约10GB的数据。我首先把它作为一个卷,因为否则构建容器需要永远。现在该应用程序已投入生产,我想部署它。一个问题:现在我的远程web
容器中装有一个空的数据文件夹。那么如何将数据从本地计算机移动到远程docker机器上的容器中?我在哪里将移动到?
似乎有两种工具可供选择:
docker cp
似乎不适用于远程泊坞机docker-machine scp
似乎为此做了,对吗?我几乎肯定我需要使用其中的第二个,但由于我不太了解docker机器如何工作或它保存数据的位置,我不确定使用的目标路径:
$ 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这些数据,以便将其正确安装在我的远程web
容器上?
答案 0 :(得分:1)
假设您将远程使用本地使用的相同模型,请记住路径/usr/src/app/data
是内容容器的路径。当您将文件从一个系统复制到另一个系统时,您只需将它们从当前系统复制到远程系统,然后将它们放在docker-compose知道如何找到它们的路径中,以便安装到新容器中。
所以你要做的就是将它们从这里复制到那里,并使用相对于 docker-compose.yml
的相同路径。它只知道你的外部卷为./data
,所以如果你把目录放在同一个地方(从docker-compose的角度来看),一切都应该是一样的。
至于如何进行复制,这些只是文件,所以没关系。 scp -r
应该可以工作,或制作一个zip文件,复制它,解压缩到正确的位置等。有很多方法可以复制文件,所以选择最适合你的情况。
在评论中,您表达了对docker-machine中本地与远程操作的混淆,以及您需要复制的其他内容。这里有一个更充分的解释:
在您的本地系统上(我假设您自己的PC或笔记本电脑),您已安装了docker-machine,并且您已经将其用于所有这些开发。完全独立于您要部署的新云实例。
要在您的云实例上运行您已在本地拥有的内容,云实例将需要具备以下内容。
docker-compose.yml
文件。
只要你打算使用docker-compose来运行它,那就必须可用。
您的.env
文件。
由于您在此设置中使用环境文件,因此它必须可用或者docker-compose无法使用它。
您的web
图片。
此容器有build
参数,但不是image
参数。所以目前唯一能做的就是docker-compose build web
,它会在本地生成一个图像,然后docker-compose知道如何运行。
另一个选项是添加image
参数和repository:tag
,例如myuser/myapp_web:1.0
,并将其推送到Docker Hub。然后,在您的云实例上,可以从Docker Hub检索图像,而不是在本地构建它。
在这种情况下,您可以在docker-compose.yml中的image
容器中添加web
参数,然后构建并推送它。
docker-compose build web
docker-compose push web
然后在云实例上,您可以获取它:
docker-compose pull web
由于docker-compose.yml中的image
参数(也存在于云服务器上),docker-compose将知道使用该图像。
参考:Creating a new repository on Docker Hub
这些选项中的哪一个更可取决于您希望如何管理事物。任何一个都可以工作,但“本地构建”选项需要您将任何所需的源文件复制到您的云实例(构建过程中使用的任何内容)。
我在你的问题中没有看到postgres
容器的来源。如果你也是自定义构建这个,那么web
也是如此。如果您正在使用公共图像,那么您不需要复制任何内容; docker-compose将知道如何获取它,即你可以这样做:
docker-compose pull postgres
您在提问时提到了docker cp
和docker-machine scp
。
正如您已经确定的那样,docker cp
不是解决方案。该命令用于在容器和主机文件系统之间复制文件。它与通过网络进行复制无关。
据我所知,docker-machine scp
是在本地主机和docker-machine
托管的VM之间复制文件。要将文件复制到您的云实例,您可以更轻松地使用更通用的工具,如scp或sftp。
答案 1 :(得分:0)
不确定哪个docker版本,但与问题中的陈述和@Dan_Lowe答案相反,这很好用:
docker cp ./data container:/usr/src/app/
docker cp
是API的正常部分,因此它可以像任何其他命令一样工作,甚至可以远程执行。