Telegram бот в Docker контейнере не мог подключиться к API с ошибкой:
socket.gaierror: [Errno -3] Temporary failure in name resolution
aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host api.telegram.org:443 ssl:default [Temporary failure in name resolution]
- Бот не мог преобразовать доменное имя
api.telegram.orgв IP-адрес - DNS (Domain Name System) не работал в контейнере
- Интернет подключение было, но разрешение имён - нет
ping -c 3 8.8.8.8
# ✅ Работало - интернет естьnslookup api.telegram.org
# ❌ Ошибка: ;; communications error to 127.0.0.53#53: timed outnslookup api.telegram.org 8.8.8.8
# ✅ Работало - проблема в локальном DNScat /etc/resolv.conf
# Проблема: nameserver 127.0.0.53 (systemd-resolved) не отвечалsystemctl status systemd-resolved
# Служба работала, но выдавала ошибки "Got packet on unexpected connection"systemctl stop systemd-resolvedecho -e "nameserver 8.8.8.8\nnameserver 1.1.1.1" > /etc/resolv.confnslookup api.telegram.org
# ✅ Успех: Name: api.telegram.org, Address: 149.154.167.220curl -s -o /dev/null -w "%{http_code}" https://api.telegram.org/
# ✅ Результат: 302 (нормальный редирект)Проблема: systemd-resolved не работал корректно в Docker окружении Решение: Заменили на прямое использование внешних DNS серверов
8.8.8.8- Google Public DNS1.1.1.1- Cloudflare DNS
nameserver 8.8.8.8
nameserver 1.1.1.1
После исправления DNS:
- ✅ Telegram API доступен
- ✅ Бот может подключаться к серверам Telegram
- ✅ Разрешение доменных имён работает
- ✅ Проблема с "name resolution" решена
services:
your-bot:
dns:
- 8.8.8.8
- 1.1.1.1Плюсы:
- Решает проблему только для контейнера
- Не влияет на хост-систему
- Легко управлять через код
systemctl stop systemd-resolved
echo -e "nameserver 8.8.8.8\nnameserver 1.1.1.1" > /etc/resolv.confПлюсы:
- Быстрое решение
- Работает для всей системы
Минусы:
- Влияет на весь сервер
- Может сломаться при обновлении системы
RUN echo "nameserver 8.8.8.8" > /etc/resolv.conf- Для production: Docker Compose DNS настройки
- Для быстрого фикса: настройки хоста (как мы сделали)
- Для новых образов: Dockerfile