如何在shell provisioner之后执行synced_folder

60次阅读
没有评论

问题描述

在使用Vagrant时,希望在执行shell provisioner之后执行synced_folder。他尝试了一些方法,但没有成功。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Vagrant中,可以使用after选项来指定synced_folder在特定provisioner之后运行。但是,根据用户提供的代码,似乎无法直接在config.vm.synced_folder中使用after选项。
为了解决这个问题,可以尝试以下步骤:
1. 将shell provisioner和synced_folder分别定义为两个独立的provisioner。
2. 使用after选项将synced_folder放在shell provisioner之后。
下面是一个示例的Vagrantfile代码:

Vagrant.configure("2") do |config|
  config.vm.box = "your_box"

  config.vm.provision "foo", type: "shell", inline: <<-SHELL
    mkdir /mnt/iso
    mount -t iso9660 -o ro  /tmp/VBoxGuestAdditions.iso /mnt/iso/
    /mnt/iso/VBoxLinuxAdditions.run
  SHELL

  config.vm.provision "bar", type: "shell", inline: <<-SHELL
    # 其他shell provisioner的配置
  SHELL

  config.vm.synced_folder "~/tmp", "/home/vagrant/tmp", after: ["foo", "bar"]
end

在上面的示例中,我们将shell provisioner foobar 分别定义为两个独立的provisioner。然后,使用after选项将synced_folder放在shell provisioner之后。这将确保synced_folder在shell provisioner之后执行。
请注意,after选项接受一个数组,可以指定多个provisioner的名称,以确保正确的顺序。

方案2

如果方案1无法解决问题,可以尝试使用脚本或工具来控制synced_folder的执行顺序。
另一种方法是使用脚本或工具来控制synced_folder的执行顺序。你可以在shell provisioner中编写一个脚本,手动执行synced_folder命令。
以下是一个示例的Vagrantfile代码:

Vagrant.configure("2") do |config|
  config.vm.box = "your_box"

  config.vm.provision "foo", type: "shell", inline: <<-SHELL
    mkdir /mnt/iso
    mount -t iso9660 -o ro  /tmp/VBoxGuestAdditions.iso /mnt/iso/
    /mnt/iso/VBoxLinuxAdditions.run

    # 手动执行synced_folder命令
    vagrant ssh -c "sudo mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` tmp /home/vagrant/tmp"
  SHELL
end

在上面的示例中,我们在shell provisioner foo 中添加了一个命令来手动执行synced_folder命令。这将确保synced_folder在shell provisioner之后执行。
请注意,这种方法需要根据你的实际情况进行调整,并确保正确的命令和参数。

总结

在Vagrant中,可以使用after选项来指定synced_folder在特定provisioner之后运行。如果无法直接在config.vm.synced_folder中使用after选项,可以尝试将shell provisioner和synced_folder分别定义为两个独立的provisioner,并使用after选项将synced_folder放在shell provisioner之后。如果仍然无法解决问题,可以尝试使用脚本或工具来控制synced_folder的执行顺序。

正文完