Skip to content

Commit 35ce06e

Browse files
committed
fix(mta): replace dockerize with envsubst for configuration templating and add wait-for-services script
# Conflicts: # target/mta/Dockerfile
1 parent d1bcbfa commit 35ce06e

10 files changed

+106
-48
lines changed

target/mta/Dockerfile

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
FROM ghcr.io/jeboehm/dockerize:0.9.3@sha256:d4e824aa120670658d7012421d2fdf1b2437be34a6acbb7a4ad92ed52edec8eb AS dockerize
21
FROM alpine:3.23@sha256:25109184c71bdad752c8312a8623239686a9a2071e8825f20acb8f2198c3f659
32

43
LABEL maintainer="https://github.com/jeboehm/docker-mailserver"
54
LABEL vendor="https://github.com/jeboehm/docker-mailserver"
6-
LABEL de.ressourcenkonflikt.docker-mailserver.autoheal="true"
75

86
ENV MAILNAME=mail.example.com \
97
MYNETWORKS=127.0.0.0/8 \
@@ -21,7 +19,9 @@ ENV MAILNAME=mail.example.com \
2119
WAITSTART_TIMEOUT=1m \
2220
RECIPIENT_DELIMITER=-
2321

24-
RUN apk --no-cache add \
22+
RUN --mount=type=cache,target=/var/cache/apk \
23+
apk add \
24+
envsubst \
2525
postfix-mysql \
2626
postfix && \
2727
postconf virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf && \
@@ -64,7 +64,7 @@ RUN apk --no-cache add \
6464
postconf smtpd_soft_error_limit=3 && \
6565
postconf smtpd_hard_error_limit=5 && \
6666
newaliases
67-
COPY --from=dockerize /bin/dockerize /usr/local/bin/dockerize
67+
6868
COPY rootfs/ /
6969

7070
EXPOSE 25 587

target/mta/rootfs/entrypoint.sh

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ if ! [ -r /etc/postfix/tls/tls.crt ] || ! [ -r /etc/postfix/tls/tls.key ]; then
1515
exit 1
1616
fi
1717

