Подождите, пока node.js не будет готов Logstash с использованием контейнеров - PullRequest
0 голосов
/ 25 мая 2018

У меня есть следующие настройки в 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 голосов
/ 25 мая 2018

Docker compose не ждет, пока контейнер будет готов, он будет только ждать, пока он запустится.

depends_on только гарантирует, что logstash запустится перед вашим контейнером узла, но, опять же, это неЭто означает, что он будет ждать, пока не будет готов.

Вы можете самостоятельно выполнить проверки на узле или использовать скрипт-обертку.В документации docker-compose они рекомендуют wait-for-it или dockerize

Подробнее об этом можно прочитать в здесь


Пользовательская оболочка

Ваш контейнер узлов 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
...