在 docker-compose 中後修復“name=dovecot 的名稱服務錯誤”

在 docker-compose 中後修復“name=dovecot 的名稱服務錯誤”

情境

我的docker-compose --version是2.13.0

我已經創建了一個重現器https://github.com/Losmoges/postfix-dovecot-lmtp-re Producer

我的試用版在 compose 檔案中包含三個 docker 服務:postfix、dovecot 和 client。他們透過橋接驅動程式共享網路。

  • Postfix 設定為透過virtual_transport = lmtp:dovecot:24main.cf 設定中的設定將傳入電子郵件轉送至 dovecot。
  • Dovecot 透過dovecot.conf 設定中的 // 設定來service lmtp設定接收連線。inet_listener lmtpport = 24
  • 我可以透過在客戶端容器中執行來透過 Postfix 發送電子郵件。其 msmtp 配置為透過設定檔進行連線。echo test | msmtp [email protected]host postfixmsmtprc

這會在 Postfix 佇列中產生以下結果,我可以透過postqueue -p在 Postfix 容器中執行來檢查該結果。

錯誤

-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]

解決方法

當我透過找到 Dovecot 容器的 IP 位址docker inspect並將其輸入到 Postfix 配置中(例如 )時virtual_transport = lmtp:172.18.0.4:24,一切都會按預期進行。在這種情況下,命令postqueue -p給予Mail queue is empty(透過 msmtp 發送電子郵件後)

問題

為什麼virtual_transport = lmtp:dovecot:24不起作用?我是否配置錯誤?任何形式的名稱查找,例如nslookup dovecot(安裝 dnsutils 後)在 Postfix 容器中都可以正常工作並傳回 Dovecot 容器的 IP 位址。 Postfix 是否有自己獨立的網域解析?如果是這樣,如何強制它使用預設網域解析?

編輯:答案中的解決方案

我將以下行新增到 Postfix 映像檔的 Dockerfile 中

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

答案1

為什麼 virtual_transport = lmtp:dovecot:24 不起作用?

在您的 中master.cf,您已lmtp配置為在環境中運行chroot

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

環境chroot無法存取容器的/etc/resolv.conf,因此它不知道如何解析主機名稱。 lmtp 配置預設在 chroot 環境中運行,因為典型配置使用 unix 套接字進行通信,因此主機名稱解析不是問題。

最簡單的修復就是配置lmtp為不在chroot環境下運作:

lmtp      unix  -       -       y       -       -       lmtp

透過此更改,郵件可以正確投遞:

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

dovecot一種替代方法是在和容器之間配置共用 unix 套接字postfix,並使用它進行通訊而不是 inet 連線。

第二個選項是在與 postfix 容器相同的網路命名空間中執行 lmtp 容器,在這種情況下,您可以更簡單地使用 hostname localhost

相關內容