Отладка Node JS внутри Docker: основное руководство

Отладка Node JS внутри Docker: основное руководство

12 мая 2022 г.

Что такое отладчик?


Отладчик — лучший друг любого разработчика. Ошибки в программном обеспечении легко найти с помощью отладчика.


Можно добавить точку останова, чтобы приостановить выполнение. Во-вторых, можно также добавить логику к точке останова, чтобы остановить выполнение. В качестве примера рассмотрим цикл for с 1000 итераций. Выполнение должно прекратиться, когда количество итераций превысит 100. Для этого поставьте точку останова в цикле for. Затем добавьте логику для остановки выполнения, когда итерация превысит 100.


Помимо остановки программы, отладчики показывают распределение памяти. Например, остановка выполнения покажет потребление памяти в любой заданный момент.


Что такое удаленный отладчик?


Отладка обычно выполняется на локальном хосте. Выполнение этого удаленно называется удаленной отладкой :). То есть, если вы отлаживаете программное обеспечение, работающее на удаленном хосте, это называется удаленной отладкой. Это полезно по нескольким причинам.


Во-первых, можно отлаживать программное обеспечение локально. Рассмотрим сценарий, в котором программное обеспечение находится в облаке. Он может быть развернут либо для разработки, UAT, либо для производства. Теперь проблема возникает в облаке, но не на локальном хосте. В этом случае было бы конструктивно подключиться к облаку и привязать отладчик к процессу. Можно запустить программное обеспечение построчно, чтобы оценить проблему и исправить ее.


Во-вторых, удаленная отладка также полезна, когда программное обеспечение работает внутри контейнера. Допустим, внутри Docker запущен проект. Напрямую запустить проект и подключиться к нему через отладчик не получится. Вместо этого док-контейнер должен предоставлять свой порт контейнера. Во-вторых, удаленный отладчик нуждается в настройке для подключения проекта внутри контейнера докеров.


