使用Vagrant运行Docker的Rails应用程序调试

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?


1
好的,那是完全不同的情况,与我所说的不同。 - Micah
你的问题是什么?你能够执行“vagrant ssh”吗? - Pak
2个回答

1
你正在寻找docker execnsenter[1]。使用其中一个工具,您可以在没有SSH的情况下登录到容器并检查日志。
如果您想调试vagrant创建和运行docker容器,可以像这样附加--debug标志:
vagrant up app --provider=docker --debug

但这样做并不能直接从你的Vagrantfile中获取任何调试信息。如果你仍然想要从你的vagrantfile中获取调试消息,我建议你阅读有关vagrant UI类的内容。

PS:也许你只是想要像这样的puts语句:puts“我在这里!”

PPS:如果你想继续使用vagrant和SSH,则has_ssh值和容器中的SSH服务器是正确的方法。

nsenter/docker exec


0

你尝试过使用 Vagrant Docker 提供程序的 has_ssh 选项吗?它说明:

如果为 true,则 Vagrant 将支持与容器的 SSH。这允许 vagrant ssh 工作,provisioners 等。默认值为 false。

顺便说一下,我自己没有尝试过这个。我正在使用 CoreOS 镜像的 Docker,并手动运行 docker 容器(带有 provisioning)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接