【问题标题】:vagrant: Run shell script in Virtualbox after Docker instances boot (ordering is wrong)vagrant:在 Docker 实例启动后在 Virtualbox 中运行 shell 脚本(顺序错误)
【发布时间】:2015-12-07 00:51:31
【问题描述】:

我对 Vagrant 进行了以下设置。

  • 运行 Yosemite 的 Mac 笔记本电脑。
  • 在笔记本电脑内部,一个使用 Virtualbox 管理的 Ubuntu trusty64 实例。
  • 在 Virtualbox Ubuntu 实例内部,有两个 Docker 容器,其中一个运行 Postgres,另一个运行 Redis。

我想按以下顺序执行命令:

  1. 启动 Virtualbox Ubuntu 实例。
  2. 启动 Docker 容器。
  3. 启动 Docker 容器。
  4. 在 Ubuntu 实例上运行命令。

我需要命令最后运行,因为我希望它与容​​器交互。这是我现在在我的 Vagrantfile 中的内容 - 我们正在使用多机配置。我省略了一些 forward_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-Vagrantfile

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

无论我多么努力,我都无法让init_app.sh 运行 Docker 容器开始运行。

我还读到 Vagrant 以“由外而内”的顺序执行配置程序,因此我尝试了很多恶作剧,试图将 "shell" 提供程序嵌套在 config.vm.define "foo" do |blah| ... 调用中,但没有成功。

我相信在所有配置步骤完成之前,Docker 容器可能还没有启动?例如,调用了一些配置后步骤。在这种情况下,我将永远能够在配置器中运行脚本并在 Docker 容器监听各自的端口后运行它。

【问题讨论】:

    标签: docker vagrant vagrantfile


    【解决方案1】:

    你可以看看vagrant trigger,它会很方便。

    即使主页上没有记录,也可以使用run_remote 命令

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

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

    【讨论】:

    • 使用插件看起来是个不错的选择,但在这种情况下,插件存在构建错误。我不知道使用它是否是个好主意。 =0)
    • 很奇怪,也许你应该在这个项目上开一张票,或者详细说明它应该工作的错误原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2020-04-20
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多