2015-02-14 3 views
21

Я нашел, что Google предоставляет некоторые рекомендации по how to run Nodejs on a custom runtime environment. Все кажется прекрасным, и мне удается запустить приложение Nodejs на локальной машине, работающей gcloud preview app run ..
Как я вижу, это возможно создает контейнер Docker и запускает там программу Nodejs. Я говорю «возможно», потому что это мой первый опыт работы с Docker, однако я уже более 2 лет опытный разработчик Nodejs.Как отладить приложение Nodejs, запущенное внутри контейнера Docker через Google Cloud

Так что мой вопрос: Как отлаживать (с остановкой точки останова) моя программа Nodejs, когда она запущена внутри контейнера Docker? Использование инструментов разработчика Chrome или как настроить конфигурацию отладки Webstorm, чтобы остановить ее на контрольных точках. Можно ли настроить Docker на то, как он запускает узел или даже запускает Docker через gcloud внутри Webstorm, чтобы гарантировать, что отладка работает? Любая помощь или разъяснения приветствуются.

Пожалуйста, не сообщайте о том, как отлаживать приложение Nodejs за пределами контейнера Docker. Я знаю, как это сделать.

ответ

11

Мне очень жаль, но я знаю только решение с узлом-инспектор, я надеюсь, что это может помочь вам:

  • Вы можете установить пакет узла инспектор внутри контейнера: https://github.com/node-inspector/node-inspector
  • на карте порт 8080 вашего контейнера на хосте (запустить вам контейнер с параметром -p 8080: 8080)
  • выполнить это внутри контейнера (с докер ехес или докер войти)

    узла отладки --web-хост 0.0.0.0 yourScript.js

  • http://localhost:8080/debug?port=5858 Перейти к

+1

Подтверждение того, что я смог запустить сеанс отладки в хроме, используя Docker для Mac, используя 5858: 5858 в разделе портов моей докеры. Использование режима сетевой док-станции по умолчанию. Не нужно --net = host, SSH forwarding или любые другие трюки. Это Докер, как он должен быть (изолирован). Кроме того, '--web-host 0.0.0.0', который не упоминается повсюду, был недостающей частью моей конфигурации. Без запуска отладки узла, но ничто не может подключиться к нему извне (соединение отклонено). С его помощью «он просто работает» –

+0

Существует довольно длительное время задержки между запуском узла-инспектора и загрузкой файлов в исходный код браузера. Любая идея, почему это так? – Jeremy

+0

Узел-отладка устарела, см. Https://github.com/node-inspector/node-inspector – Gerd

8

Существует простой способ, по крайней мере, от Докер 0,11 или что-то.

Запуск, только на вашей машине для разработки, Докер с --net = "host". Это заставляет Docker напрямую связываться с локальным хостом и не создавать мостовой сетевой адаптер, поэтому машина Docker работает как любой другой процесс на вашем компьютере и открывает необходимые ему порты в локальном интерфейсе.

Таким образом, вы можете подключиться к порту отладки, как если бы Node не выполнялся внутри Docker.

Дополнительная документация здесь: https://docs.docker.com/reference/run/

Перед Докер 0.11 у вас есть другие два способа отладки, помимо использования узла-инспектор:

  • Run Sshd внутри машины Докер и настроить учётную SSH туннеля, а если вы хотите отлаживать удаленный компьютер.
  • «Mess up» с ip-таблицами, чтобы «вернуть» сопоставление локальных портов Docker. Здесь есть что-то здесь Exposing a port on a live Docker container.
0

Насколько я могу судить, вам необходимо указать параметр -debug-brk = to node при запуске - это позволит отлаживать. После этого зайдите в указанный порт в контейнере докера.Вам, вероятно, придется разоблачить его или туннель (используя ssh).

После этого укажите удаленный отладчик Webstorm на указанном порту, и вы должны быть установлены.

0

Если вы используете мост сети для контейнеров, и вы не хотите, чтобы установить узел-инспектор в том же контейнере, процесс вашего узла, я обнаружил, что это удобное решение:

  • в главном Node.js контейнере, карта порт 5858 на хост
  • Run основной процесс отладки узел с поддержкой
  • Используйте отдельный контейнер для запуска узла-инспектор
  • Использование хост-сети для контейнера узла инспектор

Скажем, контейнер-узел-инспектор будет подключаться к локальному хосту: 5858, который затем будет перенаправлен в порт основного контейнера.

Если вы используете это на общедоступном VM, я тогда рекомендую:

  • Убедитесь, что порт 5900 не подвергается публично (например, с помощью брандмауэра)
  • Убедитесь, что узел инспектор порта (например, 8080) нас подвергаются публично, так что вы можете подключиться к нему

Я написал несколько более подробно об этом здесь: https://keylocation.sg/our-tech/debugging-nodejs-in-docker-using-node-inspector

Смежные вопросы