Почему я не могу получить доступ к докеризованному npm с хоста - PullRequest
0 голосов
/ 18 октября 2018

Настройка - у меня есть простой сервер, работающий внутри контейнера докера.Dockerfile:

  web:
    image: my_web
    build:
      context: ./
      dockerfile: web.docker
    container_name: my_web
    networks:
      - front
    ports:
      - "4200:4200"
      - "4300:4300"
    volumes:
      - www:/var/www
      - wwwlogs:/var/www/storage/logs
    env_file:
      - ${SERVICE_ENVIRONMENT}.env

web.docker:

# start build from node:latest
FROM node:latest

MAINTAINER me <info@example.com>

# Install system-wide dependencies
RUN apt-get -yqq update

... some unimportant setup stuff ...

USER me

# expose port
EXPOSE 4200

WORKDIR /me

## Run server
CMD ["/bin/bash", "-c", "ng serve --proxy-config projects/my-ui/src/environments/proxy.conf-local.json --hmr"]

Это все работает.Подходит сервер

...
** Angular Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ **
...

И изнутри контейнера я могу поразить службу штрафом:

> docker exec -u 0 -it my_web /bin/bash
root@621da3c6697f:/me# curl localhost:4200
<!doctype html>
<html>
<head>
...

Однако снаружи контейнера (хост OSX) я получаю пустой ответ:

> curl localhost:4200
curl: (52) Empty reply from server

Не думаю, что это напрямую связано с сетью докеров.У меня есть другие службы API, настроенные нормально.Я также вошел в веб-контейнер и запустил простой веб-сервер с python:

me@621da3c6697f:/me# python -m SimpleHTTPServer 4300
Serving HTTP on 0.0.0.0 port 4300 ...

И я могу достичь этого штрафа с хоста:

> curl localhost:4300
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
<h2>Directory listing for /</h2>
<hr>
...

И сервер выплевываетстрока журнала доступа:

172.22.0.1 - - [18/Oct/2018 19:56:59] "GET / HTTP/1.1" 200 -

Я также все изменил, так что простой HTTP-сервер работает на порту 4200, но это не имеет значения.

Ядумая, что это как-то связано с тем, как npm привязывается к хосту (только слушает запросы к 127.0.0.1 или что-то подобное), но я не могу понять это на протяжении всей жизни.У кого-нибудь есть какие-либо советы по дальнейшей отладке или идеи по изменению способа привязки адресов npm?

--- Edit ---

Существует также разница между доступом к порту, когда на нем ничего не работает.С хоста:

> curl localhost:4000
curl: (7) Failed to connect to localhost port 4000: Connection refused
> curl localhost:4200
curl: (52) Empty reply from server

Таким образом, он определенно попадает во что-то привязанное к 4200, просто сервер отказывается выдавать какой-либо контент ...

1 Ответ

0 голосов
/ 18 октября 2018

ОК, разобрался - это то, как он привязывается к хосту.Некоторое время я искал и, наконец, наткнулся на это сообщение. Приложение nodejs не подключается к localhost при запуске в контейнере Docker

Короче говоря, укажите IP-адрес хоста для привязки кв строке ng serve:

--host 0.0.0.0

т.е.

CMD ["/bin/bash", "-c", "ng serve --host 0.0.0.0 --proxy-config projects/my-ui/src/environments/proxy.conf-local.json --hmr"]

Я думаю, вы, вероятно, можете установить это и в угловых конфигурационных файлах, но этого было достаточно, чтобы разблокировать меня на данный момент.

А теперь он отвечает на запросы от хоста:

> curl localhost:4200
<!doctype html>
<html>
<head>
...
...