【问题标题】:Wait node.js until Logstash is ready using containers等待 node.js 直到 Logstash 准备好使用容器
【发布时间】:2018-11-04 08:26:08
【问题描述】:

我在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 并在一段时间后启动节点容器,它也可以工作。

问题在于,显然这不是一个好习惯,我无法猜测logstash 需要多长时间才能开始,而且docker-compose.yml 中的depends_on 指令根本没有帮助。

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

【问题讨论】:

    标签: node.js docker elasticsearch docker-compose logstash


    【解决方案1】:

    Docker compose 不会等到容器准备好,它只会等到它正在运行。

    depends_on 只会确保logstash 在您的节点容器之前启动,但这并不意味着它会等到它准备好。

    您可以自己在节点上处理检查,也可以使用包装脚本。在 docker-compose 文档中,他们推荐 wait-for-itdockerize

    您可以在here阅读更多内容


    自定义包装器

    您的节点容器command 可以从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
    

    【讨论】:

    • 你的wait-for-it 链接已损坏。
    • 修复了!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多