Debug rails app inside docker use Intellij/Rubymine
我开始和Docker一起开发Rails。目前,我遵循一些教程来设置开发环境。一切正常。(对于build,运行)。但是现在,我想为RubyMine安装RubyRemoteSDK,所以我在Docker容器上安装了ssh(Ruby容器;我安装了ssh,因为它是设置远程SDK所必需的)。
这是dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | FROM ruby:2.2.0 # Install package RUN apt-get update -qq && apt-get install -y \ build-essential \ libpq-dev \ nodejs \ openssh-server # Setting sshd RUN mkdir /var/run/sshd RUN echo 'root:root' | chpasswd RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config # SSH login fix. Otherwise user is kicked off after login RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd ENV NOTVISIBLE"in users profile" RUN echo"export VISIBLE=now">> /etc/profile EXPOSE 22 CMD ["/usr/sbin/sshd","-D"] RUN mkdir /myapp WORKDIR /myapp ADD Gemfile /myapp/Gemfile ADD Gemfile.lock /myapp/Gemfile.lock RUN bundle install ADD . /myapp |
和docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | version: '2' services: db: image: postgres web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/myapp ports: -"3000:3000" -"22" depends_on: - db |
(对于ssh->in-flow,此链接https://docs.docker.com/engine/examples/running_ssh_service/)
然后我将ssh连接到容器。以下是我的步骤:
获取ssh端口:
docker端口demorailsdocker_web_1
#这是结果
22/TCP->0.0.0.0:32768
3000/TCP->0.0.0.0:3000
将ssh连接到容器
ssh根@localhost-p 32768
α结果ssh交换标识:远程主机关闭的连接
我发现这个问题与dockerfile中的设置有关。
因为当我删除docker文件中的那些行时:
1 2 3 4 5 6 | RUN mkdir /myapp WORKDIR /myapp ADD Gemfile /myapp/Gemfile ADD Gemfile.lock /myapp/Gemfile.lock RUN bundle install ADD . /myapp |
删除docker-compose.yml中的那些行
1 2 | volumes: - .:/myapp |
然后我可以连接到ssh。
我认为问题在于设置工作目录。
通过在docker-compose.yml中删除这一行,我可以将ssh很好地连接到容器。
1 | command: bundle exec rails s -p 3000 -b '0.0.0.0' |
所以我认为问题出在铁轨上。但我不知道怎么修。
我设法使用rubymine远程调试在Docker中运行的Rails,而不使用ssh。
我的环境中的软件版本如下- Rubymine 2017.2.4(建造编号:RM-172.4155.44,建造日期:2017年9月26日)
- Ruby Inside Docker(Ruby 2.4.2p198(2017-09-14版本59899)[x86_-linux])
- rubymine使用的ruby sdk和gems(ruby-2.4.2-p198)
注意:对于RubySDK,我只是使用本地Ruby解释器/usr/bin/ruby,而不是远程解释器。
下面是作为演示的详细步骤1。启动Docker1 | docker run --name rails-demo -p 1234:1234 -p 3080:3000 -it ruby bash |
2。码头工人内部的台阶
确保您的gem文件中有以下gem,最好对gem-pry-byebug(如果有)进行注释,以避免可能的干扰。
1 2 3 | # gem 'pry-byebug' gem 'debase', '0.2.2.beta10' gem 'ruby-debug-ide' |
必要时更新应用程序的依赖项
1 | bundle install |
启动Rails服务器
1 | /home/hello_rails# rdebug-ide --host 0.0.0.0 --port 1234 --dispatcher-port 26162 -- bin/rails s |
三。从rubymine远程调试
现在启动rubymine,运行->调试…->编辑配置…
单击加号"+"添加新配置,然后选择Ruby远程调试。
如上图所示填写表单,然后单击调试按钮。现在,您将在Docker中看到Rails服务器启动:
1 2 3 4 5 6 7 8 9 10 11 | /home/hello_rails# rdebug-ide --host 0.0.0.0 --port 1234 --dispatcher-port 26162 -- bin/rails s Fast Debugger (ruby-debug-ide 0.6.0, debase 0.2.2.beta10, file filtering is supported) listens on 0.0.0.0:1234 => Booting Puma => Rails 5.1.4 application starting in development => Run `rails server -h` for more startup options Puma starting in single mode... * Version 3.10.0 (ruby 2.4.2-p198), codename: Russell's Teapot * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://0.0.0.0:3000 Use Ctrl-C to stop |
现在,您可以在rubymine中设置断点,并开始远程调试它:-)
使用url:http://localhost:3080/say/hi进入浏览器(注意,3080端口是从3000映射过来的,请参见启动docker的命令)
点击断点,如下所示,您可以在这里检查变量等。
另一个值得一提的警告是,确保Web服务器PUMA以单一模式启动。对于我来说,集群模式不适用于远程调试,在远程调试中会出现诸如"终止超时工作线程"之类的错误。对于开发来说,单一模式应该足够好。