Docker中的共享卷通过Vagrant

Alp*_*Alp 9 linux vagrant docker

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

Host: /host/path => VM: /vagrant/path => Container: /docker/path
Run Code Online (Sandbox Code Playgroud)

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

组态

流浪汉:

Vagrant.configure("2") do |config|
  config.vm.synced_folder "/host/path", "/vagrant/path"
end
Run Code Online (Sandbox Code Playgroud)

泊坞窗:

docker run -name mycontainer -d -v /vagrant/path:/docker/path my/image
Run Code Online (Sandbox Code Playgroud)

问题

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

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

docker rm mycontainer 
docker kill mycontainer 
docker run -name mycontainer -d -v /vagrant/path:/docker/path my/image
Run Code Online (Sandbox Code Playgroud)

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

小智 4

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

这是我的解决方案。如果您运行多个容器,请迭代中的 cids /var/lib/vagrant/cids/中的 cids

第一个脚本禁用 docker-deamon 容器在启动时自动启动。仅当第二个脚本未运行时,才通过其 CID 启动容器。

这适用于初始vagrant up和后续vagrant [ up | 重新加载] --规定

# -*- 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
Run Code Online (Sandbox Code Playgroud)