一尘不染

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

elasticsearch

我在中进行以下设置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启动将花费多长时间,并且其中的depends_on指令docker- compose.yml根本没有帮助。

我需要一种方法来知道什么时候logstash准备好,然后再启动node容器。


阅读 245

收藏
2020-06-22

共1个答案

一尘不染

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

depends_on只会确保logstash在您的节点容器之前启动,但是再次声明,这并不意味着它将等待直到准备就绪。

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

你可以在这里阅读更多


定制包装

您的节点容器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
2020-06-22