3

我正在尝试找出 vagrant 和 docker 运行 rails 应用程序的最佳开发工作流程。在我的 dockerfile 我有这个:

FROM quirky/rails:latest

RUN mkdir /opt/app
WORKDIR /opt/app

# Install gems
ADD ./Gemfile /opt/app/Gemfile
ADD ./Gemfile.lock /opt/app/Gemfile.lock
RUN bundle install

# Instal npm packages
ADD ./package.json /opt/app/package.json
RUN npm install

# Expose directories and ports
VOLUME /opt/app
EXPOSE 3000

# Run the web server
WORKDIR /opt/app
CMD rm -f /opt/app/tmp/pids/server.pid && bundle exec rails s

我的 Vagrantfile 看起来像这样:

 config.vm.define "app" do |app|
    app.vm.provider "docker" do |d|
      d.build_dir = "."
      d.link "db:db"
      d.link "redis:redis"
      d.link "solr:solr"
      d.volumes = ["/app:/opt/app"]
      d.ports = ["3000:3000"]
      d.vagrant_vagrantfile = "./docker/Vagrantfile"
      d.remains_running = true
    end
  end

  config.vm.define "db" do |db|
    db.vm.provider "docker" do |d|
      d.image = "paintedfox/postgresql"
      d.name = "db"
      d.env = {USER: "vagrant", PASS: "password"}
      d.vagrant_vagrantfile = "./docker/Vagrantfile"
    end
  end

  config.vm.define "redis" do |redis|
    redis.vm.provider "docker" do |d|
      d.image = "dockerfile/redis"
      d.name = "redis"
      d.ports = ["6379:6379"]
      d.vagrant_vagrantfile = "./docker/Vagrantfile"
    end
  end

  config.vm.define "solr" do |solr|
    solr.vm.provider "docker" do |d|
      d.image = "quirky/solr"
      d.name = "solr"
      d.ports = ["8080:8080"]
      d.vagrant_vagrantfile = "./docker/Vagrantfile"
    end
  end

通常,如果我想调试某些东西,我只需debugger在代码中添加一条语句,然后将其作为本地进程运行,它就会到达断点并调出 pry 或调试器控制台。这在 vagrant 的容器中是如何工作的?

这就是我启动开发环境的方式:

vagrant up app --provider=docker

它在后台启动它。似乎没有办法启动它并附加到它。我是否缺少可以传递给 vagrant 的命令或标志?

4

2 回答 2

1

您正在寻找docker execnsenter[ 1 ]。使用这些工具之一,您可以在不使用 SSH 的情况下登录容器并检查您的日志。

如果你想调试 vagrant 创建和运行 docker-container,你可以--debug像这样附加标志:

vagrant up app --provider=docker --debug

但这不会直接从您的 Vagrantfile 中为您提供任何调试信息。如果您仍想从 vagrantfile 中获取调试消息,我建议您阅读有关 vagrants UI 类的信息。

PS:也许你只是想要puts这样的陈述:puts "I'm here!"

PPS:如果你想坚持使用 vagrant 和 SSH has_ssh,那么容器中的值和 SSH-Server 是可行的方法。

nsenter/docker 执行

于 2014-11-22T18:33:44.500 回答
0

您是否尝试过Vagrand Docker 提供程序的has_ssh选项?它指出:

如果为真,那么 Vagrant 将支持 SSH 与容器。这允许 vagrant ssh 工作,提供者等。这默认为 false

顺便说一句,我自己没有尝试过。我将 Docker 与 CoreOS 映像一起使用并手动运行 docker 容器(通过配置)。

于 2014-07-17T14:54:47.863 回答