Подтвердить что ты не робот

Как отладить приложение Nodejs, запущенное внутри контейнера Docker через Google Cloud

Я нашел, что Google предоставляет некоторые рекомендации по как запускать Nodejs в пользовательской среде выполнения. Все кажется прекрасным, и мне удается запустить приложение Nodejs на локальной машине под управлением gcloud preview app run ..
Как я вижу, он, вероятно, создает контейнер Docker и запускает там программу Nodejs. Я говорю" возможно", потому что это мой первый опыт работы с Docker, однако я уже 2 года опытный разработчик Nodejs.

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

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

4b9b3361

Ответ 1

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

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

    node -debug --web-host 0.0.0.0 yourScript.js

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

Ответ 2

Есть более простой способ, по крайней мере, от Docker 0.11 или что-то в этом роде.

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

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

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

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

  • Запустите sshd внутри вашей машины Docker и настройте туннель ssh, как будто вы должны отлаживать удаленную машину.
  • "Mess up" с ip-таблицами, чтобы "вернуть" сопоставление Docker локальных портов. Здесь есть что-то в этом роде Предоставление порта в реальном контейнере Docker.

Ответ 3

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

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

Ответ 4

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

  • В главном контейнере node.js отобразите порт 5858 на хост
  • Запустите основной node процесс с включенной отладкой
  • Используйте отдельный контейнер для запуска node -inpector
  • Использовать сеть хоста для контейнера node -spector

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

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

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

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