docker-compose의 접미사 "name=dovecot에 대한 이름 서비스 오류"

docker-compose의 접미사 "name=dovecot에 대한 이름 서비스 오류"

문맥

docker-compose --version버전은 2.13.0입니다.

나는 다음에서 재생산을 만들었습니다.https://github.com/Losmoges/postfix-dovecot-lmtp-reproducer

내 평가판에는 작성 파일에 postfix, dovecot 및 client라는 세 가지 도커 서비스가 있습니다. 그들은 브리지 드라이버를 통해 네트워크를 공유합니다.

  • virtual_transport = lmtp:dovecot:24Postfix는 main.cf 구성의 설정을 통해 들어오는 이메일을 dovecot으로 전달하도록 구성됩니다 .
  • Dovecot은 dovecot.conf 구성의 service lmtp// 설정 inet_listener lmtp을 통해 연결을 수신하도록 구성됩니다 .port = 24
  • 클라이언트 컨테이너에서 실행하여 Postfix를 통해 이메일을 보낼 수 있습니다 . 해당 msmtp는 구성 파일을 통해 연결하도록 구성됩니다 .echo test | msmtp [email protected]host postfixmsmtprc

postqueue -p그러면 Postfix 컨테이너에서 실행하여 검사할 수 있는 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 inspectPostfix 구성에 입력하면(예: virtual_transport = lmtp:172.18.0.4:24) 모든 것이 예상대로 작동합니다. 이 경우 명령은 postqueue -p다음과 같습니다 Mail queue is empty(msmtp를 통해 이메일을 보낸 후).

질문

virtual_transport = lmtp:dovecot:24작동하지 않습니까? 내가 뭔가 잘못 구성했나요? Postfix 컨테이너에서 (dnsutils 설치 후) 와 같은 모든 형태의 이름 조회는 nslookup dovecot잘 작동하며 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했습니다 .lmtpchroot

# ==========================================================================
# 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

한 가지 대안은 컨테이너 dovecotpostfix컨테이너 사이에 공유 Unix 소켓을 구성하고 이를 inet 연결 대신 통신에 사용하는 것입니다.

두 번째 대안은 postfix 컨테이너와 동일한 네트워크 네임스페이스에서 lmtp 컨테이너를 실행하는 것입니다. 이 경우 호스트 이름을 더 간단하게 사용할 수 있습니다 localhost.

관련 정보