Ошибка «ECONNREFUSED» после размещения Node.js (Express) - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть node.js, играющий роль "обратного прокси-сервера", который скрывает главный сервер (приложение).

До того, как я поместил в контейнер, все работало нормально, но я получаю сообщение об ошибке, пока npm install в Docker -reason: connect ECONNREFUSED 127.0.0.1:8080

Похоже, ENV HTTP_PROXY "http://1270.0.1:8080" не работает.

Что может вызвать проблему? + Как я могу это исправить?

Dockerfile in для Node.js - команда запуска: docker build -t saml-enabled-reverse-proxy .;docker run -it -p 8446:8446 saml-enabled-reverse-proxy bash

FROM node:12.10.0

ENV HTTP_PROXY "http://127.0.0.1:8080"
ENV HTTPS_PROXY "https://127.0.0.1:8080"

# Create app directory

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

# RUN npm config set proxy http://127.0.0.1:8080
# RUN npm config set https-proxy http://127.0.0.1:8080
RUN npm config set proxy null
RUN npm config set https-proxy null
RUN npm config set registry https://registry.npmjs.org
RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

COPY . .

EXPOSE 8080
EXPOSE 8446
CMD [ "node", "src/index.js" ]

Порт приложения 8080 Dockerfile - приложение (скрытое обратным прокси-сервером)

FROM ubuntu:16.04
...

ENV HTTP_PROXY "http://127.0.0.1:8446"
ENV HTTPS_PROXY "https://127.0.0.1:8446"

1 Ответ

1 голос
/ 25 сентября 2019

Проблема
С точки зрения контейнера, 127.0.0.1 является IP-адресом самого себя - не хост-ОС .Это означает, что вы не должны устанавливать 127.0.0.1:8080 как HTTP_PROXY и HTTPS_PROXY, потому что ваш контейнер будет вызывать сам себя, чтобы он не достигал Интернета.Вот почему ваш npm install не работает.

Аналогично, ваше основное приложение за прокси-сервером node.js не должно использовать

...
ENV HTTP_PROXY "http://127.0.0.1:8446"
ENV HTTPS_PROXY "https://127.0.0.1:8446"
...

, потому что это будет вызывать себя в порту8446, а не 8446 хост-ОС (которую вы намеревались направить в другой контейнер, на котором работает прокси-сервер node.js, но это никогда не будет работать).

Решение
Вы должны использовать что-то вроде docker compose или docker swarm, чтобы связать сеть двух контейнеров.Обратитесь к следующему примеру docker-compose.yml:

version: "3.7"

services:
  proxy:
    image: myproxy
    port:
      - 8080:8080

  app:
    image: myapp

Кроме того, удалите следующие строки из dockerfile прокси-сервера и перестройте образ.

ENV HTTP_PROXY "http://127.0.0.1:8080"
ENV HTTPS_PROXY "https://127.0.0.1:8080"

Аналогичным образом измените файл docker основного приложения изэто

ENV HTTP_PROXY "http://127.0.0.1:8446"
ENV HTTPS_PROXY "https://127.0.0.1:8446"

до

ENV HTTP_PROXY "http://proxy:8446"
ENV HTTPS_PROXY "https://proxy:8446"

Теперь запустите docker-compose up с этой конфигурацией, и ваш основной app сможет достичь proxy контейнера по имени хоста proxy вместо 127.0.0.1.Это означает, что вы будете использовать proxy:8080 для использования прокси-сервера, работающего на порте 8080.

PS: вы можете маршрутизировать контейнеры / службы Docker через их имя службы, поскольку у Docker есть механизм обнаружения служб, который он поддерживает.внутренне, и это будет динамически разрешать IP-адрес этих соединений.Это важно для контейнеров, потому что контейнеры могут быть уничтожены и воссозданы в любое время, что означает, что IP-адреса могут измениться в любое время.Для решения этой проблемы docker поддерживает хранилище значений ключей, которое сопоставляет имена служб / хостов с IP-адресами этих контейнеров и разрешает их для контейнеров, которые пытаются связаться с другими контейнерами.Обязательно измените все IP-адреса в вашем приложении, чтобы использовать имена хостов / сервисов вместо статических IP-адресов, если они должны перенаправляться на другие контейнеры / сервисы Docker.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...