等待nodest.js,直到使用容器

时间:2018-05-25 02:36:03

标签: node.js docker elasticsearch docker-compose 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将它们连接在一起。

这是传输层:

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容器。

1 个答案:

答案 0 :(得分:1)

Docker compose不会等到容器准备就绪,它只会等到它运行。

depends_on只会确保logstash在您的节点容器之前启动,但同样,这并不意味着它会等到它准备就绪。

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

您可以在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