Приложение Debug rails в приложении докеров использует Intellij/Rubymine

Я начинаю работать с рельсами с помощью Docker. В настоящее время я следую инструкциям по настройке среды разработки. Все работает хорошо. (для сборки, запуска). Но теперь я хочу настроить Ruby Remote SDK для Rubymine, поэтому я установил 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 '[email protected]\s*required\s*[email protected] optional [email protected]' -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 → in flow эта ссылка 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: соединение закрыто удаленным хостом

Я выясню, что проблема связана с установкой в ​​файле 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.

Я думаю, проблема связана с настройкой рабочего каталога.


Я могу подключить SSH к контейнеру, удалив эту строку в файле docker-compose.yml

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

Итак, я думаю, что проблема связана с рельсами. Но я не знаю, как это исправить.

Ответ 1

Мне удалось использовать RubyMine для удаленных отладочных рельсов, работающих внутри докера, без использования SSH.

Версии программного обеспечения в моей среде следующие

  • RubyMine 2017.2.4 (Build # RM-172.4155.44, построенный 26 сентября 2017 года).
  • Ruby inside docker (ruby 2.4.2p198 (версия 2017-09-14 59899) [x86_64-linux])
  • Ruby SDK и драгоценные камни, используемые RubyMine (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. Шаги внутри докера

Убедитесь, что у вас есть следующие камни в Gemfile, и лучше прокомментировать gem pry-byebug, если он там, чтобы избежать возможных помех.

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

Обновите зависимости вашего приложения, если необходимо

bundle install

Запустите сервер рельсов.

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

3. Удаленная отладка с RubyMine

Теперь запустите RubyMine, запустите → Debug... → Edit Configurations...

Нажмите плюс знак "+", чтобы добавить новую конфигурацию, и выберите удаленный отладочный файл Ruby.

введите описание изображения здесь

Заполните форму, как показано выше, и нажмите кнопку "Отладка". Теперь вы увидите, что в докере запускается сервер 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 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, см. команду запуска докера)

Точка останова попадает, как показано ниже, где вы можете проверять переменные и т.д.

введите описание изображения здесь

Еще одно замечание, которое стоит упомянуть, заключается в том, что веб-сервер puma запускается в одном режиме. Для меня режим кластера не работает для удаленной отладки, где у вас будут такие ошибки, как "завершение времени ожидания рабочего". Для разработки один режим должен быть достаточно хорошим.

Ответ 2

Лучше всего я могу сказать вам отлаживать контейнеры Ruby/Rails без необходимости использования SSH с камнем ruby-debug-ide, который специально создан для удаленной отладки:

GEM: https://github.com/ruby-debug/ruby-debug-ide

КАК: http://bzzt.io/posts/running-the-rails-debugger-in-a-docker-container-using-rubymine

Вы также можете использовать этот файл Docker, который правильно настроит SSH, что позволит вам удаленно подключиться к вашему веб-контейнеру:

GitHub: https://github.com/zchee/docker-rubymine

Dockerfile: https://github.com/zchee/docker-rubymine/blob/master/Dockerfile