В настоящее время я создаю довольно сложный серверный стек (приложение ruby on rails), над которым разработчики могут работать, не устанавливая все самостоятельно. Поэтому я использую Vagrant, чтобы позволить им это делать.
Идея состоит в том, что когда вы впервые устанавливаете образ, он извлекает последние исходные коды и устанавливает зависимости, источники отображаются в синхронизированных папках (функция, встроенная в vagrant), так что разработчики могут фиксировать источники и редактировать их в своей собственной среде. Vagrant-box только для сервера.
Запись синхронизированной папки в Vagrantfile:
config.vm.synced_folder "gameeso/", "/var/gameeso", :create => "true"
Образ представляет собой сервер Ubuntu со сценарием выскочки (сценарий выполняется при загрузке и только при подключении к Интернету), который:
Извлекает последнюю ветку разработки из Github (если папка еще не существует)
Устанавливает зависимости (выполняется скриптом)
Все это происходит в синхронизированной папке. У меня были некоторые проблемы с этим подходом, в основном из-за того, что Vagrant очищает синхронизированную папку в моей гостевой системе. Я решил эту проблему, добавив «sleep 10» в сценарий выскочки, чтобы он мог подождать, пока Vagrant не настроит синхронизируемые папки.
Конечно, это небезопасный способ сделать это (если загрузка занимает больше 10 секунд, что маловероятно в наши дни, я бы не хотел узнавать об этом;))
Мой вопрос: есть ли лучший способ разрешить гостевому хосту (бродячему изображению) заполнить синхронизированную папку?
Конечно, заранее большое спасибо!
Встроенный Vagrant обеспечение функции должны идеально подходить для этого. Есть множество способов сделать это, но самый простой, вероятно, состоит в том, чтобы взять весь свой сценарий Upstart и превратить его в простой сценарий оболочки. Затем поместите один из этих блоков в свой Vagrantfile
:
Использование «встроенного» скрипта. Бродяга скопирует содержимое из Vagrantfile
в сценарий в /tmp
каталог и запустите его.
$script = <<<SCRIPT
// The contents of your script go here
SCRIPT
config.vm.provision "shell", inline: $script
Обратите внимание, что сценарий здесь находится внутри "heredoc", что означает, что вам нужно быть осторожным, чтобы убедиться, что SCRIPT
токен, заканчивающий heredoc, находится в нужном месте - то есть в отдельной строке без лишних пробелов. (Ссылка на heredoc выше показывает способ разрешить пробелы, но вам все равно нужно быть осторожным.)
Указание на файл сценария. Vagrant скопирует этот файл в /tmp
каталог и запустите его.
config.vm.provision "shell", path: "setup.sh"
Обратите внимание, что путь здесь относительно Vagrantfile
расположение. тем не мение, файл не выполняется из этого места, поэтому, если вам нужно, чтобы файл находился в определенном каталоге, вы должны следовать методу №3.
Использование «встроенного» сценария, указывающего на файл сценария. Таким образом, вы можете выполнить сценарий в выбранном месте (в приведенном ниже примере это находится в /vagrant
после того, как вы выполнили необходимые условия, такие как chmod
или установка переменных окружения.
$script = <<SCRIPT
chmod +x /vagrant/setup.sh
cd /vagrant
./setup.sh
SCRIPT
config.vm.provision "shell", inline: $script
Вы также можете использовать метод подготовки, который работает через «настоящую» систему развертывания и подготовки, но в зависимости от ваших требований, это может быть излишним.