Docker Compose环境下Postfix配置lmtp:dovecot:24出现域名解析错误的问题排查
问题场景
你在Docker Compose里部署了postfix、dovecot和client三个服务,通过bridge网络互通。Postfix配置了virtual_transport = lmtp:dovecot:24,想把收到的邮件转发到Dovecot的LMTP端口,但发送邮件后Postfix队列一直报错:
(Host or domain name not found. Name service error for name=dovecot type=A: Host not found, try again)
奇怪的是,在Postfix容器里用nslookup dovecot能正常解析到Dovecot的IP,直接把IP写进配置(比如lmtp:172.18.0.4:24)就完全正常,队列能清空,邮件也能正确投递。
问题根源
这其实是Postfix的LMTP服务配置导致的——Postfix默认的master.cf里,LMTP的条目配置没有使用系统默认的域名解析机制。虽然系统层面的工具(比如nslookup)能正常解析Docker的服务名,但Postfix的LMTP进程本身的解析逻辑走了不同的路径,没有正确调用Docker内置的DNS服务。
具体来说,默认的lmtp配置可能限制了解析方式,或者使用了不兼容的socket类型,导致它无法识别Docker Compose提供的服务域名。
解决方案
你找到的修改master.cf的方法是完全正确的,只需要在Postfix镜像的Dockerfile里添加这一行命令:
RUN sed -i'' -e 's/^lmtp .*/lmtp unix - - n - - lmtp/g' /etc/postfix/master.cf
这行命令会把master.cf里原有的lmtp条目替换为使用unix socket的配置(调整后的参数让LMTP进程使用系统默认的域名解析逻辑),这样Postfix就能正常解析dovecot这个服务名,顺利把邮件转发到Dovecot的LMTP端口了。
额外说明
为什么直接用IP就没问题?因为IP地址不需要域名解析,Postfix可以直接建立TCP连接。而用服务名时,原来的LMTP配置没有正确触发系统的DNS解析流程,所以才会出现“找不到主机”的错误——哪怕系统工具能解析,进程自己的逻辑没走对也没用。
备注:内容来源于stack exchange,提问作者Losmoges

