首页 > 解决方案 > UnhandledPromiseRejectionWarning:错误:在 docker-swarm 上运行的 nodejs 中的 getaddrinfo ENOTFOUND

问题描述

正如您可以从 docker-compose.yml 文件中找到的那样,该文件托管在 Docker-Swarm 模式下的 Portainer Stack 中。容器在 Portainer 中运行良好,但看起来灯服务器无法与 Redis 通信并引发以下错误:

(node:1) UnhandledPromiseRejectionWarning: Error: getaddrinfo ENOTFOUND cache
      at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26)

这是我的配置:

在此处输入图像描述

version: '3.7'
services:
  server:
    image: 'bidmcdigitalpsychiatry/lamp-server:latest'
    environment:
      - HTTPS=off
      - SCHEDULER=on
      - ROOT_KEY=xxxx
      - CDB=http://admin:xxxx@database:5984/  
      - PUSH_API_GATEWAY=xxxx
      - PUSH_API_KEY=xxxx   
      - REDIS_HOST=redis://cache:6379/0
      - NATS_SERVER=message_queue:4222
    networks:
      - public
    deploy:
      mode: replicated
      labels:
        traefik.enable: 'true'
        traefik.http.routers.lamp_server.entryPoints: 'websecure'
        traefik.http.routers.lamp_server.rule: 'Host(`api.example.com`)'
        traefik.http.routers.lamp_server.tls.certresolver: 'default'
        traefik.http.services.lamp_server.loadbalancer.server.port: 3000
      placement:
        constraints:
          - node.role == manager
  database:
    image: apache/couchdb:latest
    volumes:
      - /home/azureuser/data/couchdb:/opt/couchdb/data
    networks:
      - public
    environment:
       - COUCHDB_USER=admin
       - COUCHDB_PASSWORD=xxxxx
    deploy:
      mode: replicated
      labels:
        traefik.enable: 'true'
        traefik.http.routers.lamp_db.entryPoints: 'websecure'
        traefik.http.routers.lamp_db.rule: 'Host(`db.example.com`)'
        traefik.http.routers.lamp_db.tls.certresolver: 'default'
        traefik.http.services.lamp_db.loadbalancer.server.port: 5984
      placement:
        constraints:
          - node.role == manager
  cache:
    image: redis:6.0.8-alpine
    healthcheck:
      test: redis-cli ping
    deploy:
      mode: replicated
      update_config:
        order: stop-first
        failure_action: rollback
      placement:
        constraints:
          - node.role == manager
  message_queue:
    image: nats:2.1.9-alpine3.12
    healthcheck:
      test: wget --no-verbose --tries=1 --spider http://localhost:8222/varz || exit 1
    deploy:
      mode: replicated
      update_config:
        order: start-first
        failure_action: rollback
      placement:
        constraints:
          - node.role == manager
networks:
  public:
    external: true

任何想法如何解决这个问题?

标签: docker-composedocker-swarmportainer

解决方案


你的服务器服务在公网,看不到其他服务。您可以通过简单地添加专用网络来解决此问题,例如:

networks:
  private:
  public:
    external: true

并在其他服务中使用它:

services:
  server:
    ...
    networks:
    - private
    - public
  cache:
    ...
    networks:
    - private
  ...

推荐阅读