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 envsubst1 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!)

siehe auch