node.js - 等待 node.js 直到 Logstash 准备好使用容器

标签 node.js docker elasticsearch docker-compose logstash

我在docker-compose.yml中有以下设置:

....

logstash:
  container_name: logstash
  image: docker.elastic.co/logstash/logstash:6.2.4

node:
  container_name: node
  build:
    context: ./node/
    dockerfile: ./Dockerfile
  depends_on:
    - logstash

....

我正在使用包winston-logstash将它们连接在一起。

这是传输层:

const logstashHost = process.env.LOGSTASH_HOST || 'logstash'
const logstashPort = process.env.LOGSTASH_PORT || 5045

new (winstonLogstash.Logstash)({
  host: logstashHost,
  port: logstashPort,
  node_name: 'node',
  timestamp: true,
  max_connect_retries: 5,
  timeout_connect_retries: 1000,
})

以及管道配置:

input {
  tcp {
    port => 5045
  }
}
output {
  stdout{}
  elasticsearch {
    hosts => ["elasticsearch:9200"]
  }
}

使用docker-compose up结果 Error: Max retries reached, transport in silent mode, OFFLINE

如果我使用大 setTimeout 手动启动服务器或增加最终有效的连接重试次数。如果我启动logstash并在一段时间后启动 Node 容器,它也可以工作。

问题是,显然这不是一个好的做法,我无法猜测需要多长时间logstash将需要启动,并且 depends_on里面的指令 docker-compose.yml根本没有帮助。

我需要一种方法来知道何时 logstash准备就绪并启动node之后是容器。

最佳答案

Docker compose 不会等到容器准备就绪,它只会等到容器运行。

depends_on 仅确保 logstash 在 Node 容器之前启动,但这并不意味着它会等到准备就绪。

您可以自己在 Node 上处理检查,也可以使用包装器脚本。在 docker-compose 文档中,他们建议 wait-for-itdockerize

您可以在here中阅读更多相关内容。

<小时/>

自定义包装器

您的 Node 容器命令可以从node index.js(或您拥有的任何内容)更改为bash wait-for-logtash.sh:

#!/bin/bash

## Or whatever command is used for checking logstash availability
until curl 'http://logstash:5045' 2> /dev/null; do
  echo "Waiting for logtash..."
  sleep 1; 
done

# Start your server
node index.js

关于node.js - 等待 node.js 直到 Logstash 准备好使用容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50520698/

相关文章:

elasticsearch - 索引中跨多种类型的建议完成

javascript - 为什么我的 Node.js 应用程序会出现 404 状态?

node.js - Node TypeScript 删除需要缓存

elasticsearch - 如何使用通配符从 Elasticsearch 查询字符串中找到真​​实分数?

python - 如何在基于 Alpine 镜像的 Docker 化应用程序中启用 WebSocket 连接(WebSocketAddressException : [Errno -3])?

mysql - 如何在 docker-compose 文件中为具有不同 mysqld 版本的不同项目组织 mysql 卷?

elasticsearch - 如何使Logstash替换旧数据?

node.js - 用于规范化数据的 Mongoose getter/setter

Node.js express : access application config from required modules

docker - Docker-将Python和依赖项添加到Apache