我在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
容器。
答案 0 :(得分:1)
Docker compose不会等到容器准备就绪,它只会等到它运行。
depends_on
只会确保logstash
在您的节点容器之前启动,但同样,这并不意味着它会等到它准备就绪。
您可以自己在节点上处理检查,也可以使用包装器脚本。在docker-compose文档中,他们建议wait-for-it或dockerize
您可以在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