はじめに
ラクスでMailDealerというメール共有管理サービスの開発をしている@hirobexです
今回は、Dockerコンテナ内でメール送受信できるようにしたいと思います
Dockerfile
FROM almalinux:minimal
RUN microdnf update && microdnf install postfix cyrus-sasl cyrus-sasl-plain
COPY ./entrypoint.sh /
COPY ./main.cf /etc/postfix
ENTRYPOINT [ "/entrypoint.sh" ]
今回はベースイメージにAlma Linuxを選定
Postfixと、SASL認証用のライブラリをインストールします
なお、今回は時間がなかったのでSASL認証の設定は行いません
slim系イメージの場合、dnfコマンドは存在しません
代わりにmicrodnfコマンドを利用します
その後、起動用のentrypoint.sh
とPostfixの設定ファイルmain.cf
をCOPYします
entrypoint.sh
newaliases
postfix start-fg
start-fgコマンドを利用することで、Postfixがフォアグラウンドで動き続け、コンテナが自動で終了しなくなります
start-fgはPostfixのバージョンが3.3以上ではないと使えません
main.cf
inet_interfaces = all
inet_protocols = ipv4
# minimalではsyslogが動いていないため、明示的に指定する必要がある
maillog_file = /var/log/maillog
main.cfは各自のネットワーク設定に合わせて
今回は最低限だけ記載しておきます
inet_interfaces = all
ですべてのメールを受信できるように設定
inet_protocols = ipv4
この設定じゃないとipv6が使えないとエラーがでたためです
maillog_file = /var/log/maillog
コメントアウトに記載のとおりです
docker-compose
これをdocker-composeで動かします
version: '3.8'
services:
postfix1:
build:
context: .
dockerfile: ./Dockerfile
container_name: postfix1
hostname: postfix1
volumes:
- ./postfix1/log:/var/log
任意のホスト名を利用して送受信できるように、hostname
とcontainer_name
を指定しています
mailogが確認しやすいようvolumesにマウントしています
受信したメールを確認したいなら、受信フォルダもマウントしてもいいかもしれません
送受信
docker-compose build
docker-compose up
docker-compose exec -it postfix1
ホスト側でコンテナ内に入り、以下のコマンドを実行します
sendmail root@postfix1
from: root@postfix1
to: root@postfix1
subject: test
Hello World
.
/root/Maildir/new
にメールが受信できていればOKです
受信できていない場合は、maillogを確認してみましょう
まとめ
今回は、DockerでPostfixを利用しました
コンテナを2つ立てたらコンテナ間での送受信も可能です
ただし、SASL認証や、main.cfでの受信許可設定が必要です
来年は、外部に向けて送受信できるようにしたいですね
では。
参考資料