Hur man hanterar tidszoner i Docker Containers

0
172

Tidszoner är en vanlig källa till förvirring när du containeriserar en applikation. Kommer dina cron-uppgifter att gå i rätt tid? Docker-containrar ärver inte värdens tidszon, så du kan stöta på oväntade schemaläggningsproblem som orsakar kaos med din applikation.

Här är datumkommandot som körs naturligt på en Ubuntu 20.04-värd i den brittiska sommartidszonen:

Och här är samma kommando i en container baserad på en omodifierad ubuntu: 20.04-bild:

Containern använder UTC-tidszonen, vilket skapar en timmes skillnad mellan de två tiderna.

Hur gör Linux-tidszoner fungerar?

De flesta Linux-distributioner använder tzdata-paketet för att tillhandahålla tidszonsinformation. När tzdata är installerat kan du inspektera den aktuella tidszonen genom att läsa filen/etc/tidszon:

Annons

Du har också en/etc/localtime-fil. Detta är en symlänk till rätt tidszondatabas för den valda platsen:

Om du ändrar tidszonen med hjälp av dpkg-omkonfigurera tzdata uppdateras symlänken/etc/localtime för att peka på den nya databasen. Utdata från kommandon som datum kommer att justeras för att inkludera den aktiva tidszonens förskjutning.

Problemet med behållare

utmaning med containrar härrör från att ställa in tidszonen i första hand. Om du tänker tillbaka till när du ställer in din värd, behöver du ställa in tidszonen som en del av installationen av operativsystemet. När du kör en ny container startar den omedelbart dock utan någon & # 8220; installation & # 8221; skede. Det finns ingen möjlighet att välja en lämplig tidszon.

Teoretiskt sett kan containerdriftstider erbjuda automatisk arv av värdens tidszon. Detta händer inte eftersom det kan leda till oväntade resultat vid distribution till avlägsna miljöer. Det skulle vara lätt att förbise att ditt cron-schema fungerar på din lokala maskin men körs oväntat i ett hanterat Kubernetes-kluster med UTC-tid.

Containerbilder levereras med en inbyggd tidszon istället. För de mest populära bilderna är detta UTC. Många basbilder, särskilt minimala, inkluderar inte ens tzdata-paketet. Du har inga/etc/tidszon- eller/etc/localtime-filer.

Lägga till tidszoner i dina behållare

Den första delen av att ställa in rätt tidszon är att se till att tzdata är installerat. Om din bild inte innehåller den måste du lägga till paketet manuellt som en del av din Dockerfil.

FRÅN ubuntu: senaste ENV DEBIAN_FRONTEND = icke-interaktiv KÖR apt-get-uppdatering & amp; & amp; apt-get install -y tzdata Annonsering

När tzdata installeras får du vanligtvis en interaktiv fråga som låter dig välja rätt tidszon från en meny. Detta är inte till hjälp när du programmatiskt bygger Docker-containrar. Att ställa in miljövariabeln DEBIAN_FRONTEND undertrycker uppmaningen och ställer in tidszonen som UTC.

När du väl har fått in data i din bild är du redo att konfigurera rätt tidszon för din applikation. Det enklaste tillvägagångssättet är att ställa in TZ-miljövariabeln till den tidszon du vill använda:

FRÅN ubuntu: senaste ENV TZ = Europe/London ENV DEBIAN_FRONTEND = icke-interaktiv KÖR apt-get-uppdatering & amp; & amp; apt-get install -y tzdata

Om du föredrar kan du ställa in TZ-variabeln när du startar containrar. Skicka det som en miljövariabel till dockarkörning. Detta låter dig åsidosätta standardbildzonen för en bild, förutsatt att den innehåller tzdata-paketet.

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

Ett alternativ till miljövariabler är filen/etc/tidszon. Du kan skriva den tidszon som krävs som en del av din Dockerfile. Om du använder den här metoden måste du konfigurera om tzdata med din pakethanterare. Kom ihåg att använda ett icke-interaktivt läge, annars kommer du att få den grafiska tidszonprompten igen.

FRÅN ubuntu: senaste RUN-ekot “Europe/London” & gt;/etc/tidszon KÖR dpkg-omkonfigurera -f icke-interaktiv tzdata

Andra tekniker

Om du vill garantera tidszonsynkronisering med värden kan du montera dina lokala tzdatafiler i dina behållare. Du behöver fortfarande tzdata inuti behållaren för att detta ska fungera korrekt.

docker kör -v/etc/timezone:/etc/timezone -v/etc/localtime:/etc/localtime -it ubuntu: senaste

Även om Docker inte ger något inbyggt stöd för tidszoner, är det inte sant för alla containermotorer. Podman har en dedikerad –tz-flagga som låter dig ställa in tidszonen när du skapar en ny container:

podman run –tz = Europe/London – det ubuntu: senaste annonsen

Bakom kulisserna monterar Podman en lämplig/etc/localtime-fil åt dig. Den angivna tidszonen kommer att bestå under hela containerns livstid.

Podman låter dig också ställa in en standardtid för containrar som skapats utan –tz-flaggan. Skapa eller redigera .config/containers/containers.conf i din hemkatalog. Lägg till en tz-inställning på en ny rad i filen:

# Används när ingen –tz-flagga ges tz = “Europe/London”

Podmans integrerade tidszonsintegration gör det lättare att arbeta med än Docker. Eftersom Podmans CLI är kompatibel med Docker, kan det vara värt att överväga att byta om du ofta arbetar med containrar i olika tidszoner.

Sammanfattning

Tidszoner förbises ofta när du ställer in Docker-behållare. De flesta basbilder är UTC-tid som standard, vilket kan leda till förvirring när värdens tidszon är annorlunda.

Genom att installera tzdata-paketet får din container kompatibilitet med alla tidszoner via TZ-miljövariabeln,/etc/tidszon och/etc/localtime. Alternativt kan du synkronisera värdens tidszon genom att montera relevanta filer i dina behållare.

Slutligen, kom ihåg att dessa överväganden också gäller för värdade Docker-tjänster och Kubernetes-kluster. Dina behållare kommer att använda UTC-tid om inte annat anges. Så länge du kan ställa in miljövariabler kan du använda TZ för att justera tidszonen för dina arbetsbelastningar.