在Intellij/Rubymine中使用Docker调试Rails应用程序

5
我可以翻译此文。这是一篇关于编程和Docker的相关内容。作者正在学习如何使用Docker进行Rails开发,并遵循教程建立开发环境。目前为止,一切都运行良好(构建和运行)。但是现在他想要在Rubymine中设置Ruby Remote SDK,因此他在Docker容器中安装了SSH(安装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到容器。 以下是我的步骤:

  1. 获取ssh的端口:

    docker port demorailsdocker_web_1

    # 这是结果

    22/tcp -> 0.0.0.0:32768

    3000/tcp -> 0.0.0.0:3000

  2. 连接ssh到容器

    ssh root@localhost -p 32768

    # 结果 ssh_exchange_identification: Connection closed by remote host

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

因为当我删除Dockerfile中的这些行时:

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。

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


我可以成功连接到容器的SSH,只需在docker-compose.yml文件中删除这一行即可。

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

所以我认为问题与Rails有关。 但我不知道如何修复它。


嗨,我需要进行SSH连接。(为了设置远程Ruby SDK用于Rubymine) - quangson91
明白了,但您可以直接连接以获取SSH/系统日志,并检查SSH服务状态(确保它实际上正在运行)进行故障排除。我认为您的WORKDIR是正确的,不是问题的一部分。 - DevOps Dan
1个回答

9

我已经成功使用RubyMine在Docker内部远程调试运行的Rails,而不需要使用SSH。

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

  • RubyMine 2017.2.4(版本号#RM-172.4155.44,于2017年9月26日构建)
  • Docker内部的Ruby(ruby 2.4.2p198(2017年9月14日修订版59899)[x86_64-linux])
  • RubyMine使用的Ruby SDK和Gems(ruby-2.4.2-p198)

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

输入图像描述

输入图像描述

以下是演示的详细步骤

1. 启动Docker

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

2. Docker内部步骤

请确保您的Gemfile中包含以下宝石,最好将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,点击Run -> Debug... -> Edit Configurations...

点击加号'+'来添加新的配置,并选择Ruby远程调试。

enter image description here

按照上图所示填写表格并点击Debug按钮。现在你会发现Rails服务器已经在docker中启动了:

/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以单模式启动。对于我来说,集群模式无法进行远程调试,否则会出现像“终止超时工作人员”之类的错误。对于开发而言,单模式应该足够好。

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