Como dizer quando um serviço (qualquer serviço) está disponível em uma porta remota específica

2

Estou usando docker e docker-compose para compor um serviço que é uma combinação de vários outros. Como os serviços internos estão servindo uns aos outros, há uma prioridade predefinida pela qual eles devem ser iniciados. A maneira mais fácil que encontrei para fazer isso é usar um script de inicialização para executar cada serviço (em seu contêiner designado) para verificar os pré-requisitos antes de realmente executar o serviço do contêiner. Aqui está o que estou usando agora:

#!/bin/sh

cd /external-indexer

echo "Waitng for RabbitMQ on $RMQ_HOST:$RMQ_PORT"
until curl http://$RMQ_HOST:$RMQ_PORT/  > /dev/null 2>&1
do
  echo "$(date) - RabbitMQ is not ready yet"
  sleep 1
done
echo "$(date) - RabbitMQ is ready"

echo "Waitng for PostgreSQL on $PG_HOST:$PG_PORT"
until wget $PG_HOST:$PG_PORT -t 1 2>&1 | grep " connected"
do
    echo "$(date) - PostgreSQL is not ready yet"
    sleep 1
done
echo "$(date) - PostgreSQL is ready"

./run-service

Como você pode ver aqui, estou aguardando dois outros serviços (RabbitMQ e PostgreSQL) antes de iniciar o serviço atual. E isso funciona. Mas o problema é que o PostgreSQL não fornece um protocolo HTTP e a única maneira que eu consegui descobrir se ele está funcionando foi procurar o connected na resposta fornecida pelo programa wget .

Eu queria saber se há uma maneira legítima de fazer isso, o que funciona independentemente do protocolo falado na porta. E, por favor, lembre-se, eu não estou procurando por algum grande serviço que possa orquestrar toda a minha rede. Eu estou procurando por um programa pequeno, como os chamados aqui, que podem ser encontrados em um container e retornam true uma vez que a conexão pode ser feita em uma porta remota.

    
por Mehran 16.03.2016 / 01:53

1 resposta

1

O Telnet costuma ser usado para verificar rapidamente a conectividade.

telnet <servername> <port number>

Você deve receber uma mensagem sobre estar conectado se a porta estiver acessível, da seguinte forma:

$ telnet www.google.com 80
Trying 216.58.195.132...
Connected to www.google.com.
Escape character is '^]'.

Há também netcat , que é outra ferramenta de rede muito simples que pode fazer conexões TCP e UDP arbitrárias.

    
por 16.03.2016 / 14:54