開始する前に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に干渉するようです。
それで、サービスが開始する前に、フォルダがマウントされるのをどのように待つのですか?
他のソリューションはさまざまな方法で不十分であり、サービスを開始するために手動の介入を必要としますが、これは受け入れられません。
私は追加してそのような問題を解決しました:
[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
私のsystemdサービスの1つが、サービスが正常に開始する前にvagrant synced filesystemが存在する必要があるという同様の問題がありました。 vagrant Shell provisioner を開始するたびにサービスを自動的に再起動することで、問題を回避しました。これは、vagrantが同期されたファイルシステムをマウントした後にプロビジョナーが実行されるため機能します。
config.vm.provision "Shell", run: "always", inline: "systemctl restart my-server"
サービスが同期されたファイルシステムに干渉する理由がわかりません。 Vagrantは、vagrantfileがあるフォルダーをデフォルトで/ vagrantに同期します。 2回取り付けたのでしょうか?