簡體   English   中英

容器 Node.js (Express) 后出現“ECONNREFUSED”錯誤

[英]“ECONNREFUSED” error after containering Node.js (Express)

我有 node.js 扮演隱藏主服務器(應用程序)的“反向代理”的角色。

在我容器化之前它工作得很好,但是當npm install在 Docker 中時它給我一個錯誤 - reason: connect ECONNREFUSED 127.0.0.1:8080

似乎 ENV HTTP_PROXY " http://1270.0.1:8080 " 不起作用。

什么可能導致問題? + 我怎么可能解決這個問題?

Dockerfile in for Node.js - Run command: 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" ]

應用程序 Dockerfile 端口 8080 - 應用程序(被反向代理隱藏)

FROM ubuntu:16.04
...

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

問題
從容器的角度來看, 127.0.0.1是其自身的 ip 地址 -而不是主機 OS 這意味着您不應將127.0.0.1:8080設置為HTTP_PROXYHTTPS_PROXY ,因為您的容器會調用自身,因此無法訪問 Internet。 這就是為什么您的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"

同樣,從這里更改主應用程序 dockerfile

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而不是127.0.0.1訪問proxy容器。 這意味着您將使用proxy:8080來使用在端口 8080 上運行的代理。

PS:您可以通過服務名稱路由到 docker 容器/服務,因為 docker 具有內部維護的服務發現機制,它將動態解析 ip 的這些容器地址。 這對容器至關重要,因為容器可以隨時銷毀和重新創建,這意味着 IP 地址可以隨時更改。 為了解決這個問題,docker 維護一個鍵值存儲,它將服務/主機名映射到這些容器的 IP 地址,並為試圖訪問其他容器的容器解析它們。 Make sure to change all the IP addresses within your app to use host/service names instead of static IP addresses if they should route to other docker containers/services.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM