"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте". (с) Мартин Голдинг
Отладка Node.js приложения в докер-контейнере
Получить ссылку
Facebook
X
Pinterest
Электронная почта
Другие приложения
В этой статье хочу рассказать как настроить отладку Node.js приложения работающего в Docker-контейнере. В большинстве случаев нет никакой проблемы, чтобы отладить приложение локально, но некоторые дефекты в работе приложения проявляются только будучи запущенными в рамках контейнера. В такой ситуации гораздо эффективнее и быстрее обнаружить и исправить проблему если подключить полноценный отладчик.
Весть процесс, с большего, состоит из 3-х шагов.
Надо изменить запуск Node.js, чтобы он работал с включенным режимом отладки.
Открыть доступ к порту, указанному при включении режима отладки в Node.js.
Настроить инструмент для отладки. Это может быть любая IDE. Многие разработчики пользуются VS Code, я им тоже пользуюсь, на его примере я и покажу в этой статье как это сделать.
Если тексту с картинками вы предпочитаете видео, то вот мой обзор отладки Node.js приложения в докер-контейнере на YouTube
Я этого примера создал простое Node.js приложение и докер-файл для него. Полный пример Node.js приложения и Dockerfile к нему можно посмотреть в репозитории на GitHub.
const express = require("express");
const app = new express();
app.get("/", function(req, res){
res.send("Hello, World!");
});
const PORT = 8080;
app.listen(PORT, function(){
console.log("Listening on port " + PORT);
});
app.js
FROM node:14-alpine
WORKDIR /node-app
COPY package.json .
RUN npm install
RUN mv /node-app/node_modules /node_modules
COPY . .
CMD [ "node", "app.js" ]
EXPOSE 8080
Dockerfile
Шаг 1. Запускаем NodeJS в режиме отладки
Первое что надо сделать - это запустить Node.js в докер-контейнере в режиме отладки. Делается это передачей ключа --inspect при старте Node (вот здесь можно почитать подробнее). В Dockerfile у нас уже есть инструкция по запуску Node и переопределить настройки запуска Nods в контейнере можно разными способами - например, параметрами команды docker container run или можно создать файл для docker-compose и там переопределить ряд параметров. Вариант с docker-compose мне кажется более удобным.
version: '3.4'
services:
nodeapp:
build: .
ports:
- 8080:8080
command: node --inspect=0.0.0.0:9229 app.js
docker-compose.yml (not finished)
Шаг 2. Открываем доступ к порту
Теперь, дополнительно к порту на котором работает приложение нам надо открыть доступ к порту через который работает инспектор. Для этого обновляем docker-compose файл, чтобы открыть доступ к порту 9229, который мы указали в параметрах инспектора.
Зачастую так же удобно переопределить и путь к коду Node.js приложения, чтобы можно было внести изменения в код и убедиться, что приложение работает так как ожидается. Финальная версия docker-compose файла так же находится в репозитории на GitHub.
version: '3.4'
services:
nodeapp:
build: .
ports:
- 8080:8080
- 9229:9229
volumes:
- .:/node-app
command: node --inspect=0.0.0.0:9229 app.js
docker-compose.yml (final)
Запускаем docker-compose с флагом --build :
docker-compose up --build
Шаг 3. Настраиваем VS Code и запускаем отладку
Теперь подключаем VS Code. Для этого надо добавить конфигурацию отладки в VS Code.
Для начала надо перейти на панель отладки в VS Code
Далее, если launch.json есть, то надо добавить новую конфигурацию,
Если launch.json еще не был создан, то его надо создать, кликнув на линку "create a launch.json file"
В появившемся списке шаблонов конфигураций можно выбрать "Node.js: Attach to Remote Program" а если такой нет, то любую и заменить ее на мой пример (файл на GitHub).
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}",
"name": "Attach to Remote",
"port": 9229,
"remoteRoot": "/node-app",
"request": "attach",
"skipFiles": [
"<node_internals>/**"
],
"type": "pwa-node"
}
На что здесь важно обратить внимание
address - IP-адрес машины где запущен докер-контейнер.
port - порт через который работает Node Inspector. Он должен быть такой же как мы указывали в ключе --inspect.
remoteRoot - путь в докер-контейнере, где находится код приложения.
Теперь можно запускать отладчик. Для этого нужно нажать кнопку "Start Debugging".
В коде приложения можно ставить точки останова (breakpoints), проверять значения переменных и полей объектов и пр.
Что можно сделать еще
Если пойти дальше и модифицировать немного Dockerfile можно с эпизодической отладки приложения перейти на полноценную разработку в Docker-контейнере. Это может быть удобно в случае когда надо разрабатывать и поддерживать приложения на разных версиях Node.js. Для этого нужно установить в docker-контейнер forever или любое другое приложение, которое будет перезапускать Node при изменении кода и соответственно у нас немного изменится команда для запуска приложения. Новый докер-файл (я его назвал Dockerfile.dev) и docker-compose.dev.yml будут выглядеть так.
В этой статье я хочу рассказать про пары команды docker save/load и docker export/import, показать примеры их использования и рассказать чем они отличаются. Да и как обычно, если тексту с картинками вы предпочитаете видео, то вот моя видео-инструкция на YouTube. Команды docker save и docker load Начнем с пары docker save/load. Эта пара команд работает с докер-имиджами. Команда docker save сохраняет имидж с локальной машины в tar-архив. Этот архив содержит всю необходимую информацию, чтобы потом восстановить докер-имидж. Восстановление докер-имиджа из tar-архива производится командой docker load. Теперь посмотрим на примере как это делается. У меня локально есть докер-имидж “alpine”. Чтобы сохранить его как tar-архив воспользуемся командой docker save alpine -o alpine-image.tar Обратите внимание, на ключ “-o“. Он позволяет указать имя файла, в который надо сохранить докер-имидж. Теперь я удалю этот имидж из системы командой docker image rm alpine Как в...
Зачастую разработчики воспринимают докер-контейнер как некий «черный ящик». Они знают как его запустить и минимально, как с ним работать. Но порой возникает необходимость посмотреть на файлы внутри докер-контейнера, создать какой-то файл или директорию, что-то поменять. Для этого есть команда “ docker container exec ”/” docker exec ” которая позволяет подключиться к запущенному контейнеру и выполнить некую команду. Вот как можно подключиться к контейнеру и запустить, скажем, bash docker container exec -it <container_ID> bash Команды “ it ” знакомы нам по предыдущему посту . “ container_ID ” – это ID контейнера, который возвращает команда " docker container run "/" docker run ". Причем нет необходимости вводить весь ID, достаточно и пары первых символов. Картинка стоит тысячи слов 😊. Для примера, посмотрите на скриншот окна, где я запускаю докер-контейнер. Команда “ docker run -d nginx ” вернула мне вот какой ID “ e7fce43aec7ae04e081656f8350008e0f97fd4829...
Я регулярно пользуюсь утилитами Sysinternals и хочу поделиться одним из cпособов как при помощи Process Explorer выяснить какой процесс заблокировал доступ к файлу или папке. Использовать утилиты очень удобно – они бесплатны, не требуют инсталляции и могут быть запущены без предварительного скачивания из интернета (см http://live.sysinternals.com/ ). Последние 2 пункта делают их очень удобными при анализе и устранении проблем на серверах. Я недавно завел Ютуб-канал, где выкладываю видео по теме блога. Приглашаю Вас посмотреть и подписаться что бы не пропустить новые выпуски. Итак, как же узнать, кто держит тот или иной файл или папку. Для скриншотов я смоделировал такую ситуацию нарочно, открыв в Word файл "D:\temp\Doc1.docx" и пытаясь его в это же время удалить в проводнике. При попытке удалить файл получаю следующее сообщение Поищем этот документ в Process Explorer: Find->Find Handle or DLL… В появившемся окне вводим имя заблокированного файла и жмем Search Двойной к...
Комментарии