Назад | Перейти на главную страницу

Постфикс в Docker: хост или имя домена не найдены (DNS и Docker)

Я использую Postfix 3.4.8 на Debian 10 (buster) в Docker 19.03.5. Postfix настроен как smarthost. Он передает электронные письма на SMTP-сервер нашего интернет-провайдера.

Если я настрою relayhost настройка с доменное имя SMTP-сервера, в моем случае [mail.level27.be]:587, то при отправке почты я получаю такую ​​ошибку:

Host or domain name not found. Name service error for name=mail.level27.be type=A: Host not found, try again

Если я настрою relayhost установка с IP SMTP-сервера, в моем случае [185.3.216.85]:587, оно работает!

Я думаю, это проблема DNS. Как я могу заставить его работать с доменным именем вместо IP?

Образ Docker создается с помощью этой команды:

docker build --pull -t mypostfix .

Вот Dockerfile:

FROM debian:10
EXPOSE 25

RUN apt-get update
RUN apt-get -y install libsasl2-modules postfix

RUN postconf -X 'mynetworks' \
    && postconf -e 'mynetworks_style = subnet' \
    && postconf -X 'mydestination' \
    && postconf -e 'remote_header_rewrite_domain =' \
    && postconf -e 'inet_protocols = ipv4' \
    && postconf -e 'relayhost = [mail.level27.be]:587' \
    && postconf -e 'smtp_use_tls = yes' \
    && postconf -e 'smtp_sasl_auth_enable = yes' \
    && postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd' \
    && postconf -e 'smtp_sasl_security_options = noanonymous' \
    && postconf -e 'maillog_file = /dev/stdout' \
    && echo "mail.level27.be   username:password" > /etc/postfix/sasl_passwd \
    && chown root:root /etc/postfix/sasl_passwd \
    && chmod 600 /etc/postfix/sasl_passwd \
    && postmap /etc/postfix/sasl_passwd

CMD postfix start-fg

Контейнер Docker запускается с помощью этой команды:

docker run --rm -d -p 25:25 mypostfix

Электронное письмо отправляется на хост Docker с этим curl команда:

echo "This is some mail content." > /tmp/email.txt

curl --url 'smtp://localhost:25' --mail-from 'xxx.yyy@zzz.be' --mail-rcpt 'xxx.yyy@zzz.be' --upload-file /tmp/email.txt

Ошибку можно увидеть, запустив postqueue -p в контейнере:

root@mypostfix:/# postqueue -p
-Queue ID-  --Size-- ----Arrival Time---- -Sender/Recipient-------
DBB26A05886      256 Wed Feb 19 14:45:42  xxx.yyy@zzz.be
(Host or domain name not found. Name service error for name=mail.level27.be type=A: Host not found, try again)
                                         xxx.yyy@zzz.be
-- 0 Kbytes in 1 Request.

Postfix запускает несколько процессов с chroot к /var/spool/postfix. Это означает, что системные файлы, такие как /etc/resolv.conf для разрешения DNS следует найти по адресу /var/spool/postfix/etc/resolv.conf.

Чтобы он заработал, мне пришлось скопировать этот файл в правильное место во время запуска:

CMD cp /etc/resolv.conf /var/spool/postfix/etc/resolv.conf && postfix start-fg

ВНИМАНИЕ: не копируйте его во время сборки, потому что вы можете получить resolv.conf вашего сборочного сервера вместо resolv.conf вашего продакшн-сервера.

Похоже, у вас проблема с разрешением DNS внутри контейнера. Там есть хороший пост в блоге, где описана ваша проблема, проверьте.