等待node.js,直到使用容器准备好Logstash [英] Wait node.js until Logstash is ready using containers

查看:75
本文介绍了等待node.js,直到使用容器准备好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将它们连接在一起.

I'm using the package winston-logstash to wire them together.

这是传输层:

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并且过一会儿启动节点容器,它也可以工作.

If I manually start the server either using a large setTimeout or incrementing the number of connection retries it finally works. It works too if I start logstash and after a while I start node container.

问题在于,显然这不是一个好习惯,我无法猜测logstash会花多长时间启动,并且docker-compose.yml中的depends_on指令根本没有帮助.

The problem is that obviously this is not a good practice, I can't guess how long logstash will take to start, and the depends_on directive inside docker-compose.yml doesn't help at all.

我需要一种方法来了解logstash何时准备就绪,并在此之后启动node容器.

I need a way to know when logstash is ready and start the node container after that.

推荐答案

Docker compose不会等到容器准备好时才等待,只会等到容器正在运行时.

Docker compose does not wait until a container is ready, it will only wait until it's running.

depends_on仅确保logstash在节点容器之前启动,但这并不意味着它将等待直到准备就绪.

depends_on will only ensure that logstash launches before your node container, but again, this doesn't mean it will wait until it is ready.

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

You can either handle the checks yourself on node, or use a wrapper script. In docker-compose documentation, they recommend, wait-for-it or dockerize

您可以在此处

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

Your node container command can change from node index.js (or whatever you have), to 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,直到使用容器准备好Logstash的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