使用 Intellij/Rubymine 在 docker 中调试 rails 应用程序

Posted

技术标签:

【中文标题】使用 Intellij/Rubymine 在 docker 中调试 rails 应用程序【英文标题】:Debug rails app inside docker use Intellij/Rubymine 【发布时间】:2017-02-07 04:45:28 【问题描述】:

我开始使用 Docker 进行 Rails 开发。 目前,我按照一些教程来设置开发环境。 一切正常。 (用于构建,运行)。 但是现在,我想为 Rubymine 设置 Ruby Remote SDK,所以我在 docker 容器上安装了 SSH(ruby 容器;我安装了 SSH,因为它是设置远程 SDK 所必需的)。

这里是 Dockerfile

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

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 -> 在这个链接https://docs.docker.com/engine/examples/running_ssh_service/)

然后我将 ssh 连接到容器。 这是我的步骤:

    获取ssh端口:

    码头港口 demorailsdocker_web_1

    # 这是结果

    22/tcp -> 0.0.0.0:32768

    3000/tcp -> 0.0.0.0:3000

    将 ssh 连接到容器

    ssh root@localhost -p 32768

    # 结果 ssh_exchange_identification:连接被远程主机关闭

我发现问题与 Dockerfile 中的设置有关。

因为当我删除 docker 文件中的这些行时:

RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp

并删除 docker-compose.yml 中的那些行

 volumes:
      - .:/myapp

然后我可以连接到 SSH。

我认为问题在于设置工作目录。


我可以通过删除 docker-compose.yml 中的这一行来很好地将 SSH 连接到容器

command: bundle exec rails s -p 3000 -b '0.0.0.0'

所以我认为问题出在导轨上。 但我不知道如何解决它。

【问题讨论】:

嗨,我需要 SSH 连接。 (为 Rubymine 设置远程 Ruby SDK) 明白,但是您可以直接连接到 SSH/系统日志并检查 SSH 服务状态(以确保它实际上正在运行)以进行故障排除。我认为您的WORKDIR 是正确的,不是问题的一部分。 【参考方案1】:

我已经设法使用 RubyMine 来远程调试在 docker 中运行的 rails,而无需使用 SSH。

我的环境中的软件版本如下

RubyMine 2017.2.4(Build #RM-172.4155.44,于 2017 年 9 月 26 日构建) Docker 中的 Ruby(ruby 2.4.2p198(2017-09-14 修订版 59899)[x86_64-linux]) RubyMine 使用的 Ruby SDK 和 Gem (ruby-2.4.2-p198)

注意:对于 Ruby SDK,我只是使用本地 Ruby 解释器 /usr/bin/ruby,而不是远程解释器。

以下是详细步骤作为演示

1。启动泊坞窗

docker run --name rails-demo -p 1234:1234 -p 3080:3000 -it ruby bash

2。 docker里面的步骤

确保您的 Gemfile 中有以下 gem,如果有 gem pry-byebug,最好将其注释掉,以避免可能的干扰。

# gem 'pry-byebug'
gem 'debase', '0.2.2.beta10'
gem 'ruby-debug-ide'

如有必要,更新应用程序的依赖项

bundle install

启动你的 Rails 服务器

/home/hello_rails# rdebug-ide --host 0.0.0.0 --port 1234 --dispatcher-port 26162 -- bin/rails s

3。从 RubyMine 远程调试

现在启动 RubyMine,运行 -> 调试... -> 编辑配置...

单击加号“+”添加新配置,并选择 Ruby 远程调试。

如上所示填写表格,然后单击“调试”按钮。现在您将在 docker 中看到 Rails 服务器已启动:

/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启动命令)

如下图打断点,在这里可以检查变量等

另一个值得一提的警告是确保网络服务器 puma 以单一模式启动。对我来说,集群模式不适用于远程调试,在那里你会遇到“终止超时工作人员”之类的错误。对于开发来说,单模式应该就足够了。

【讨论】:

以上是关于使用 Intellij/Rubymine 在 docker 中调试 rails 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

为啥在这里使用 do.call ?

无法在 Greenplum 中使用 DO 执行匿名代码块

使用Dozer优雅的将DO转换成VO

我可以在“do”中使用“let”吗? [复制]

输入在 do-while 循环中无法与 Scanner 类一起使用

do_gettimeofday使用方法