Почему Chrome не может проверять код nodejs в контейнере Docker?

Я пытаюсь запустить простой сервер nodejs внутри контейнера Docker и отлаживать его с помощью chrome://inspect или WebStorm. Порт отладки 9229 привязан, но проверка не работает. С другой стороны, когда я запускаю тот же код без докера, я могу проверить его как в chrome://inspect, так и в WebStorm.

Может ли кто-нибудь объяснить мне, почему Chrome не может проверять код nodejs в контейнере Docker???

Файл Docker

FROM node:8.2.1-alpine

WORKDIR /code

COPY package.json /code/package.json
RUN npm install && npm ls
RUN mv /code/node_modules /node_modules

COPY . /code

EXPOSE 8000
EXPOSE 9229

CMD ["npm", "run", "start"]

alexey@home:~/app$ docker run -p 9229:9229 -p 8000:8000 node-dev

npm info it worked if it ends with ok 
npm info using [email protected]  
npm info using [email protected]  
npm info lifecycle @~prestart: @  
npm info lifecycle @~start: @

> @ start /code
> node --inspect app

Debugger listening on ws://127.0.0.1:9229/5b225f7d-0e18-4ded-894b-a7993bb7da64 
For help see https://nodejs.org/en/docs/inspector 
HTTP server listening on port 8000

person alexey2baranov    schedule 18.02.2018    source источник
comment
Вам нужно заставить отладчик слушать 0.0.0.0. В настоящее время он прослушивает 127.0.0.1, который доступен только из контейнера (а не с вашего хоста).   -  person johnharris85    schedule 18.02.2018
comment
@johnharris85 спасибо за ответ. это работает сейчас. Я хотел бы понять, почему не работало с 127.0.0.1. Насколько я понимаю, -p 9229:9229 связать внутренний порт докера с портом хоста, который доступен за пределами докера, не так ли?   -  person alexey2baranov    schedule 20.02.2018
comment
«Внутренний порт Docker» на самом деле не является концепцией. Docker создает интерфейс veth внутри контейнера и перенаправляет на него трафик с помощью моста с хоста. Если вы сделаете ifconfig внутри своего контейнера, вы увидите несколько интерфейсов. Docker, скорее всего, начнется с 172.xxxxx. Вы можете выполнить привязку к этому (и это будет работать нормально), но это нецелесообразно, поскольку по большей части мы не знаем заранее, что это будет, поэтому привязка к 0.0.0.0 решает проблему. 127.0.0.1 — это петля только для контейнера.   -  person johnharris85    schedule 20.02.2018
comment
@johnharris85 очень большое спасибо друг   -  person alexey2baranov    schedule 21.02.2018
comment
@alexey2baranov пожалуйста, напишите точное решение. Я не могу воспроизвести это. Я понимаю: только привязка 0.0.0.0 порта отладки делает возможным доступ к chrome devtools. Но как подробно?   -  person Gerd    schedule 24.04.2018
comment
@Gerd я сделал это очень-очень давно. Я помню, что 0.0.0.0 решил только мою проблему. Это все, что я могу вспомнить сегодня.   -  person alexey2baranov    schedule 26.04.2018
comment
Это работает для меня, но когда код работает, он не попадает в точку отладки, как я могу попасть в точку отладки?   -  person Anton James    schedule 14.07.2018


Ответы (3)


в вашем package.json scripts:

"debug": "nodemon --inspect=0.0.0.0:9229 index.js",

в вашем docker-compose.yaml:

services:
  service_name:
    command: npm run debug
    ports:
      - 9229:9229

Я не уверен на 100% в этом, но я думаю, что сопоставление отладчика для работы на 0.0.0.0 открывает доступ к вашей локальной сети, а это означает, что любой может подключиться к IP-адресу вашей машины через порт 9229 и сможет отлаживать ваш сервер nodejs. Остерегайтесь, что ваш сервер nodejs имеет доступ к файловой системе. Так что никогда не запускайте производственные (или разрабатываемые) серверы с этим.

person Hoffmann    schedule 26.09.2018
comment
Это сработало для меня без EXPOSE 9229 в моем Dockerfile. - person Mitchell Simoens; 24.10.2018
comment
@MitchellSimoens да, вы правы, эта часть не нужна. я отредактирую свой ответ - person Hoffmann; 02.11.2018
comment
В моем случае он все еще не работал. Чтобы ее решить, мне пришлось добавить 127.0.0.1:9229 в chrome://inspect -> Настройки обнаружения цели. По какой-то неясной причине localhost:9229 было недостаточно. И точно так же, как ответ @Gerd, мне также пришлось использовать другой порт внутри докера. - person Martin P.; 31.10.2019

Вам нужно node --inspect 0.0.0.0:8000 в контейнере. Порт контейнера 8000 сопоставляется с портом хоста 9229. Поэтому вы должны использовать localhost:9229 для подключения chrome-dev-tools к node-debugger в контейнере.

Подробности https://nodejs.org/en/docs/guides/debugging-getting-started/

person Gerd    schedule 27.04.2018
comment
Я использовал node --inspect 0.0.0.0:9229 в контейнере. - person engineforce; 07.11.2018

Вместо этого внутри контейнера докера запустите приложение как:

узел --inspect=0.0.0.0 app.js

*с постфиксом =0.0.0.0

person IvanM    schedule 19.12.2020