如何将 Node.js 应用连接到来自 docker 服务的 http rest API?

How to connect a Node.js app to an http rest API from a docker service?

Node.js 中的一个网络应用程序连接到一个 api 的 axios。

import axios from 'axios'

export function fetchList() {
  return axios.get('https://api.website.dev/v1/posts')
}

api运行良好,一切正常。


现在,我使用 docker-compose 到 运行 容器内完全相同的 nodejs 网络应用程序。

docker-compose.yml:

版本:“3.1”

服务:

  nodejs:
    image: node:alpine
    working_dir: /home/app
    restart: always
    ports:
      - "8000:8080"
    volumes:
      - ../nodejs:/home/app
    command: ["npm", "start"]

对Rest的axios调用APIreturns报错:

error { Error: getaddrinfo EAI_AGAIN api.domain.dev:443
  at Object.exports._errnoException (util.js:1024:11)
  at errnoException (dns.js:55:15)
  at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:92:26)
code: 'EAI_AGAIN',
errno: 'EAI_AGAIN',
syscall: 'getaddrinfo',
hostname: 'api.domain.dev',
host: 'api.domain.dev',
port: 443,
config:
 { adapter
…

如何让 nodejs 应用程序从 docker 容器连接到 api?

docker 集群内的 Dns 服务器不知道主机的任何信息 api.website.dev

您可以明确设置此主机的IP地址。尝试将 extra_hosts 添加到 docker-compose.yml

中的服务定义
nodejs:
    image: node:alpine
    working_dir: /home/app
    restart: always
    ports:
      - "8000:8080"
    volumes:
      - ../nodejs:/home/app
    command: ["npm", "start"]
    extra_hosts:
      - "api.website.dev:<IP_ADDRESS>

或者,如果您有了解 website.dev 的外部 DNS 服务器,您可以按照 here

所述将其添加到 docker 集群