Возникли проблемы с запуском ElasticSearch в приложении Laravel на Docker. У меня было такое же приложение, работающее без проблем в локальной среде, и в настоящее время я нахожусь в процессе настройки UAT и производственных экземпляров приложения, этот вопрос относится к экземпляру UAT.
Я использую Docker в режиме роя и имею несколько контейнеров, два из которых - PHP и Elasticsearch. В docker-compose.yml
я установил имя контейнера Elasticsearch на portal_elasticsearch
.
Вот проблема
Если я exec
войду в контейнер PHP и пингую portal_elasticsearch
, я вижу, что система сама может разрешить IP из имени хоста;
$ ping portal_elasticsearch
PING portal_elasticsearch (10.0.1.65) 56(84) bytes of data.
64 bytes from 10.0.1.65 (10.0.1.65): icmp_seq=1 ttl=64 time=0.124 ms
Более того, я могу отправлять запросы на Flexiblesearch через curl и получать ответ;
$ curl portal_elasticsearch:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open remortgage_index VPvFRhhaQ5257zvmQuUkIQ 5 1 17 0 182.7kb 182.7kb
PHP даже разрешает это правильно;
$ php -r 'echo gethostbyname("portal_elasticsearch") . "\n";'
10.0.1.65
Однако, если я достигаю конечной точки в приложении Laravel, я получаю следующую ошибку (я отредактировал некоторые вещи вниз по стеку, что не имеет значения), достаточно сказать, что я прошел через все приложение, и оно выдает ошибка при проверке кода ответа HTTP, возвращаемого из Elasticsearch;
{
"message": "No alive nodes found in your cluster",
"status_code": 500,
"debug": {
"line": 52,
"file": "/var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/ConnectionPool/StaticNoPingConnectionPool.php",
"class": "Elasticsearch\\Common\\Exceptions\\NoNodesAvailableException",
"trace": [
"#0 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Transport.php(76): Elasticsearch\\ConnectionPool\\StaticNoPingConnectionPool->nextConnection()",
"#1 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Transport.php(94): Elasticsearch\\Transport->getConnection()",
"#2 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php(245): Elasticsearch\\Transport->performRequest('PUT', '//portal_elasti...', Array, '{\"id\":\"2b6bcc41...', Array)",
"#3 /var/www/api/vendor/react/promise/src/FulfilledPromise.php(25): Elasticsearch\\Connections\\Connection->Elasticsearch\\Connections\\{closure}(Array)",
"#4 /var/www/api/vendor/guzzlehttp/ringphp/src/Future/CompletedFutureValue.php(55): React\\Promise\\FulfilledPromise->then(Object(Closure), NULL, NULL)",
"#5 /var/www/api/vendor/guzzlehttp/ringphp/src/Core.php(341): GuzzleHttp\\Ring\\Future\\CompletedFutureValue->then(Object(Closure), NULL, NULL)",
"#6 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php(298): GuzzleHttp\\Ring\\Core::proxy(Object(GuzzleHttp\\Ring\\Future\\CompletedFutureArray), Object(Closure))",
"#7 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php(176): Elasticsearch\\Connections\\Connection->Elasticsearch\\Connections\\{closure}(Array, Object(Elasticsearch\\Connections\\Connection), Object(Elasticsearch\\Transport), Array)",
"#8 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Transport.php(110): Elasticsearch\\Connections\\Connection->performRequest('PUT', '/remortgage_ind...', Array, '{\"id\":\"2b6bcc41...', Array, Object(Elasticsearch\\Transport))",
"#9 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Client.php(1553): Elasticsearch\\Transport->performRequest('PUT', '/remortgage_ind...', Array, Array, Array)",
"#10 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Client.php(791): Elasticsearch\\Client->performRequest(Object(Elasticsearch\\Endpoints\\Index))",
"#11 /var/www/api/app/DomainImplementation/Infrastructure/ElasticSearchClient.php(41): Elasticsearch\\Client->index(Array)",
"#12 /var/www/api/app/DomainImplementation/ReadModel/RemortgageElasticSearchRepository.php(45): App\\DomainImplementation\\Infrastructure\\ElasticSearchClient->index('2b6bcc41-f0de-4...', 'remortgage_inde...', 'remortgage', Array)",
<< SNIP >>
]
}
}
Однако
Если я изменю свой файл .env
на внутренний IP-адрес (10.0.1.65
, как указано выше) контейнера Elasticsearch Docker, тогда он будет работать нормально.
TL; DR: Клиент PHP Elasticsearch не будет работать с именем хоста, но будет работать с IP-адресом, даже если PHP и ОС могут разрешить имя хоста.