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 – Deutschland
  • Europe/Vienna – Österreich
  • Europe/Zurich – Schweiz