У меня есть следующая настройка с Vagrant.
- Ноутбук Mac с Yosemite.
- Внутри ноутбука экземпляр Ubuntu trusty64, управляемый с помощью Virtualbox.
- Внутри экземпляра Virtualbox Ubuntu два контейнера Docker, один из которых работает с Postgres, а другой — с Redis.
Я хотел бы выполнять команды в следующем порядке:
- Загрузите экземпляр Virtualbox Ubuntu.
- Загрузите контейнеры Docker.
- Запустите контейнеры Docker.
- Запустите команду на экземпляре Ubuntu.
Мне нужно, чтобы команда выполнялась последней, потому что я хочу, чтобы она взаимодействовала с контейнерами. Вот что у меня сейчас есть в моем Vagrantfile — мы используем многомашинную конфигурацию. Я опустил некоторые детали forward_port
, потому что они не имеют отношения к порядку, в котором Vagrant запускает средства обеспечения.
Vagrant.configure("2") do |config|
config.vm.provider "docker" do |d|
d.vagrant_vagrantfile = "./docker-Vagrantfile"
end
config.vm.define "db" do |p|
p.vm.provider "docker" do |pd|
# ...
end
end
config.vm.define "redis" do |r|
r.vm.provider "docker" do |rd|
rd.name = "redis"
rd.image = "redis"
end
end
end
А вот связанный docker-Vagrantfile
:
Vagrant.configure("2") do |config|
config.vm.box = "trusty64"
config.vm.provision "docker"
config.vm.provision "shell", path: "./scripts/init_app.sh"
config.vm.provider "virtualbox" do |v|
# ...
end
end
Как бы я ни старался, я не могу заставить init_app.sh
работать после запуска контейнеров Docker.
Я также читал, что Vagrant выполняет средства обеспечения в порядке «снаружи внутрь», поэтому я перепробовал много махинаций, пытаясь вложить поставщика "shell"
внутри вызова config.vm.define "foo" do |blah| ...
, но безуспешно.
Я полагаю, что, возможно, контейнеры Docker не запускаются до тех пор, пока не будут выполнены все этапы подготовки? Например, вызывается какой-то шаг после подготовки. В этом случае я никогда не смог бы запустить сценарий в провайдере и запустить его после того, как контейнеры Docker прослушивают свои соответствующие порты.