Предупреждение: file_get_contents(): ошибка php_network_getaddresses: ошибка getaddrinfo: имя не разрешается

#php #docker #symfony

#php #docker #symfony

Вопрос:

Я запускаю php:7-fpm-alpine контейнер Docker и у меня есть команда Symfony, которая вызывает следующую функцию (немного упрощенную для отображения здесь):

 protected function getNextEndpointAsObj()
{
    $asObj = json_decode(file_get_contents('https://www.muckrock.com/api_v1/jurisdiction/?format=jsonamp;page=1'));

    return $asObj;
}
 

… и когда я запускаю команду из своего контейнера Docker, я получаю это сообщение об ошибке:

Предупреждение: file_get_contents(): ошибка php_network_getaddresses: ошибка getaddrinfo: имя не разрешается

… но когда я запускаю короткое test.php сценарий …

 <?php

echo file_get_contents('https://www.muckrock.com/api_v1/jurisdiction/?format=jsonamp;page=1');

?>
 

… внутри или снаружи контейнера я получаю корректный вывод из API, с которым я тестирую.

Что здесь происходит?

Ответ №1:

Вы выполнили короткое test.php внутри контейнера тоже?

Это не проблема с Symfony или PHP. Короче говоря, сеть контейнера не может разрешить IP-адрес домена muckrock.com . Найдите настройки DNS для вашей контейнерной сети. Расскажите больше о вашей инфраструктуре. Это Kubernetes или что-то другое?

Для запуска контейнера raw docker вы можете использовать что-то вроде этого:

 docker run -it --dns=8.8.8.8 php:7-fpm-alpine /bin/sh
 

Или для docker -создайте что-то вроде этого (или для версии 3, как более актуальной)

 version: 2
services:
 application:
  dns:
   - 8.8.8.8
 

Комментарии:

1. Хороший ответ. Я использовал свой test.php для проверки IP-доступа как внутри, так и снаружи контейнера. Это работает просто отлично. Похоже, это что-то о функции, которую я вызываю. Я подумал, что, возможно, я получаю ограничение скорости, но похоже, что API имеет ограничение скорости только один раз в секунду, и я жду 5 секунд между запросами. Так что я не уверен, что происходит не так.

2. Информация о разрешении имен часто указывает на то, что распознаватель DNS не может разрешить IP-адрес по имени домена. Я пытался правильно получить информацию по вашей ссылке, но немного медленно. Можете ли вы попробовать использовать что-то вроде Guzzle и попытаться изменить время ожидания запроса?

3. Спасибо. Я переключился на Guzzle и установил connect_timeout значение 120 , но a cURL error 6 по-прежнему отображается, как только выполняется запрос. Это очень странно.

4. Закрытие цикла на этом: добавление dns: - 8.8.8.8 спецификации, docker-compose.yml похоже, сделало свое дело. (Я изначально не пробовал это, потому что некоторые DNS-запросы проходили — но всегда первый запрос, за которым следует сбой во второй раз.) Еще раз спасибо!