Docker中的共享文件夹。 用Windows。 不仅是“C / user /”path

我是Docker的新手,我来自stream浪汉。

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

现在我创build机器

docker-machine create first

和简单的Dockerfile

FROM ruby:2.2-onbuild

和简单的Gemfile

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

现在用这个命令我想在Dockerfile的同一个硬盘里使用像Vagrant这样的共享文件夹:

docker run -it -v //d/Works/something/DockerFirstTime:/usr/src/app -w /usr/src/app ruby:2.2 bundle install

但它不起作用。

这个怎么做?

我知道Docker只共享/ c / User /文件夹 ,对吗?

我怎样才能使用该文件夹的文件,并修改我的文件在Windows中的编辑器,然后重新启动服务器,如在一台PC上的普通shell或像stream浪汉?

这个问题和这个问题有一个类似的根本问题,在boot2docker中挂载一个非C:/ drive文件夹。 我写了一个深入的答案,提供了与VonC答案上半部分相同的信息。

从Docker文档 :

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

要让您的文件夹安装在容器中:

这将挂载整个D:\驱动器,您可以简单地将文件path更改为更精细和更具体。

与VBox共享目录:

这只需要做一次。

在Windows CMD中:

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

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

这将需要在每次重新启动虚拟机时完成。

在Boot2Docker VMterminal中:

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

要查看如何工作的来源和解释,请查看我对其他类似问题的完整答案

之后,您可以使用Docker中的-v / --volume标志将此文件夹或任何子文件夹或文件装载到容器中。 如果你挂载你的整个D:\驱动器,你可以使用你的问题,确切的docker运行命令,现在应该工作。 如果您安装了特定的驱动器部分,则必须更改匹配的path。

要在Windows中编辑,请在docker中运行:

另外从Docker Docs :

挂载主机目录对于testing是有用的。 例如,您可以在容器中安装源代码。 然后,更改源代码并实时查看其对应用程序的影响。

作为一个VBox共享目录,你应该能够看到Boot2docker虚拟机中反映的Windows端的变化。

您可能需要重新启动容器才能看到实际显示的更改,这取决于容器内运行的程序(在您的情况下为ruby)如何使用这些文件。 例如,如果在容器启动时将文件编译到应用程序中,您肯定需要重新启动容器以查看更改。

注意:

当在Windows中编写文件并在Linux中读取它们时,请注意CR LF与LF行的结尾差异。 确保你的文本编辑器是用Unix行结束符保存文件,否则你可能会看到在所有行尾加上'^ M'引起的错误。

我知道Docker只共享/ c / User /文件夹,对吗?

它可以,因为用于为docker提供Linux主机的VirtualBox VM共享C:\ Users。

docker工看到另一个文件夹,你需要:

  • 使用VBoxmanage sharedfolder add "VM name" --name "sharename" --hostpath "D:\Works"
  • 然后挂载/D/Works在VM会话中工作,正如在“ 使用 docker 容器(使用 docker windows client)的共享窗口文件夹(c / Users /除外) ”中提到的 ,并在boot2docker中提到 :

     mount -t vboxsf -o uid=1000,gid=50 sharename /some/mount/location 

最后一个备选scheme的问题在“ boot2docker简介 ”(向下滚动到“共享文件夹”部分)

vboxsf的主要问题是,它不会做任何cachingtypes的caching,所以当你试图共享大量的小文件(大的git回购)或任何文件系统读取重(grunt)的性能成为一个因素。

到目前为止我所提出的最好的解决scheme是使用vagrant与定制版本的boot2docker启用NFS支持,这是非常less的“黑客”得到工作,这是很好的。
对我来说,一个足够好的卖点是通过使用NFS而不是vboxsf来提高速度,实际上这是相当惊人的。

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

分享中的魔力就在这一行。

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

它告诉Vagrant使用NFS将你当前的目录分享到/ vagrant目录下的boot2docker虚拟机。

但是,这个项目看起来很老,需要进行修改才能包含最新的boot2docker.isoboot2docker.iso 1.9.1)。