Im Docker Image die Konfig-Files beim Start anpassen
Docker Images soll man ja möglichst allgemein bauen. D.h. nicht für jedes System ein passenden Image sondern eins, das man wiederverwenden kann.
In meinem Fall ist das der Mailserver, der läuft auf mehreren Systmen. Fast gleiche, aber leicht anders. U.a. muss eben der Hostname im Konfig-File des Postfix hinterlegt werden.
Dazu gibt es einen netten Befehl envsubst
1 der Teil des Paketes gettext
ist.
D.h. im Dockerfile steht u.a. folgendes:
1FROM alpine:3.15
2...
3RUN apk add --no-cache gettext
4...
5RUN --mount=type=bind,target=/prepare.sh,source=makepostfix.sh,ro --mount=type=bind,target=/install,source=postfix/,ro sh -c "/prepare.sh "
6
7COPY postfix-entry.sh /entry.sh
8
9ENV myhostname="mx0.js-home.org"
Das Shell-Script makepostfix.sh
(via Mount spare ich mir copy und delete), enthält eine wichtige Zeile:
1cp /install/etc/postfix/main.cf /etc/postfix/main.cf.env
Dort wird also die main.cf
von Postfix nicht etwa direkt als main.cf
übernommen, sondern mit einem anderen Namen. So wird Postfix natürlich niemals starten. Und damit kommt envsubst
und der Entry-Point ins Spiel, der so endet:
1...
2envsubst </etc/postfix/main.cf.env >/etc/postfix/main.cf
3
4/usr/sbin/postfix start-fg
Start via Docker Compose dann:
1 postfix1:
2 environment:
3 - "myhostname=mx1.js-home.org"
Man beachte die Anführungszeichen: entweder keine oder über die ganze Zeile inklusive Variablennamen!
(wäre es einfach, könnte es jeder!)