Zeitzone im Container richtig setzen - TZ-Variable und Zoneinfo
Zeitzone im Container richtig setzen - TZ-Variable und Zoneinfo
Docker-Container laufen standardmäßig in UTC – wer Logs, Cron-Jobs oder Timestamps in Lokalzeit braucht, muss die Zeitzone explizit setzen.
Methode 1: TZ-Umgebungsvariable
Die einfachste Methode – funktioniert in den meisten modernen Images die tzdata bereits enthalten:
docker run -e TZ=Europe/Berlin myimage
In Compose:
services:
app:
image: myimage
environment:
TZ: Europe/Berlin
Zeitzone prüfen:
docker exec mycontainer date
# Do 1 Sep 2022 21:00:00 CEST
Methode 2: Host-Zeitzone einbinden
Zuverlässiger und unabhängig von tzdata im Image:
docker run \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
myimage
In Compose:
services:
app:
image: myimage
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
Das funktioniert auch wenn tzdata nicht im Image installiert ist, weil die Zeitzonendaten vom Host kommen.
Alpine-Images: tzdata nachinstallieren
Alpine Linux enthält kein tzdata – die TZ-Variable allein reicht deshalb nicht. Im Dockerfile:
FROM alpine:3.19
RUN apk add --no-cache tzdata
ENV TZ=Europe/Berlin
Oder bei Laufzeit:
docker run -e TZ=Europe/Berlin alpine sh -c "apk add --no-cache tzdata && date"
Debian/Ubuntu-Images
Debian-basierte Images haben tzdata oft bereits dabei. Falls nicht:
FROM debian:bookworm-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y tzdata && \
ln -fs /usr/share/zoneinfo/Europe/Berlin /etc/localtime && \
dpkg-reconfigure -f noninteractive tzdata && \
rm -rf /var/lib/apt/lists/*
Häufiger Fehler: TZ gesetzt, aber Anwendung ignoriert sie
Manche Anwendungen lesen die Systemzeitzone nicht über TZ, sondern über /etc/localtime. In diesem Fall hilft:
# Im Container als root
ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
echo "Europe/Berlin" > /etc/timezone
Oder als Dockerfile-Befehl kombiniert mit der Bindung per Volume.
Java-Anwendungen zum Beispiel nutzen oft ihre eigene Zeitzonendatenbank – dort muss man zusätzlich -Duser.timezone=Europe/Berlin als JVM-Argument übergeben.
Zeitzone in docker-compose.yml für alle Services
x-tz: &tz
TZ: Europe/Berlin
services:
app:
image: myapp
environment:
<<: *tz
worker:
image: myworker
environment:
<<: *tz
db:
image: postgres:16
environment:
<<: *tz
Mit YAML-Anchors setzt man die Zeitzone einmal und übernimmt sie in alle Services.
Verfügbare Zeitzonen
# Alle Europa-Zeitzonen anzeigen
docker run --rm alpine sh -c "apk add --no-cache tzdata && ls /usr/share/zoneinfo/Europe/"
- Wichtige Zeitzonen für den deutschsprachigen Raum:
Europe/Berlin– DeutschlandEurope/Vienna– ÖsterreichEurope/Zurich– Schweiz