я использую docker
и docker-compose
составить услугу, которая представляет собой комбинацию нескольких других. Поскольку внутренние службы обслуживают друг друга, существует предопределенный приоритет, по которому они должны запускаться. Самый простой способ, который я нашел для этого, - использовать сценарий запуска для запуска каждой службы (в назначенном им контейнере) для проверки предварительных условий перед фактическим запуском службы контейнера. Вот что я использую сейчас:
#!/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
Как вы можете видеть здесь, я жду двух других служб (RabbitMQ и PostgreSQL) перед запуском текущей службы. И это работает. Но дело в том, что PostgreSQL не предоставляет протокол HTTP, и единственный способ узнать, работает ли он, - это поискать connected
в ответе wget
программа.
Мне было интересно, есть ли законный способ сделать это, который работает независимо от протокола, используемого в порту. И помните, я не ищу какой-то большой сервис, который мог бы управлять всей моей сетью. Я ищу небольшую программу, подобную той, что названа здесь, которую можно найти в контейнере и которая возвращает истину, как только можно установить соединение на удаленном порту.
Telnet часто используется для быстрой проверки подключения.
telnet <servername> <port number>
Вы должны получить сообщение о подключении, если порт доступен, например:
$ telnet www.google.com 80
Trying 216.58.195.132...
Connected to www.google.com.
Escape character is '^]'.
А также есть netcat, это еще один очень простой сетевой инструмент, который может создавать произвольные TCP- и UDP-соединения.