Назад | Перейти на главную страницу

systemd Vagrant и VirtualBox: дождитесь подключения синхронизированной папки

Я пытаюсь настроить службу systemd в поле Vagrant, для которого перед запуском необходимо смонтировать синхронизированную папку Vagrant.

Vagrantfile

Vagrant.configure(2) do |config|
    config.vm.box = "ubuntu/yakkety64"
    config.vm.synced_folder ".", "/usr/local/src"
    config.vm.provision "shell", path: "bootstrap/bootstrap"
end

/etc/systemd/system/my-server.service

[Service]
ExecStart=/usr/bin/node /usr/local/src/index.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=my-server
User=ubuntu
Group=ubuntu

[Unit]
Requires=remote-fs.target
After=vboxguest.service
After=virtualbox-guest-utils.service

[Install]
WantedBy=remote-fs.target

Если я не включу мой-сервер service синхронизированная папка правильно смонтирована. Но когда я пытаюсь включить мой-сервер service, служба не может найти подключенные файлы. Если я затем войду в окно Vagrant, папка не будет смонтирована. Похоже, что попытка службы загрузить файлы с этого пути мешает Vagrant.

Итак, как мне дождаться подключения папок до запуска службы?

Другие решения по-разному не работают, требуя ручного вмешательства для запуска службы, что недопустимо.

Я только что решил такую ​​проблему, добавив:

[Install]
WantedBy=multi-user.target var-www-example.com.mount'

где var-www-example.com соответствует:

config.vm.synced_folder ".", "/var/www/example.com"

в Vagrantfile.

Таким образом, Vagrant имеет системный модуль XXX.mount для каждой точки монтирования синхронизированной папки. Вы можете найти свой с помощью:

# systemctl list-units | fgrep .mount

У меня была аналогичная проблема, когда одна из моих служб systemd требовала наличия бродячей синхронизированной файловой системы до запуска службы для успешного запуска. Я решил проблему, установив поставщик бродячих оболочек автоматически перезапускать службу при каждом запуске. Это работает, потому что провайдер запускается после того, как vagrant смонтирует синхронизированные файловые системы.

config.vm.provision "shell", run: "always", inline: "systemctl restart my-server"

Я не уверен, почему ваш сервис может мешать вашей синхронизированной файловой системе. Vagrant синхронизирует папку, в которой находится ваш vagrantfile, по умолчанию с / vagrant. Мог ли он быть установлен дважды?