Контейнер не видит базу
Вопрос
Приложение в контейнере падает с connection refused при подключении к PostgreSQL, который тоже в контейнере. Как будешь искать причину?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Проверить, что оба контейнера в одной пользовательской сети: `docker network inspect`, `docker inspect`
Хост в строке подключения: имя сервиса, а не `localhost` и не старый IP
База запущена и готова: `docker ps`, `docker logs db`, healthcheck; приложение не стартовало раньше базы
База слушает `0.0.0.0` внутри контейнера и порт тот, что ожидаем
Проверка изнутри: `docker exec api getent hosts db`, `nc -zv db 5432`
Если refused по IP: контейнер пересоздан, IP сменился, нужно ходить по имени
Что могут спросить следом
- Чем refused отличается от
could not translate host name? - Как в compose дождаться готовности базы?
- Зачем база публикует порт наружу, если приложение в той же сети?
Разбор
Сначала разделяю: ошибка имени или ошибка подключения. connection refused значит, что имя резолвится и хост доступен, но на порту никто не слушает. Проверяю, жива ли база: docker ps, docker logs db. Частая причина: приложение стартовало раньше, чем база начала принимать соединения, поэтому нужен healthcheck и повторы подключения. Потом смотрю строку подключения: в контейнере localhost это сам контейнер, хост должен быть именем сервиса базы. Проверяю, что оба в одной пользовательской сети: docker network inspect app-net. Проверяю изнутри: docker exec api getent hosts db и nc -zv db 5432, если утилиты есть, или временный контейнер с netshoot в той же сети. Если в конфиге прописан IP, а контейнер базы пересоздали, адрес мог смениться. И смотрю, на каком адресе и порту слушает сама база: listen_addresses должен разрешать не только localhost.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.