等待node.js,直到使用容器准备好Logstash [英] Wait node.js until Logstash is ready using containers
问题描述
我在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屋!