使用RubyMine和Docker进行开发

我想开发一个Rails项目,而不必在我的Windows本地机器上安装Ruby和所有的服务器工具。 我已经创build了我的Docker容器(Ruby和MySQL),并在RubyMine 2016.1上安装了Docker插件,但是对于日常开发来说,这似乎不是很实用,我的意思是在部署到testing服务器之前开发,运行和debugging。

我错过了什么使这个工作stream程成为可能吗? 或者不是Docker在开发过程中为这一​​步build议?

我不在Windows下开发,但是这里是我在Mac OS X下如何处理这个问题。首先,我的Rails项目有一个Guardfile设置,启动rails( guard-rails gem),并且在我进行更改时pipe理运行我的testing( 警卫最小的gem)。 在开发中获得快速的周转时间非常重要。

我启动docker守护进程,将一个本地目录挂载到docker映像中,并显示一个3000端口,运行一个永不停止的命令。

docker run -d -v {local Rails root}:/home/{railsapp} -p 3000:3000 {image id} tail -f /dev/null 

我这样做,所以我可以用任意数量的shell连接到它,做任何我只能在本地做的活动。

Ruby 2.2.5,Rails 5和一些Unix开发工具(heroku toolbelt,gcc等)都安装在容器中。 我没有设置一个单独的数据库容器,因为我使用SQLite3进行开发,生产pg(heroku)。 最后,当我的数据库使用变得更加复杂的时候,我需要把它设置好,但是在那之前它可以很好地起飞。

我将RubyMine指向本地的rails根目录。 有了这个,任何更改都会立即反映在容器中。 在另一个命令行中,我启动($是主机,#是容器):

 $ docker exec -it {container id} /bin/bash # cd /home/{railsapp} # bundle install # bundle exec rake db:migrate # bundle exec guard 
  • bundle install只有当我做了Gemfile更改或第一次。
  • bundle exec rake db:migrate只有当我做了数据库更改或第一次。

在这一点上,我通常有一个Rails实例,我可以浏览到localhost:3000,RubyMine项目是“同步”到Docker镜像。 然后,我主要在RubyMine中进行更改,忽略没有安装各种gem的消息等,并专注于保持我的testing在我开发时干净地运行。

当我遇到exception时处理控制台,我需要添加:

 config.web_console.whitelisted_ips = ['172.16.0.0/12', '192.168.0.0/16'] 

config/environments/development.rb ,以便在开发中发生exception时允许Webdebugging控制台。 (在所有情况下, 192.168/*可能都是不必要的,但有些人遇到了需要的问题。)

我仍然无法使用RubyMine进行debugging,但我不会错过任何地方,就像我想的那样,尤其是在Web控制台可用的情况下。 另外,它允许我在开发环境中完全运行所有的酷工具,而不会污染我的主机系统。

我花了一天左右的时间试图让远程debugging器工作,但核心问题似乎是(ruby-debug的工作方式),您需要允许debugging过程(在docker容器中)“伸手”到主机的端口连接并发送debugging信息。 不幸的是,绑定端口会使它们处于使用状态,所以你不能创build一个从主机/ RubyMine到特定容器端口的“只听”连接。 我相信这只是Docker的限制,Docker处理networking的方式或者 ruby-debug-ide命令处理传输debugging信息的方式都会改变。

这种方法的结果是,它使我可以在非常快的周转时间内完成testing,并且在浏览器内开发时间也相当快。 这对于新的应用程序开发是最佳的,但是如果你有一个大的,旧的,笨拙的,没有经过testing的代码库,那么这个工具可能不太好。

大多数/所有这些function都应该存在于Docker的Windows版本中。