Docker помогает создавать переносимые контейнеры, которые можно быстро и легко развернуть на различных машинах. Эти контейнеры можно запускать локально на Windows, Mac и Linux. Кроме того, основные облачные системы, такие как AWS или Azure, поддерживают их по умолчанию. Если вы хотите узнать больше об основах Docker и вам нужна шпаргалка по Docker CLI, [здесь] (https://betterprogramming.pub/a-beginners-cheat-sheet-for-docker-f5024fd6c17f) есть вводная статья об этом .


В этой статье мы настроим проект NodeJS для запуска внутри док-контейнера. Мы также настроим удаленную отладку для проекта.


Если вам нравится эта статья, ознакомьтесь с другими такими же замечательными статьями в [мой профиль] (https://hackernoon.com/u/arjavdave).


Настройка проекта


Предпосылки


Прежде чем мы двинемся дальше, в системе должен быть установлен рабочий стол docker и VS Code. Кроме этого, никаких других требований нет.


Для поспешных я сделал исходный код доступным в виде репозитория. Вы можете проверить это [здесь] (https://github.com/shenanigan/docker-node-debug).


Создание файлов проекта


Мы собираемся создать очень простой экспресс-проект Node JS. Он просто вернет статическую строку JSON при открытии определенного URL-адреса. Для этого мы создадим файл с именем server.js, который является точкой входа в наш проект.


Создайте файл server.js со следующим содержимым:


const server = require("express")();


server.listen(3000, асинхронный () => {});


server.get("/node-app", асинхронный (_, ответ) => {


response.json({ "узел": "приложение" });


В файле server.js указано, что при открытии URL-адреса http://localhost:3000/node-app в браузере отображается {“node”: “app”}.


Во-вторых, нам понадобится файл package.json для настройки проекта и добавления зависимостей. Для этого создайте файл package.json со следующим содержимым:


"имя": "узел-приложение",


"зависимости": {


"экспресс": "^4.17.1"


Запустите команду npm install, чтобы установить зависимости локально. Это создаст node_modules в каталоге проекта.


Несмотря на то, что мы будем запускать проект внутри контейнера, необходимо установить зависимости. Это необходимо, поскольку мы будем сопоставлять наш текущий каталог проекта с каталогом проекта контейнера. Ниже объясняется, как это сделать.


Запуск в качестве контейнера Docker


Dockerfile необходим для запуска проекта в качестве контейнера докеров. Создайте Dockerfile со следующим содержимым:


Загрузите тонкую версию узла


С узла: 17-тонкий


Необходим для мониторинга любых изменений файла


ЗАПУСК npm install -g nodemon


Установите рабочий каталог в папку приложения.


Сюда мы будем копировать наш код


РАБОЧИЙКАТАЛОГ /узел


Скопировать все файлы из текущего каталога в контейнер


КОПИРОВАТЬ . .


Необходимо для производства. Проверьте комментарии ниже


ЗАПУСТИТЬ установку npm


Здесь проект настроен для работы в качестве простого сервера узлов без каких-либо точек останова. Контейнер будет запускать проект из каталога узла внутри контейнера. nodemon устанавливается глобально в контейнере. Это необходимо для наблюдения за любым изменением файла в каталоге. Это подробно объясняется ниже.


Команда RUN npm install необходима только при развертывании в рабочей среде. Мы сопоставим каталог /node нашего контейнера с текущим каталогом проекта на локальном хосте, используя Docker Compose (следующий раздел). Но когда приложение развернуто в контейнере, ему необходимо установить зависимости самостоятельно.


Докер игнорирует


Функция игнорирования Docker очень похожа на git ignore. .gitignore не отслеживает файлы или папки, упомянутые в нем. Точно так же мы не хотим копировать ненужные файлы в контейнер, который занимает место.


В нашем случае мы не хотим копировать папку node_modules в контейнер. Для этого создайте файл .dockerignore в каталоге проекта со следующим содержимым:


node_modules/


Создание докера


Docker Compose — это действительно полезный способ создавать и запускать контейнеры Docker с помощью одной команды. Это также полезно для одновременного запуска нескольких контейнеров. Это одна из причин, по которой мы используем docker compose вместо простого docker. Чтобы узнать больше о docker-compose и о том, как запускать несколько контейнеров, посетите статью Запуск нескольких контейнеров с помощью Docker Compose.


Теперь давайте создадим файл docker-compose.yml, чтобы добавить еще несколько конфигураций. Добавьте следующее содержимое в файл docker-compose.yml после его создания:


версия: '3.4'


Сервисы:


узел-приложение:


1. построить текущий каталог


строить: .


2. Запустите проект с помощью nodemon, для мониторинга изменений файлов


Запускаем отладчик на порту 9229


команда: nodemon --inspect=0.0.0.0:9229 /node/server.js 3000


тома:


3. Привяжите текущий каталог на локальной машине к /node внутри контейнера.


  • .:/узел

порты:


4. сопоставить порты 3000 и 9229 контейнера и хоста


  • "3000:3000"

  • "9229:9229"

Файл docker-compose.yml подробно описан ниже.


  1. Укажите на нашу текущую директорию для сборки проекта.

  1. Запускаем проект с помощью nodemon, так как в случае каких-либо изменений в локальной директории мы хотим перезапустить проект в докере с изменениями. Nodemon – это утилита, которая будет отслеживать любые изменения в вашем исходном коде и автоматически перезапускать ваш сервер.

  1. Привяжите наш текущий каталог к ​​каталогу /node, используя volumes.

  1. В дополнение к предоставлению и привязке порта 3000 для сервера, откройте порт 9229 для подключения отладчика.

Используйте указанный выше файл docker-compose.yml только для отладки.


Приведенный выше файл docker-compose.yml предоставляет порт отладки. Кроме того, он также отслеживает любые изменения файлов внутри контейнера (которые не произойдут). Наконец, он сопоставляет тома контейнера с каталогом проекта.


Для производства создайте новый файл docker-compose-prod.yml со следующим содержимым:


версия: '3.4'


Сервисы:


узел-приложение:


строить: .


команда: узел /узел/сервер.js 3000


порты:


  • "3000:3000"

Он просто запускает проект и открывает порт 3000. Мы используем несколько файлов компоновки докеров для управления отдельными средами. Ознакомьтесь с разделом «Запуск проекта» ниже, чтобы понять, как запустить проект на основе разных файлов компоновки docker.


Прежде чем мы сможем запустить проект, нам еще нужно настроить отладчик для подключения к контейнеру.


Настройка удаленного отладчика


Сначала проверьте, создан ли в вашем проекте файл launch.json. launch.json определяет различные типы конфигураций, которые мы можем запускать для отладки. Если он не создан, перейдите на вкладку «ЗАПУСК И ОТЛАДКА» слева в вашем коде VS, как показано на изображении ниже:


Вкладка ЗАПУСК И ОТЛАДКА


Нажмите на текст с надписью «Создайте файл launch.json». Прежде чем вы сможете продолжить, он спросит тип приложения для продолжения. Выберите Node.js. Он создаст новый файл launch.json в вашем проекте с добавленной конфигурацией Node.js по умолчанию.


Поскольку мы не собираемся запускать приложение узла локально, удалите эту конфигурацию. Вместо этого замените файл launch.json следующим содержимым:


"версия": "0.2.0",


"конфигурации": [


// 1. Тип приложения для прикрепления


"тип": "узел",


// 2. Тип запроса. В этом случае «прикрепить»


"запрос": "прикрепить",


// 3. Перезапускать отладчик каждый раз, когда он отключается


"перезагрузка": правда,


// 4. Порт для подключения


"порт": 9229,


// 5. Имя конфигурации


"name": "Docker: прикрепить к узлу",


// 6. Подключиться к каталогу /node докера


"remoteRoot": "/узел"


Добавленная конфигурация не требует пояснений. По сути, мы просим отладчик подключиться к удаленному хосту с номером порта 9229. Мы также просим перезапускать отладчик всякий раз, когда он отключается от хоста. По умолчанию отладчик пытается подключиться к http://localhost:9229/. Но проект размещен в каталоге /node в докере. Для отображения /node используется атрибут remoteRoot.


Запуск проекта


Вот об этом! Теперь, если вы запустите docker compose up, ваш проект запустится. При первом запуске он загрузит несколько слоев тонкого SDK узла, а затем установит nodemon внутри контейнера докеров. Но последующие запуски будут намного быстрее. Запуск docker compose up покажет следующий вывод в вашем терминале:


Докер-контейнер


Чтобы подключить отладчик, запустите задачу Docker: Присоединить к узлу на вкладке «ЗАПУСК И ОТЛАДКА». Теперь отладчик подключится к каталогу /node вашего контейнера Docker. Затем поставьте точку останова в строке 4 вашего файла server.js, то есть response.json({ “super”: “app1” });. Наконец, откройте браузер и нажмите «http://localhost:3000». Будет достигнута точка останова, и выполнение будет остановлено.


Для производства нам нужно использовать файл docker-compose-prod.yml. Для этого нам нужно указать имя файла в команде docker. Выполните следующую команду, чтобы запустить проект, как в производственной среде:


docker compose -f docker-compose-prod.yml вверх


С помощью приведенной выше команды отладчик не может быть присоединен к контейнеру, поскольку мы не открываем точку отладки.


Исходный код


Вот ссылка на окончательный исходный код созданного нами проекта.


Вывод


Отладка — одна из лучших вещей для разработки. Это вишенка на торте, когда мы можем отлаживать удаленно. Удаленная отладка позволяет нам подключаться к коду, работающему не только в облаке, но и к контейнеру Docker, работающему локально.


Надеюсь, вам понравилась эта статья. Не стесняйтесь проверить некоторые из моих других статей:


  • [Докер: введение и шпаргалка] (https://betterprogramming.pub/a-beginners-cheat-sheet-for-docker-f5024fd6c17f)

  • [Запуск нескольких контейнеров с помощью Docker Compose] (https://betterprogramming.pub/run-multiple-containers-with-docker-compose-9297957f7a3c)


Также опубликовано [здесь] (https://betterprogramming.pub/how-to-debug-node-js-inside-docker-8f9be8abdbb4)



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE