vagrant: запустить сценарий оболочки в Virtualbox после загрузки экземпляров Docker (неправильный порядок)

У меня есть следующая настройка с Vagrant.

  • Ноутбук Mac с Yosemite.
  • Внутри ноутбука экземпляр Ubuntu trusty64, управляемый с помощью Virtualbox.
  • Внутри экземпляра Virtualbox Ubuntu два контейнера Docker, один из которых работает с Postgres, а другой — с Redis.

Я хотел бы выполнять команды в следующем порядке:

  1. Загрузите экземпляр Virtualbox Ubuntu.
  2. Загрузите контейнеры Docker.
  3. Запустите контейнеры Docker.
  4. Запустите команду на экземпляре 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 прослушивают свои соответствующие порты.


person Kevin Burke    schedule 10.09.2015    source источник


Ответы (1)


вы можете взглянуть на бродячий триггер, это может быть удобно.

Несмотря на то, что это не задокументировано на главной странице, есть команда run_remote, которую можно использовать.

config.trigger.after :up do
  run_remote  "bash ./scripts/init_app.sh"
end

Ваш скрипт будет запущен после запуска vagrant up, поэтому контейнеры докеров должны быть готовы.

person Frederic Henri    schedule 10.09.2015
comment
Это выглядит как хороший вариант использования плагинов, но в данном случае этот плагин имеет ошибку сборки. Я не знаю, хорошо ли это использовать. =0) - person Eddy Hernandez; 03.05.2016
comment
Странно, может быть, вам следует открыть тикет по этому проекту или подробно описать ошибку, потому что она должна работать - person Frederic Henri; 03.05.2016