我在中进行以下设置docker-compose.yml:
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将它们连接在一起。
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
docker-compose up
Error: Max retries reached, transport in silent mode, OFFLINE
如果我使用较大setTimeout的连接尝试次数或增加连接重试次数来手动启动服务器,则该服务器最终将正常工作。如果我启动logstash并且过一会儿启动节点容器,它也可以工作。
setTimeout
问题在于,显然这不是一个好习惯,我无法猜测logstash启动将花费多长时间,并且其中的depends_on指令docker- compose.yml根本没有帮助。
logstash
depends_on
docker- compose.yml
我需要一种方法来知道什么时候logstash准备好,然后再启动node容器。
node
Docker compose不会等到容器准备就绪,而只会等到容器正在运行。
depends_on只会确保logstash在您的节点容器之前启动,但是再次声明,这并不意味着它将等待直到准备就绪。
您可以自己在节点上处理检查,也可以使用包装器脚本。在docker-compose文档中,他们建议使用wait-for- it或dockerize
你可以在这里阅读更多
您的节点容器command可以从node index.js(或您拥有的任何容器)更改为bash wait-for-logtash.sh:
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