在Docker内部调试Rails应用程序使用intellij/rubymine

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,而不是远程解释器。

    enter image description here

    enter image description here

    下面是作为演示的详细步骤1。启动Docker

    1
    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远程调试。

    enter image description here

    如上图所示填写表单,然后单击调试按钮。现在,您将在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的命令)

    点击断点,如下所示,您可以在这里检查变量等。

    enter image description here

    另一个值得一提的警告是,确保Web服务器PUMA以单一模式启动。对于我来说,集群模式不适用于远程调试,在远程调试中会出现诸如"终止超时工作线程"之类的错误。对于开发来说,单一模式应该足够好。