Come gestire i fusi orari nei contenitori Docker

0
390

I fusi orari sono una fonte comune di confusione quando si containerizza un'applicazione. Le tue attività cron verranno eseguite al momento giusto? I container Docker non ereditano il fuso orario dell'host, quindi puoi incorrere in problemi di pianificazione imprevisti che danneggiano la tua applicazione.

Ecco il comando date in esecuzione in modo nativo su un Host Ubuntu 20.04 nel fuso orario dell'ora legale britannica:

Ed ecco lo stesso comando in un contenitore basato su un'immagine ubuntu:20.04 non modificata:

Il contenitore utilizza il fuso orario UTC, creando una differenza di un'ora tra i due orari.

Come fare I fusi orari di Linux funzionano?

La maggior parte delle distribuzioni Linux utilizza il pacchetto tzdata per fornire informazioni sul fuso orario. Quando tzdata è installato, puoi controllare il fuso orario corrente leggendo il file /etc/timezone:

Pubblicità

Avrai anche un file /etc/localtime. Questo è un collegamento simbolico al database del fuso orario corretto per la posizione selezionata:

Se cambi il fuso orario, usando dpkg-reconfigure tzdata, il collegamento simbolico /etc/localtime viene aggiornato per puntare al nuovo database. L'output di comandi come date verrà regolato per includere l'offset del fuso orario attivo.

Il problema con i contenitori

Il la sfida con i contenitori deriva dall'impostazione del fuso orario in primo luogo. Se ripensi a quando hai configurato il tuo host, avresti dovuto impostare il fuso orario come parte dell'installazione del sistema operativo. Tuttavia, quando esegui un nuovo contenitore, si avvia immediatamente, senza alcuna “installazione” palcoscenico. Non è possibile selezionare un fuso orario appropriato.

In teoria, i runtime del contenitore potrebbero offrire l'ereditarietà automatica del fuso orario dell'host. Ciò non accade in quanto potrebbe portare a risultati imprevisti durante la distribuzione in ambienti remoti. Sarebbe facile trascurare che la tua pianificazione cron funziona sulla tua macchina locale ma viene eseguita in modo imprevisto in un cluster Kubernetes gestito utilizzando l'ora UTC.

Le immagini dei container vengono invece spedite con un fuso orario predefinito. Per le immagini più popolari, sarà UTC. Molte immagini di base, in particolare quelle minimali, non includeranno nemmeno il pacchetto tzdata. Non avrai file /etc/timezone o /etc/localtime.

Aggiunta di fusi orari ai tuoi contenitori

La prima parte dell'impostazione del fuso orario corretto è assicurarsi che tzdata sia installato. Se la tua immagine non la include, dovrai aggiungere manualmente il pacchetto come parte del tuo Dockerfile.

FROM ubuntu:latest ENV DEBIAN_FRONTEND=non interattivo ESEGUI apt-get update && apt-get install -y tzdata Advertisement

Quando tzdata si installa, di solito viene visualizzato un prompt interattivo che consente di selezionare il fuso orario corretto da un menu. Questo non è utile quando si creano contenitori Docker a livello di codice. L'impostazione della variabile di ambiente DEBIAN_FRONTEND elimina il prompt e imposta il fuso orario predefinito su UTC.

Una volta che hai tzdata nell'immagine, sei pronto per configurare il fuso orario corretto per la tua applicazione. L'approccio più semplice è impostare la variabile d'ambiente TZ sul fuso orario che si desidera utilizzare:

FROM ubuntu:latest ENV TZ=Europe/London ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y tzdata

Se preferisci, puoi impostare la variabile TZ quando avvii i container. Passalo come variabile di ambiente per eseguire la finestra mobile. Ciò ti consente di sovrascrivere il fuso orario predefinito di un'immagine, a condizione che includa il pacchetto tzdata.

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

Un'alternativa alle variabili di ambiente è il file /etc/timezone. Puoi scrivere il fuso orario richiesto come parte del tuo Dockerfile. Se usi questo metodo, devi riconfigurare tzdata usando il tuo gestore di pacchetti. Ricorda di utilizzare la modalità non interattiva o riceverai di nuovo il prompt grafico del fuso orario.

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

Altre tecniche

Se vuoi garantire la sincronizzazione del fuso orario con l'host, puoi montare i tuoi file tzdata locali nei tuoi contenitori. Avrai comunque bisogno di tzdata all'interno del contenitore affinché funzioni correttamente.

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

Sebbene Docker non fornisca alcun supporto integrato per i fusi orari, ciò non è vero per tutti i motori di container. Podman ha un flag –tz dedicato che ti consente di impostare il fuso orario quando crei un nuovo contenitore:

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

Dietro le quinte, Podman monterà un file /etc/localtime appropriato per te. Il fuso orario specificato persisterà per tutta la durata del contenitore.

Podman ti consente anche di impostare un fuso orario predefinito per i contenitori creati senza il flag –tz. Crea o modifica .config/containers/containers.conf nella tua home directory. Aggiungi un'impostazione tz su una nuova riga nel file:

# Usato quando non viene assegnato alcun flag –tz tz = “Europe/London”

L'integrazione nativa del fuso orario di Podman semplifica l'utilizzo rispetto a Docker. Poiché la CLI di Podman è compatibile con Docker, vale la pena considerare di effettuare il passaggio se lavori spesso con contenitori in fusi orari diversi.

Riepilogo

I fusi orari vengono spesso trascurati durante l'impostazione dei container Docker. La maggior parte delle immagini di base imposta automaticamente l'ora UTC, il che può creare confusione quando il fuso orario dell'host è diverso.

Installando il pacchetto tzdata, il tuo contenitore ottiene la compatibilità con tutti i fusi orari tramite la variabile d'ambiente TZ,/etc/timezone e /etc/localtime. In alternativa, puoi sincronizzare il fuso orario del tuo host montando i file pertinenti nei tuoi contenitori.

Infine, ricorda che queste considerazioni si applicano anche ai servizi Docker ospitati e ai cluster Kubernetes. I contenitori utilizzeranno l'ora UTC se non diversamente indicato. Finché puoi impostare le variabili di ambiente, sarai in grado di utilizzare TZ per regolare il fuso orario per i tuoi carichi di lavoro.