Postfix “Erro de serviço de nome para name=dovecot” em docker-compose

Postfix “Erro de serviço de nome para name=dovecot” em docker-compose

Contexto

O meu docker-compose --versioné 2.13.0

Eu criei um reprodutor emhttps://github.com/Losmoges/postfix-dovecot-lmtp-reproducer

Minha avaliação tem três serviços docker no arquivo de composição: postfix, dovecot e cliente. Eles compartilham uma rede através do driver bridge.

  • O Postfix está configurado para encaminhar e-mails recebidos para o dovecot por meio da virtual_transport = lmtp:dovecot:24configuração na configuração main.cf.
  • O Dovecot está configurado para receber conexões por meio da configuração service lmtp/ inet_listener lmtp/ port = 24na configuração dovecot.conf.
  • Posso enviar um email através do Postfix executando no contêiner do cliente. Seu msmtp está configurado para conexão por meio de um arquivo de configuração.echo test | msmtp [email protected]host postfixmsmtprc

Isso produz o seguinte resultado na fila do Postfix, que posso inspecionar executando postqueue -pno contêiner do Postfix.

Erro

-Queue ID-  --Size-- ----Arrival Time---- -Sender/Recipient-------
DEC4F3DCBE      245 Fri Dec 16 19:41:17  [email protected]
(Host or domain name not found. Name service error for name=dovecot type=A: Host not found, try again)
                                         [email protected]

Gambiarra

Quando encontro o endereço IP do contêiner Dovecot docker inspecte o insiro na configuração do Postfix, por exemplo como virtual_transport = lmtp:172.18.0.4:24, tudo funciona conforme o esperado. Neste caso o comando postqueue -pMail queue is empty(após enviar um email pelo msmtp)

Questões

Por que virtual_transport = lmtp:dovecot:24não funciona? Eu configurei algo errado? Qualquer forma de pesquisa de nome, como nslookup dovecot(após a instalação do dnsutils) no contêiner Postfix, funciona perfeitamente e retorna o endereço IP do contêiner Dovecot. O Postfix faz sua própria resolução separada de nomes de domínio? Em caso afirmativo, como posso forçá-lo a usar a resolução de nome de domínio padrão?

Editar: Solução na resposta

Adicionei a seguinte linha ao Dockerfile para a imagem Postfix

RUN sed -i'' -e 's/^lmtp .*/lmtp      unix  -       -       n       -       -       lmtp/g' /etc/postfix/master.cf

Responder1

Por que virtual_transport = lmtp:dovecot:24 não funciona?

No seu master.cf, você lmtpconfigurou para executar em um chrootambiente:

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (no)    (never) (100)
lmtp      unix  -       -       n       -       -       lmtp

O chrootambiente não tem acesso ao contêiner /etc/resolv.conf, portanto não sabe como resolver nomes de host. A configuração do lmtp é executada em um ambiente chroot porque uma configuração típica usa soquetes unix para se comunicar, portanto a resolução do nome do host não é um problema.

A correção mais simples é apenas configurar lmtppara não rodar no chrootambiente:

lmtp      unix  -       -       y       -       -       lmtp

Com esta alteração, o correio é entregue corretamente:

postfix_1  | Dec 16 21:47:15 8d74be7a5951 postfix/smtpd[598]: connect from unknown[172.28.0.1]
postfix_1  | Dec 16 21:47:15 8d74be7a5951 postfix/smtpd[598]: 9131638672DA: client=unknown[172.28.0.1]
postfix_1  | Dec 16 21:47:15 8d74be7a5951 postfix/qmgr[582]: 9131638672DA: from=<[email protected]>, size=434, nrcpt=1 (queue active)
postfix_1  | Dec 16 21:47:15 8d74be7a5951 postfix/smtpd[598]: disconnect from unknown[172.28.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
dovecot_1  | Dec 16 21:47:15 lmtp(16): Info: Connect from 172.28.0.3
dovecot_1  | Dec 16 21:47:15 lmtp([email protected])<16><+A19J2PnnGMQAAAAqj6rOA>: Info: msgid=<20221216164715.079491@rocket>: saved mail to INBOX
postfix_1  | Dec 16 21:47:15 8d74be7a5951 postfix/lmtp[597]: 9131638672DA: to=<[email protected]>, relay=dovecot[172.28.0.2]:24, delay=0.09, delays=0.07/0/0/0.01, dsn=2.0.0, status=sent (250 2.0.0 <[email protected]> +A19J2PnnGMQAAAAqj6rOA Saved)
dovecot_1  | Dec 16 21:47:15 lmtp(16): Info: Disconnect from 172.28.0.3: Logged out (state=READY)
postfix_1  | Dec 16 21:47:15 8d74be7a5951 postfix/qmgr[582]: 9131638672DA: removed

Uma alternativa seria configurar um soquete unix compartilhado entre os contêineres dovecote postfixe usá-lo para comunicação em vez de uma conexão inet.

Uma segunda alternativa seria executar o contêiner lmtp no mesmo namespace de rede que o contêiner postfix; nesse caso, você poderia usar mais simples o hostname localhost.

informação relacionada