Esta é uma meia resposta, ou pelo menos uma metade testada, já que estou trabalhando atualmente com o mesmo problema. Espero que alguém possa ajudar a entender o que senti falta.
A resposta do OP (David Grayson) me parece uma reinvenção do spool de e-mail post-up, mas usar esse spool de e-mail parece uma abordagem promissora, então é aqui que eu cheguei.
A interface de compatibilidade / usr / bin / sendmail fornecida pelo postfix passa o mail ao postdrop, que é sgid postdrop, permitindo que ele armazene emails na fila maildrop em / var / spool / postfix / maildrop. Isso deve ocorrer no contêiner docker. O resto do postfix deve não ter que ser executado no container.
Então, eu sou host de montagem / var / spool / postfix / maildrop e / var / spool / postfix / public. Eu posso obter e-mail entregue para / var / spool / postfix / maildrop no ambiente de host, desde que eu montei o diretório de filas maildrop. Como montei /var/spool/postfix/public
, maildrop
pode sinalizar pickup
para coletar o email da fila. Infelizmente, os uids e gids envolvidos, a menos que eu cuide disso, significando que o pickup no diretório host não pode ler os arquivos de spool, e pior a instalação do postfix atrapalha as permissões no diretório maildrop no ambiente host.
Ainda assim, parece funcionar:
$ cat Dockerfile
FROM debian:jessie
# Ids from parent environment
RUN groupadd -g 124 postfix && \
groupadd -g 125 postdrop && \
useradd -u 116 -g 124 postfix
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \
postfix \
bsd-mailx
CMD echo test mail | mail [email protected]
$ sudo docker build .
...
Successfully built 16316fcd44b6
$ sudo docker run -v /var/spool/postfix/maildrop:/var/spool/postfix/maildrop \
-v /var/spool/postfix/public:/var/spool/postfix/public 16316fcd44b6
Enquanto isso funciona, eu não estou muito feliz em codificar os uids e gids. Isso significa que o mesmo contêiner não pode ser contado para executar o mesmo em todos os lugares. Eu imagino que, se em vez de montar o volume do host, eu o monto de um contêiner que executa o postfix, então ele nunca vai entrar em conflito, e eu só preciso de uma instalação de postfix para obter e-mails de muitos contêineres. Eu defini esses uids e gids em uma imagem de base da qual todos os meus containers herdam.
Eu me pergunto se isso é realmente uma boa abordagem. Com uma configuração de email tão simples e nenhum daemon em uso no contêiner para tentar a entrega novamente, um MTA local mais simples, como o msmtp, pode ser mais apropriado. Ele entregaria via TCP a um relé no mesmo host, onde ocorreria o spool.
As preocupações com a abordagem msmtp incluem:
- mais possibilidades de perder e-mails se o relé smtp para o qual ele envia não estiver disponível. Se isso for um retransmissor no mesmo host, a chance de problemas de rede é baixa, mas eu teria que ter cuidado com a reinicialização do contêiner de retransmissão.
- performance?
- Se uma grande quantidade de e-mails passar, o e-mail começa a cair?
Em geral, a abordagem do spool postfix compartilhado parece mais provável de ser uma configuração frágil a ser configurada, mas menos provável de falhar no tempo de execução (relé indisponível, portanto, queda de email).