Docker中的共享卷通过Vagrant

时间:2013-11-27 11:07:00

标签: linux vagrant docker

我有一个Vagrant虚拟机,它托管一个Docker容器。主机有一个文件夹,需要在vm和容器中访问:

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

后台:/host/path/包含项目的开发文件,这些文件在容器级别可用,以确保在进行更改时自动重新加载。

配置

流浪:

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

问题

此配置有效,直到我重新加载vm。例如,当我重新启动计算机并使用vagrant up启动vm时,docker容器仅识别/docker/path中的空文件夹。我想这可能是一些时间或顺序问题。 /vagrant/path不为空且内容正确。

我的解决方法是在每次重启vm后重新加载容器:

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

那感觉不对。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

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

这是我的解决方案。如果你运行多个容器迭代cids 的的/ var / lib中/流浪/的CID /

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

这适用于最初的流浪汉并且跟随流浪汉[up |重新加载] --provision

 
# -*- 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

答案 1 :(得分:2)

不确定问题的原因。我不确定VM在重新启动期间如何保持运行程序的状态,所以我要说安全的做法是在vagrant up时重新加载容器。

您可以使用vagrant配置自动重新加载容器(在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

答案 2 :(得分:2)

我可以确认我在没有运行配置的重新启动时遇到了同样的问题。 发生这种情况是因为在重新启动后启动docker守护程序时,同步文件夹源仍为空(即,在启动时启动docker之后,文件夹同步阶段会运行)。 我找到的另一个选项是简单地使用sudo service docker restart重新启动主机中的docker服务。