我在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-it或dockerize
您可以在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/