UnhandledPromiseRejectionWarning: Error: getaddrinfo ENOTFOUND in nodejs running on docker-swarm

UnhandledPromiseRejectionWarning: Error: getaddrinfo ENOTFOUND in nodejs running on docker-swarm

您可以在下面的 docker-compose.yml 文件中找到,该文件托管在 Docker-Swarm 模式下的 Portainer Stack 中。容器在 Portainer 中 运行 正常,但看起来 lamp-服务器无法与 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

有什么解决这个问题的想法吗?

您的服务器服务在public网络中,看不到其他服务。您可以通过简单地添加一个专用网络来解决这个问题:

networks:
  private:
  public:
    external: true

并在其他服务中使用:

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