我有一个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
那感觉不对。有什么想法吗?
答案 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服务。