docker-compose - 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
任何想法如何解决这个问题?
解决方案
你的服务器服务在公网,看不到其他服务。您可以通过简单地添加专用网络来解决此问题,例如:
networks:
private:
public:
external: true
并在其他服务中使用它:
services:
server:
...
networks:
- private
- public
cache:
...
networks:
- private
...
推荐阅读
- ios - 我们如何将数据写入firebase实时数据库?即使启用了读/写,似乎也不起作用
- python - 如何使用 django python 将格子连接到条纹
- amazon-web-services - AWS 使用负载均衡器设置 DNS
- swift - NSCollectionView:如何防止右键选择?
- react-native - (Android) 有没有办法在 App 不运行时从 HeadlessJS React Native 启动 App?
- javascript - 在 html div 中显示函数的结果
- google-analytics - 谷歌标签管理器、Cookiebot 和谷歌分析:在标签中从“页面视图”切换到“窗口加载”跟踪类型的后果是什么?
- asp.net-core - 在 Razor 视图中填充 selectlistitem 时同步等待 NULL 引用异常
- java - 读取超过 9 万条记录的 excel 文件时出现内存不足异常
- mysql - 如何在mysql中使用union合并同一张表