与Docker Compose (connect ECONNREFUSED)的弹性搜索连接被拒绝 &



我一直在尝试运行多个服务(redis,前端,后端和弹性搜索),但我无法连接到弹性搜索服务。我甚至尝试为这项服务提供一个静态ip。(网络部分目前在docker文件中被注释掉了)。我试着改变图像,但它仍然不工作。

当我使用curl localhost:9200/_cat/health在本地测试ES时,因为我已经在本地映射了容器端口,它给我的集群是绿色的。我可以毫无问题地连接到其他服务,比如redis。与redis一样,我使用服务名称elasticsearch将其连接到后端服务。以下是我的docker-compose。yml文件。

version: '3'
services:
arc-external:
image: arc-external
build:
context: ./arc-development-branch/arc-external
ports:
- '4201:4201'
# networks: 
#   - vpcbr
redis:
image: redis:3.2.11-alpine
ports:
- '6379:6379'
# networks: 
#   - vpcbr
elasticsearch:
image: elasticsearch:2
ports:
- '9200:9200'
- '9300:9300'   
environment:
- node.name=elasticsearch
- cluster.name=datasearch
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- cluster.initial_master_nodes=elasticsearch
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/elastic:/usr/share/elasticsearch/data
# networks: 
#   vpcbr:
#     ipv4_address: 10.5.0.4
api-external:
image: api-external
build: .
ports:
- '3001:3001'
depends_on:
- redis
- elasticsearch
# networks: 
#   - vpcbr
# networks:
#   vpcbr:
#     driver: bridge
#     ipam:
#      config:
#        - subnet: 10.5.0.0/16
#          gateway: 10.5.0.1

这是我在运行docker composition -up

时得到的确切错误
api-external_1   | 2021-03-09 20:41:46.3253 - info: Finished setting up log directories
api-external_1   | 2021-03-09 20:41:46.3514 - info: Connection successful to mongodb @ mongodb://10.0.0.44:27017/arc
api-external_1   | 2021-03-09 20:41:46.3764 - info: Connection successful to redis at: host: redis port: 6379
api-external_1   | Elasticsearch ERROR: 2021-03-09T20:41:46Z
api-external_1   |   Error: Request error, retrying
api-external_1   |   HEAD http://elasticsearch:9200/ => connect ECONNREFUSED 172.24.0.4:9200
api-external_1   |       at Log.error (/usr/src/app/api-external/node_modules/elasticsearch/src/lib/log.js:226:56)
api-external_1   |       at checkRespForFailure (/usr/src/app/api-external/node_modules/elasticsearch/src/lib/transport.js:259:18)
api-external_1   |       at HttpConnector.<anonymous> (/usr/src/app/api-external/node_modules/elasticsearch/src/lib/connectors/http.js:164:7)
api-external_1   |       at ClientRequest.wrapper (/usr/src/app/api-external/node_modules/lodash/lodash.js:4935:19)
api-external_1   |       at ClientRequest.emit (events.js:198:13)
api-external_1   |       at ClientRequest.EventEmitter.emit (domain.js:448:20)
api-external_1   |       at Socket.socketErrorListener (_http_client.js:401:9)
api-external_1   |       at Socket.emit (events.js:198:13)
api-external_1   |       at Socket.EventEmitter.emit (domain.js:448:20)
api-external_1   |       at emitErrorNT (internal/streams/destroy.js:91:8)
api-external_1   |       at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
api-external_1   |       at process._tickCallback (internal/process/next_tick.js:63:19)
api-external_1   | 
api-external_1   | Elasticsearch WARNING: 2021-03-09T20:41:46Z
api-external_1   |   Unable to revive connection: http://elasticsearch:9200/
api-external_1   | 
api-external_1   | Elasticsearch WARNING: 2021-03-09T20:41:46Z
api-external_1   |   No living connections
api-external_1   | 
api-external_1   | 2021-03-09 20:41:46.3844 - error: Error: Failed to connect to elasticsearch @ elasticsearch:9200
api-external_1   |     at exports.esClient.ping (/usr/src/app/api-external/dist/setup/elastic-search.js:33:46)
api-external_1   |     at respond (/usr/src/app/api-external/node_modules/elasticsearch/src/lib/transport.js:327:9)
api-external_1   |     at sendReqWithConnection (/usr/src/app/api-external/node_modules/elasticsearch/src/lib/transport.js:226:7)
api-external_1   |     at next (/usr/src/app/api-external/node_modules/elasticsearch/src/lib/connection_pool.js:214:7)
api-external_1   |     at process._tickCallback (internal/process/next_tick.js:61:11)
api-external_1   | 2021-03-09 20:41:46.3854 - error: Error: No Living connections
api-external_1   |     at sendReqWithConnection (/usr/src/app/api-external/node_modules/elasticsearch/src/lib/transport.js:226:15)
api-external_1   |     at next (/usr/src/app/api-external/node_modules/elasticsearch/src/lib/connection_pool.js:214:7)
api-external_1   |     at process._tickCallback (internal/process/next_tick.js:61:11)
api-external_1   | npm ERR! code ELIFEC

坦率地说,我搜索了很多,但没能调试它。如有任何帮助,不胜感激。

我终于找到了答案。声明为depends_on的东西不会等待服务完全启动。在这里,api-external确实在redis和elasticsearch启动时启动。然而,elasticsearch需要一点时间来配置所有的东西,所以重新启动服务就可以了。

更永久的解决方案是编写一个脚本,直到elasticsearch完全启动后才启动api-external服务

最新更新