在Docker中通过Vagrant共享卷

我有一个承载Docker容器的Vagrant虚拟机。 主机有一个需要在虚拟机和容器中可访问的文件夹:

Host: /host/path => VM: /vagrant/path => Container: /docker/path 

背景: /host/path/保存在容器级别可用的项目的开发文件,以确保在进行更改时自动重新加载。

组态

stream浪汉:

 Vagrant.configure("2") do |config| config.vm.synced_folder "/host/path", "/vagrant/path" end 

泊坞窗:

 docker run -name mycontainer -d -v /vagrant/path:/docker/path my/image 

问题

这个configuration工作,直到我重新加载虚拟机。 例如,当我重新启动计算机并启动vagrant up ,泊坞窗容器只能识别/docker/path的空文件夹。 我想这可能是一些时间或顺序问题。 /vagrant/path不是空的,并且有正确的内容。

我现在的解决方法是每次重新启动虚拟机后重新加载容器:

 docker rm mycontainer docker kill mycontainer docker run -name mycontainer -d -v /vagrant/path:/docker/path my/image 

那感觉不对 有任何想法吗?

Solutions Collecting From Web of "在Docker中通过Vagrant共享卷"

我有同样的问题。 发布的解决方案不符合我的要求。

这是我的解决方案。 如果运行多个容器遍历/ var / lib / vagrant / cids /

第一个脚本禁用启动时的docker-deamon容器自动启动。 第二个脚本只有在没有运行的情况下才通过CID启动容器。

这是为最初的流浪汉起作用,追随流浪汉 重新加载] – 配置

 # -*- mode: ruby -*- # vi: set ft=ruby : $disableAutostart = <<SCRIPT if [ -e /home/vagrant/docker_autostart_disabled ] then echo "Docker Container autostart already disabled ... " else echo "Disable Docker Container autostart ..." echo "DOCKER_OPTS=\"-r=false ${DOCKER_OPTS}\"" > /etc/default/docker touch /home/vagrant/docker_autostart_disabled fi SCRIPT $startContainer = <<SCRIPT CID_FILE_PATH=/var/lib/vagrant/cids/ CID_FILE=$CID_FILE_PATH$(ls $CID_FILE_PATH) if [ -e $CIDFILE ] then CID=$(cat $CID_FILE) if ! $(docker inspect --format "{{.State.Running}}" $CID) then echo "Starting Container ..." docker start $CID > /dev/null else echo "Docker Container already running ..." fi else echo "No Container to start ... maybe something went wrong ..." echo "Keep calm and try vagrant destroy && vagrant up" fi SCRIPT # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| ... VM cfg Stuff ... #Disable Docker autostart container config.vm.provision "shell" , inline: $disableAutostart config.vm.provision :docker, version: "1.0.0" do |d| d.build_image "/container/pseudo", args:"-t cdh5/pseudo-base" ... more container d.run "cdh5/data", auto_assign_name: false, args:"-v /vagrant/share:/home/student/share -h cdh5-single-node" end config.vm.provision :shell , inline: $startContainer, run: "always" end 

不知道你的问题的原因。 我不确定虚拟机如何在重启过程中保持运行程序的状态,所以我要说的是,当你vagrant up时候,安全的做法是重新加载容器。

您可以使用vagrant provisioning(在您的Vagrantfile )自动重新加载容器:

 config.vm.provision :shell, :inline => <<<EOF docker kill mycontainer docker rm mycontainer docker run -name mycontainer -d -v /vagrant/path:/docker/path my/image EOF 

我可以确认我有关于不运行配置的重新启动相同的问题。 发生这种情况的原因是,在重新启动docker守护程序后,同步的文件夹源仍然是空的(也就是在启动时启动docker后运行文件夹同步阶段)。 我发现另一个选项是简单地重新启动托管服务在主机与sudo service docker restart