vagrant:在Docker实例引导后在Virtualbox中运行shell脚本(排序错误)

vagrant:在Docker实例引导后在Virtualbox中运行shell脚本(排序错误),docker,vagrant,vagrantfile,Docker,Vagrant,Vagrantfile,我有以下设置与流浪汉 运行约塞米蒂的Mac笔记本电脑 在笔记本电脑内部,有一个用Virtualbox管理的Ubuntu trusty64实例 在Virtualbox Ubuntu实例内部,有两个Docker容器,其中一个运行Postgres,另一个运行Redis 我希望按以下顺序执行命令: 启动Virtualbox Ubuntu实例 引导Docker容器 启动Docker容器 在Ubuntu实例上运行命令 我需要最后运行该命令,因为我希望它与容器交互。这是我现在在我的Vagrant文件中的内

我有以下设置与流浪汉

  • 运行约塞米蒂的Mac笔记本电脑
  • 在笔记本电脑内部,有一个用Virtualbox管理的Ubuntu trusty64实例
  • 在Virtualbox Ubuntu实例内部,有两个Docker容器,其中一个运行Postgres,另一个运行Redis
我希望按以下顺序执行命令:

  • 启动Virtualbox Ubuntu实例
  • 引导Docker容器
  • 启动Docker容器
  • 在Ubuntu实例上运行命令 我需要最后运行该命令,因为我希望它与容器交互。这是我现在在我的Vagrant文件中的内容-我们正在使用多机配置。我省略了一些
    forward\u port
    细节,因为它们似乎与Vagrant运行供应器的顺序无关

    Vagrant.configure("2") do |config|
      config.vm.provider "docker" do |d|
        d.vagrant_vagrantfile = "./docker-Vagrantfile"
      end
    
      config.vm.define "db" do |p|
        p.vm.provider "docker" do |pd|
          # ... 
        end
      end
    
      config.vm.define "redis" do |r|
        r.vm.provider "docker" do |rd|
          rd.name = "redis"
          rd.image = "redis"
        end
      end
    end
    
    这是链接的
    docker Vagrant文件

    Vagrant.configure("2") do |config|
      config.vm.box = "trusty64"
      config.vm.provision "docker"
      config.vm.provision "shell", path: "./scripts/init_app.sh"
    
      config.vm.provider "virtualbox" do |v|
        # ...
      end
    end
    
    无论我如何努力,我都无法在Docker容器开始运行后运行
    init_app.sh

    我还读到Vagrant以“从外到内”的顺序执行供应器,所以我尝试了很多诡计,试图将
    的“shell”
    提供程序嵌套在
    config.vm.define“foo”do | blah |……
    调用中,但运气不佳


    我相信在完成所有供应步骤之前,Docker容器可能不会启动?有一个叫做“供应后”的步骤。在这种情况下,我将永远无法在provisioner中运行脚本,并在Docker容器侦听其各自的端口后让其运行。

    您可以查看该脚本,因为它非常方便

    尽管主页上没有对其进行记录,但可以使用
    run\u remote
    命令

    config.trigger.after :up do
      run_remote  "bash ./scripts/init_app.sh"
    end
    

    您的脚本将在
    vagrant up
    运行后运行,因此docker容器应该准备就绪

    使用插件似乎是一个不错的选择,但在这种情况下,插件有一个构建错误。我不知道使用它是否是个好主意=0)奇怪也许您应该打开此项目的票证或详细说明错误原因,因为它应该可以工作