Ответ 1
Мне удалось запустить его. Мне хотелось бы запустить node -инспектор в качестве контейнера sidekick, он будет настолько чистым (EDIT: возможно, см. Конец ответа). К сожалению, глядя в источники node -inpector, невозможно запустить node -инспектор удаленно (потому что node -инспектор должен получить доступ к файлам, чтобы он мог их отображать), поэтому даже соединение с контейнером выходит из окна. Возможно, в какой-то момент он будет поддерживать его.
Вот мое решение:
В Dockerfile установите node -инспектор. Я решил сделать его глобальным, поэтому я могу использовать один и тот же контейнер для отладки всех моих приложений.
RUN npm install -g node-inspector
Вместо обеда node в команде CMD
используйте bash script, который позволит вам запустить более одного процесса. Это не способ Докера, но, как я уже сказал, ограничение в node -inpector не позволяет нам использовать контейнер sidekick. Вы также можете использовать более надежное решение для управления процессами, например supervisor, но для отладки простого script достаточно, на мой взгляд.
CMD ["/bin/bash", "start.sh"]
Этот script проверяет наличие переменной среды DEBUG
для запуска node и включает отладку.
#!/bin/bash
if [ -z ${DEBUG+x} ]; then
node server.js
else
node-inspector --web-port 9080 &
node --debug server.js
fi
Думаю, вы могли бы использовать тот же трюк для установки или не node -инспектор. У вас даже может быть условный оператор в команде RUN, если вы хотите пропустить script для установки.
Затем, когда вы хотите отладить контейнер, запустите его так:
docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \
-v /home/docker/sources/.../:/usr/src/app custom-node
Теперь вам просто нужно нажать на daemon ip-dock для отладки, так как мы выставили порт отладки, указанный в script (9080) в команде docker run
. Мой Dockerfile уже предоставляет мой основной порт, поэтому я использовал -P
для этого.
Если ваш контейнер работает на локальной виртуальной машине и вы устанавливаете за прокси-сервер, убедитесь, что он поддерживает локальные адреса или отключает его перед отладкой.
EDIT: теперь работает с контейнером sidekick
Вот содержимое моего контейнера node -debug Dockerfile
FROM node:4.2.1
EXPOSE 9080
RUN npm install -g node-inspector
CMD ["node-inspector", "--web-port", "9080"]
Docker предоставляет нам 2 функции, чтобы сделать так, как будто node -инспектор запускался локально с процессом node.
-
Несмотря на то, что node -инспектор подразумевает, что вы можете подключиться к удаленному компьютеру, сообщив вам подключиться к
127.0.0.1:8080/?ws=127.0.0.1&port=5858
, я не смог найти код, который анализировал параметрws
, поэтому я использовал docker net config, чтобы поместить контейнер node -debug в тот же сетевой стек, что и мой отлаженный процесс:--net=container:mysvc
. Таким образом, node -инспектор может открыть соединение с websocketto localhost:5858
. -
Используя ту же точку монтирования, что и ваш отладочный процесс, вы можете подделать локальность файла в процесс node -indpector.
Теперь, чтобы сделать его немного более удобным, я бы предложил использовать контейнер данных для ваших источников приложений.
Если вы хотите запустить node в отладке или нет, продолжайте использовать start.sh script (удалите команду инспектора node, хотя). Интересно, можем ли мы использовать сигнал с докером, хотя это полностью устранит зависимость от start.sh.
if [ -z ${DEBUG+x} ]; then
node server.js
else
node --debug server.js
fi
Создайте контейнер данных:
docker create -v /home/docker/sources/.../:/usr/src/app \
--name my_service-src custom-node /bin/true
Запустите приложение node и откройте node -spectoror debug port:
docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \
--volumes-from my_service-src custom-node
Запустить node -debug container:
docker run -d --net=container:my_service --volumes-from my_service-src \
--name node-debug node-debug
Таким образом, вы можете быстро создать контейнер node -debug на лету, чтобы отладить процесс node.
Подключитесь к docker ip и наслаждайтесь сеансом отладки!