Docker中的共享文件夹。在Windows上。不仅限于“C/user/”路径。

8

我是Docker的新手,之前使用过Vagrant。

我正在我的“D:/Works/something/DockerFirstTime”文件夹中使用Docker(1.9.1)。

现在我创建了一个机器,使用命令:

docker-machine create first

然后是简单的Dockerfile:

FROM ruby:2.2-onbuild

还有简单的Gemfile:

source 'https://rubygems.org'
gem 'rails'

现在我想使用一个共享文件夹,就像在Vagrant中一样,在我的Dockerfile的同一硬盘驱动器上使用这个命令:docker run -it -v //d/Works/something/DockerFirstTime:/usr/src/app -w /usr/src/app ruby:2.2 bundle install,但它不起作用。如何解决这个问题?我知道Docker只共享/c/User/folder,是这样吗?我该如何使用包含文件的文件夹,并使用Windows编辑器修改我的文件,然后像在单个PC上的普通shell或Vagrant中一样重新启动服务器?
2个回答

7
这个问题和this question有一个相似的根本问题,在boot2docker中挂载非C:/驱动器文件夹。我针对其他问题写了一个详细的答案,提供了与@VonC答案前半部分相同的信息。
来自Docker Docs

所有其他路径都来自于您的虚拟机文件系统。[...]在VirtualBox的情况下,您需要将主机文件夹作为共享文件夹在VirtualBox中可用。然后,您可以使用Docker -v标志进行挂载。

要获取容器中挂载的文件夹:

这会挂载整个D:\驱动器,您可以简单地更改文件路径以使其更具体。

与VBox共享目录:

只需执行一次即可。

在Windows CMD中:

VBoxManage sharedfolder add "boot2docker-vm" --name "d-share" --hostpath "D:\"

将共享目录挂载到您的虚拟机中:

每次重新启动虚拟机都需要执行此操作。

在 Boot2Docker VM 终端中执行以下操作:

mount -t vboxsf -o uid=1000,gid=50 d-share /d

要查看源代码并了解其工作原理,请参见我对其他类似问题的完整回答
此后,您可以在Docker中使用-v/--volume标志将此文件夹或任何子文件夹或文件挂载到容器中。如果您挂载了整个D:\驱动器,则可以使用您提问中的确切docker run命令,现在应该可以正常工作。如果您挂载了特定部分的驱动器,则必须更改路径以匹配。
在Windows中进行编辑,然后在Docker中运行:
此外,来自Docker Docs
挂载主机目录可用于测试。例如,您可以在容器内挂载源代码。然后,更改源代码并实时查看其对应用程序的影响。
作为VBox共享目录,您应该能够在Windows端进行更改,并在boot2docker vm中看到反映这些更改。
你可能需要重新启动容器才能看到实际的更改,这取决于容器内运行的程序(在你的情况下是Ruby)如何使用文件。例如,如果文件在容器启动时被编译成应用程序,则肯定需要重新启动容器才能看到更改。

注:

当在 Windows 中编写文件并在 Linux 中读取文件时,请注意 CR LF 与 LF 行尾符的区别。请确保您的文本编辑器以 Unix 行尾符保存文件,否则您可能会开始看到由 "^M" 添加到所有行末引起的错误。


那似乎比我的回答更详细。+1 - VonC

2
我知道Docker只共享/c/User文件夹,是这样吗?
是的,它可以做到这一点,因为VirtualBox VM用于提供Linux主机给docker,正在分享C:\Users。
要让docker看到另一个文件夹,您需要:

上述最后一种选择的问题在《介绍boot2docker》中有所描述(请滚动到“共享文件夹”部分)。

vboxsf 的主要问题是它不会进行任何缓存,因此当您尝试共享大量小文件(如大型 git 存储库)或任何需要频繁读取文件系统的内容(如 grunt)时,性能将成为一个问题。

到目前为止,我想出的最佳解决方案是使用带有启用了 NFS 支持的定制版 boot2docker 的 vagrant,这非常容易实现,无需任何“黑客”技巧。
对我来说,足够好的卖点就是使用 NFS 而不是 vboxsf 可以显著提高速度。

这是我一直在使用的项目:https://vagrantcloud.com/yungsang/boxes/boot2docker

卷共享中的魔法源于以下代码:

config.vm.synced_folder ".", "/vagrant", type: "nfs"

这会告诉 Vagrant 将您当前的目录通过 NFS 共享到 boot2docker VM 中的 /vagrant 目录中。

然而,该项目似乎非常古老,需要进行改进,以包括最新的 boot2docker.iso(docker 1.9.1)。


这个答案对我没有帮助。我听说过RSync,你知道些什么吗?我同时使用OSX和Windows。 - user4412054

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接