18-
exec dockerize \
19-
-wait "tcp://${MYSQL_HOST}:${MYSQL_PORT}" \
20-
-wait "tcp://${MDA_LMTP_ADDRESS}" \
21-
-wait "tcp://${FILTER_MILTER_ADDRESS}" \
22-
-timeout "${WAITSTART_TIMEOUT}" \
23-
/usr/sbin/postfix start-fg
18+
/usr/local/lib/wait-for-services.sh
19+
20+
exec /usr/sbin/postfix start-fg
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
user = {{ .Env.MYSQL_USER }}
2-
password = {{ .Env.MYSQL_PASSWORD }}
3-
hosts = {{ .Env.MYSQL_HOST }}:{{ .Env.MYSQL_PORT }}
4-
dbname = {{ .Env.MYSQL_DATABASE }}
5-
tls_verify_cert = {{ .Env.MYSQL_TLS_VERIFY_CERT }}
1+
user = ${MYSQL_USER}
2+
password = ${MYSQL_PASSWORD}
3+
hosts = ${MYSQL_HOST}:${MYSQL_PORT}
4+
dbname = ${MYSQL_DATABASE}
5+
tls_verify_cert = ${MYSQL_TLS_VERIFY_CERT}
66
query = SELECT CONCAT(mail_users.name, '@', d1.name) AS email FROM mail_users JOIN mail_domains d1 ON mail_users.domain_id = d1.id HAVING email='%s' UNION SELECT destination AS email FROM mail_aliases JOIN mail_domains d2 ON mail_aliases.domain_id = d2.id WHERE CONCAT(mail_aliases.name, '@', d2.name)='%s'
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
user = {{ .Env.MYSQL_USER }}
2-
password = {{ .Env.MYSQL_PASSWORD }}
3-
hosts = {{ .Env.MYSQL_HOST }}:{{ .Env.MYSQL_PORT }}
4-
dbname = {{ .Env.MYSQL_DATABASE }}
5-
tls_verify_cert = {{ .Env.MYSQL_TLS_VERIFY_CERT }}
1+
user = ${MYSQL_USER}
2+
password = ${MYSQL_PASSWORD}
3+
hosts = ${MYSQL_HOST}:${MYSQL_PORT}
4+
dbname = ${MYSQL_DATABASE}
5+
tls_verify_cert = ${MYSQL_TLS_VERIFY_CERT}
66
query = SELECT CONCAT(mail_users.name, '@', mail_domains.name) AS email FROM mail_users JOIN mail_domains ON mail_users.domain_id = mail_domains.id HAVING email='%s'
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
user = {{ .Env.MYSQL_USER }}
2-
password = {{ .Env.MYSQL_PASSWORD }}
3-
hosts = {{ .Env.MYSQL_HOST }}:{{ .Env.MYSQL_PORT }}
4-
dbname = {{ .Env.MYSQL_DATABASE }}
5-
tls_verify_cert = {{ .Env.MYSQL_TLS_VERIFY_CERT }}
1+
user = ${MYSQL_USER}
2+
password = ${MYSQL_PASSWORD}
3+
hosts = ${MYSQL_HOST}:${MYSQL_PORT}
4+
dbname = ${MYSQL_DATABASE}
5+
tls_verify_cert = ${MYSQL_TLS_VERIFY_CERT}
66
query = SELECT IF(send_only = true, 'REJECT', 'OK') AS access FROM mail_users JOIN mail_domains ON mail_users.domain_id = mail_domains.id WHERE mail_users.name = '%u' AND mail_domains.name = '%d'
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
user = {{ .Env.MYSQL_USER }}
2-
password = {{ .Env.MYSQL_PASSWORD }}
3-
hosts = {{ .Env.MYSQL_HOST }}:{{ .Env.MYSQL_PORT }}
4-
dbname = {{ .Env.MYSQL_DATABASE }}
5-
tls_verify_cert = {{ .Env.MYSQL_TLS_VERIFY_CERT }}
1+
user = ${MYSQL_USER}
2+
password = ${MYSQL_PASSWORD}
3+
hosts = ${MYSQL_HOST}:${MYSQL_PORT}
4+
dbname = ${MYSQL_DATABASE}
5+
tls_verify_cert = ${MYSQL_TLS_VERIFY_CERT}
66
query = SELECT destination FROM mail_aliases JOIN mail_domains ON mail_aliases.domain_id = mail_domains.id WHERE CONCAT(mail_aliases.name, '@', mail_domains.name) = '%s'
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
user = {{ .Env.MYSQL_USER }}
2-
password = {{ .Env.MYSQL_PASSWORD }}
3-
hosts = {{ .Env.MYSQL_HOST }}:{{ .Env.MYSQL_PORT }}
4-
dbname = {{ .Env.MYSQL_DATABASE }}
5-
tls_verify_cert = {{ .Env.MYSQL_TLS_VERIFY_CERT }}
1+
user = ${MYSQL_USER}
2+
password = ${MYSQL_PASSWORD}
3+
hosts = ${MYSQL_HOST}:${MYSQL_PORT}
4+
dbname = ${MYSQL_DATABASE}
5+
tls_verify_cert = ${MYSQL_TLS_VERIFY_CERT}
66
query = SELECT 1 FROM mail_domains WHERE name='%s'
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
user = {{ .Env.MYSQL_USER }}
2-
password = {{ .Env.MYSQL_PASSWORD }}
3-
hosts = {{ .Env.MYSQL_HOST }}:{{ .Env.MYSQL_PORT }}
4-
dbname = {{ .Env.MYSQL_DATABASE }}
5-
tls_verify_cert = {{ .Env.MYSQL_TLS_VERIFY_CERT }}
1+
user = ${MYSQL_USER}
2+
password = ${MYSQL_PASSWORD}
3+
hosts = ${MYSQL_HOST}:${MYSQL_PORT}
4+
dbname = ${MYSQL_DATABASE}
5+
tls_verify_cert = ${MYSQL_TLS_VERIFY_CERT}
66
query = SELECT 1 FROM mail_users JOIN mail_domains ON mail_users.domain_id = mail_domains.id WHERE mail_users.name = '%u' AND mail_domains.name = '%d' AND enabled = 1

target/mta/rootfs/usr/local/lib/init.sh

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,9 @@ if [ "${MTA_UPSTREAM_PROXY}" = "true" ]; then
4747
postconf submission_upstream_proxy_protocol=haproxy
4848
fi
4949

