Hoe om te gaan met tijdzones in Docker-containers

0
235

Tijdzones zijn een veelvoorkomende bron van verwarring bij het containeriseren van een applicatie. Zullen uw cron-taken op het juiste moment worden uitgevoerd? Docker-containers nemen de tijdzone van de host niet over, dus u kunt onverwachte planningsproblemen tegenkomen die grote schade aanrichten aan uw toepassing.

Hier is het date-commando dat native wordt uitgevoerd op een Ubuntu 20.04-host in de tijdzone van de Britse zomertijd:

En hier is hetzelfde commando in een container gebaseerd op een ongewijzigde ubuntu:20.04-afbeelding:

De container gebruikt de UTC-tijdzone, waardoor er een verschil van één uur ontstaat tussen de twee tijden.

Hoe werkt dat? Linux-tijdzones werken?

De meeste Linux-distributies gebruiken het tzdata-pakket om tijdzone-informatie te verstrekken. Wanneer tzdata is geïnstalleerd, kunt u de huidige tijdzone inspecteren door het /etc/timezone-bestand te lezen:

Advertentie

Je hebt ook een /etc/localtime-bestand. Dit is een symbolische link naar de juiste tijdzonedatabase voor de geselecteerde locatie:

Als u de tijdzone wijzigt, met behulp van dpkg-reconfigure tzdata, wordt de /etc/localtime symlink bijgewerkt om naar de nieuwe database te verwijzen. De uitvoer van opdrachten zoals datum zal worden aangepast om de verschuiving van de actieve tijdzone op te nemen.

Het probleem met containers

De uitdaging met containers komt voort uit het instellen van de tijdzone in de eerste plaats. Als je terugdenkt aan het instellen van je host, had je de tijdzone moeten instellen als onderdeel van de installatie van het besturingssysteem. Wanneer u een nieuwe container uitvoert, start deze echter onmiddellijk, zonder enige “installatie” stadium. Er is geen mogelijkheid om een ​​geschikte tijdzone te selecteren.

Theoretisch zouden containerruntimes automatische overerving van de tijdzone van de host kunnen bieden. Dit gebeurt niet omdat dit kan leiden tot onverwachte resultaten bij implementatie in externe omgevingen. Je zou gemakkelijk over het hoofd zien dat je cron-schema werkt op je lokale computer, maar onverwacht wordt uitgevoerd in een beheerd Kubernetes-cluster met UTC-tijd.

Containerafbeeldingen worden in plaats daarvan geleverd met een ingebakken tijdzone. Voor de meeste populaire afbeeldingen is dit UTC. Veel basisafbeeldingen, vooral minimale, bevatten niet eens het tzdata-pakket. U heeft geen /etc/timezone- of /etc/localtime-bestanden.

Tijdzones aan uw containers toevoegen

Het eerste deel van het instellen van de juiste tijdzone is ervoor te zorgen dat tzdata is geïnstalleerd. Als uw afbeelding deze niet bevat, moet u het pakket handmatig toevoegen als onderdeel van uw Dockerfile.

FROM ubuntu:latest ENV DEBIAN_FRONTEND=niet-interactieve RUN apt-get update && apt-get install -y tzdata Advertentie

Wanneer tzdata wordt geïnstalleerd, krijgt u meestal een interactieve prompt waarmee u de juiste tijdzone in een menu kunt selecteren. Dit is niet handig wanneer u Docker-containers programmatisch bouwt. Als u de omgevingsvariabele DEBIAN_FRONTEND instelt, wordt de prompt onderdrukt en wordt de tijdzone standaard ingesteld op UTC.

Zodra u tzdata in uw afbeelding hebt, bent u klaar om de juiste tijdzone voor uw toepassing te configureren. De eenvoudigste benadering is om de TZ-omgevingsvariabele in te stellen op de tijdzone die u wilt gebruiken:

FROM ubuntu:latest ENV TZ=Europa/Londen ENV DEBIAN_FRONTEND=niet-interactieve RUN apt-get update && apt-get install -y tzdata

Als u wilt, kunt u de TZ-variabele instellen wanneer u containers start. Geef het door als een omgevingsvariabele aan docker-run. Hiermee kunt u de standaardtijdzone van een afbeelding overschrijven, op voorwaarde dat deze het tzdata-pakket bevat.

docker run -e TZ=Europe/London -it ubuntu:latest

Een alternatief voor omgevingsvariabelen is het bestand /etc/timezone. U kunt de vereiste tijdzone schrijven als onderdeel van uw Dockerfile. Als u deze methode gebruikt, moet u tzdata opnieuw configureren met uw pakketbeheerder. Vergeet niet om de niet-interactieve modus te gebruiken, anders krijgt u opnieuw de grafische tijdzone-prompt.

FROM ubuntu:latest RUN echo “Europe/London” > /etc/timezone RUN dpkg-reconfigure -f noninteractive tzdata

Andere technieken

Als u tijdzonesynchronisatie met de host wilt garanderen, kunt u uw lokale tzdata-bestanden in uw containers mounten. Je hebt nog steeds tzdata in de container nodig om dit correct te laten werken.

docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -it ubuntu:latest

Hoewel Docker geen ingebouwde ondersteuning voor tijdzones biedt, geldt dat niet voor alle container-engines. Podman heeft een speciale –tz-vlag waarmee je de tijdzone kunt instellen bij het maken van een nieuwe container:

podman run –tz=Europe/London -it ubuntu:latest Advertisement

Achter de schermen zal Podman een geschikt /etc/localtime-bestand voor je aankoppelen. De opgegeven tijdzone blijft bestaan ​​voor de levensduur van de container.

Podman laat je ook een standaard tijdzone instellen voor containers die zijn gemaakt zonder de vlag –tz. Maak of bewerk .config/containers/containers.conf in uw thuismap. Voeg een tz-instelling toe aan een nieuwe regel in het bestand:

# Wordt gebruikt als er geen –tz-vlag wordt gegeven tz = “Europe/London”

Podman's native tijdzone-integratie maakt het gemakkelijker om mee te werken dan Docker. Aangezien Podman's CLI compatibel is met Docker's, kan het de moeite waard zijn om over te stappen als u vaak met containers in verschillende tijdzones werkt.

Samenvatting

Tijdzones worden vaak over het hoofd gezien bij het opzetten van Docker-containers. De meeste basisimages gebruiken standaard UTC-tijd, wat tot verwarring kan leiden wanneer de tijdzone van de host anders is.

Door het tzdata-pakket te installeren, wordt uw container compatibel met alle tijdzones via de TZ-omgevingsvariabele,/etc/timezone, en /etc/localtime. Als alternatief kunt u de tijdzone van uw host synchroniseren door de relevante bestanden in uw containers te plaatsen.

Onthoud ten slotte dat deze overwegingen ook van toepassing zijn op gehoste Docker-services en Kubernetes-clusters. Uw containers gebruiken UTC-tijd, tenzij anders aangegeven. Zolang u omgevingsvariabelen kunt instellen, kunt u TZ gebruiken om de tijdzone voor uw workloads aan te passen.