web-dev-qa-db-ja.com

systemd VagrantとVirtualBox:同期フォルダーがマウントされるのを待つ

開始する前にVagrant同期フォルダーをマウントする必要があるVagrantボックスでsystemdサービスをセットアップしようとしています。

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

my-serverサービスを有効にしない場合、同期されたフォルダーは正しくマウントされます。しかし、my-serverサービスを有効にしようとすると、サービスはマウントされたファイルを見つけることができません。その後、Vagrantボックスにログインすると、フォルダーがマウントされません。そのパスからファイルをロードしようとするサービスの試みはVagrantに干渉するようです。

それで、サービスが開始する前に、フォルダがマウントされるのをどのように待つのですか?

他のソリューションはさまざまな方法で不十分であり、サービスを開始するために手動の介入を必要としますが、これは受け入れられません。

6
rich remer

私は追加してそのような問題を解決しました:

[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 systemdユニットがあります。あなたはあなたのものを見つけることができます:

# systemctl list-units | fgrep .mount
6
Ivan Krechetov

私のsystemdサービスの1つが、サービスが正常に開始する前にvagrant synced filesystemが存在する必要があるという同様の問題がありました。 vagrant Shell provisioner を開始するたびにサービスを自動的に再起動することで、問題を回避しました。これは、vagrantが同期されたファイルシステムをマウントした後にプロビジョナーが実行されるため機能します。

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

サービスが同期されたファイルシステムに干渉する理由がわかりません。 Vagrantは、vagrantfileがあるフォルダーをデフォルトで/ vagrantに同期します。 2回取り付けたのでしょうか?

3
Scott McLeod