50-
dockerize \
51-
-template /etc/postfix/mysql-email2email.cf.templ:/etc/postfix/mysql-email2email.cf \
52-
-template /etc/postfix/mysql-virtual-alias-maps.cf.templ:/etc/postfix/mysql-virtual-alias-maps.cf \
53-
-template /etc/postfix/mysql-virtual-mailbox-domains.cf.templ:/etc/postfix/mysql-virtual-mailbox-domains.cf \
54-
-template /etc/postfix/mysql-virtual-mailbox-maps.cf.templ:/etc/postfix/mysql-virtual-mailbox-maps.cf \
55-
-template /etc/postfix/mysql-recipient-access.cf.templ:/etc/postfix/mysql-recipient-access.cf \
56-
-template /etc/postfix/mysql-email-submission.cf.templ:/etc/postfix/mysql-email-submission.cf \
57-
/bin/true
50+
envsubst </etc/postfix/mysql-email2email.cf.templ >/etc/postfix/mysql-email2email.cf
51+
envsubst </etc/postfix/mysql-virtual-alias-maps.cf.templ >/etc/postfix/mysql-virtual-alias-maps.cf
52+
envsubst </etc/postfix/mysql-virtual-mailbox-domains.cf.templ >/etc/postfix/mysql-virtual-mailbox-domains.cf
53+
envsubst </etc/postfix/mysql-virtual-mailbox-maps.cf.templ >/etc/postfix/mysql-virtual-mailbox-maps.cf
54+
envsubst </etc/postfix/mysql-recipient-access.cf.templ >/etc/postfix/mysql-recipient-access.cf
55+
envsubst </etc/postfix/mysql-email-submission.cf.templ >/etc/postfix/mysql-email-submission.cf
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#!/bin/sh
2+
set -e
3+
4+
# Wait for service to be available using nc
5+
wait_for_service() {
6+
(
7+
host="$1"
8+
port="$2"
9+
service_name="$3"
10+
timeout="${WAITSTART_TIMEOUT:-60s}"
11+
12+
# Convert timeout to seconds (handle formats like "1m", "60s", "60")
13+
timeout_seconds=60
14+
if echo "$timeout" | grep -q "m$"; then
15+
timeout_seconds=$(echo "$timeout" | sed 's/m$//' | awk '{print $1 * 60}')
16+
elif echo "$timeout" | grep -q "s$"; then
17+
timeout_seconds=$(echo "$timeout" | sed 's/s$//')
18+
else
19+
timeout_seconds="$timeout"
20+
fi
21+
22+
elapsed=0
23+
interval=1
24+
25+
echo "Waiting for $service_name at $host:$port..."
26+
while [ "$elapsed" -lt "$timeout_seconds" ]; do
27+
if nc -z "$host" "$port" 2>/dev/null; then
28+
echo "$service_name is available"
29+
exit 0
30+
fi
31+
sleep "$interval"
32+
elapsed=$((elapsed + interval))
33+
done
34+
35+
echo "Error: Timeout waiting for $service_name at $host:$port"
36+
exit 1
37+
)
38+
}
39+
40+
# Wait for MySQL
41+
if [ -z "$MYSQL_HOST" ] || [ -z "$MYSQL_PORT" ]; then
42+
echo "Error: MYSQL_HOST or MYSQL_PORT not set"
43+
exit 1
44+
fi
45+
wait_for_service "$MYSQL_HOST" "$MYSQL_PORT" "MySQL"
46+
47+
# Wait for MDA LMTP
48+
if [ -z "$MDA_LMTP_ADDRESS" ]; then
49+
echo "Error: MDA_LMTP_ADDRESS not set"
50+
exit 1
51+
fi
52+
MDA_LMTP_HOST=$(echo "$MDA_LMTP_ADDRESS" | cut -d: -f1)
53+
MDA_LMTP_PORT=$(echo "$MDA_LMTP_ADDRESS" | cut -d: -f2)
54+
wait_for_service "$MDA_LMTP_HOST" "$MDA_LMTP_PORT" "MDA LMTP"
55+
56+
# Wait for Filter Milter
57+
if [ -z "$FILTER_MILTER_ADDRESS" ]; then
58+
echo "Error: FILTER_MILTER_ADDRESS not set"
59+
exit 1
60+
fi
61+
FILTER_MILTER_HOST=$(echo "$FILTER_MILTER_ADDRESS" | cut -d: -f1)
62+
FILTER_MILTER_PORT=$(echo "$FILTER_MILTER_ADDRESS" | cut -d: -f2)
63+
wait_for_service "$FILTER_MILTER_HOST" "$FILTER_MILTER_PORT" "Filter Milter"

0 commit comments

Comments
 (0)