Предупреждение о необработанном promiserejectionwarning: Ошибка: getaddrinfo НЕ НАЙДЕН в nodejs, запущенных в docker-swarm

#docker-compose #docker-swarm #portainer

#docker-compose #docker-swarm #portainer

Вопрос:

Как вы можете найти ниже из файла docker-compose.yml, который размещен в стеке Portainer в режиме Docker-Swarm. Контейнеры в 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
 

Есть идеи, как решить эту проблему?

Ответ №1:

Ваша серверная служба находится в общедоступной сети и не может видеть другие службы. Вы можете исправить это, просто добавив частную сеть, например:

 networks:
  private:
  public:
    external: true
 

И использовать его в других службах:

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

Комментарии:

1. Большое спасибо за ваше предложение. Я пытался внести эти изменения, пожалуйста, смотрите Здесь pastebin.com/65xMK9wF но я все еще получаю следующую ошибку (узел: 1) с предупреждением о необработанном promiserejectionwarning: Ошибка: getaddrinfo НЕ НАЙДЕН кэш в GetAddrInfoReqWrap.onlookup [как завершенный] (dns.js:67:26)

2. Получаете ли вы его после полной очистки и полного перезапуска?

3. Ваше право. Я сделал серверную сеть частной и общедоступной, и теперь ошибка исчезла. Большое вам спасибо, есть ли место, где я могу узнать об этих сетях, например, официальную документацию docker?

4. Тогда, пожалуйста, примите ответ. Вы можете попробовать katacoda katacoda.com/courses/docker-orchestration На github есть много курсов и лабораторий udemy, если вы поищете. Удачи!