docker-compose の Postfix「name=dovecot の名前サービス エラー」

docker-compose の Postfix「name=dovecot の名前サービス エラー」

コンテクスト

私のdocker-compose --versionは2.13.0です

私は再現装置を作成しましたhttps://github.com/Losmoges/postfix-dovecot-lmtp-reproducer

私のトライアルでは、compose ファイルに postfix、dovecot、client の 3 つの docker サービスがあります。これらはブリッジ ドライバーを介してネットワークを共有します。

  • virtual_transport = lmtp:dovecot:24Postfix は、main.cf 設定の設定を通じて、受信メールを dovecot に転送するように設定されています。
  • Dovecot は、dovecot.conf 構成のservice lmtp//設定を通じて接続を受信するように構成されています。inet_listener lmtpport = 24
  • クライアント コンテナで実行することで、Postfix 経由で電子メールを送信できます。その msmtp は、構成ファイルを介して接続するように構成されています。echo test | msmtp [email protected]host postfixmsmtprc

これにより、Postfix キューに次の結果が生成されます。これは、postqueue -pPostfix コンテナで実行することで検査できます。

エラー

-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 -pMail queue is emptymsmtp経由でメールを送信した後)

質問

なぜvirtual_transport = lmtp:dovecot:24動作しないのでしょうか? 何か設定をnslookup dovecot間違えたのでしょうか? Postfix コンテナ内 (dnsutils をインストールした後) などの名前検索の形式はすべて正常に動作し、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ため、ホスト名を解決する方法がわかりません。一般的な構成では通信に Unix ソケットが使用されるため、lmtp 構成はデフォルトで chroot 環境で実行されるため、ホスト名の解決は問題になりません。

最も簡単な修正方法は、環境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 接続ではなくそれを通信に使用することが挙げられます。

2 番目の代替案は、postfix コンテナと同じネットワーク名前空間で lmtp コンテナを実行することです。この場合は、ホスト名を使用する方が簡単ですlocalhost

関連情報