I fusi orari sono una fonte comune di confusione durante la containerizzazione di un'applicazione. Le tue attività cron verranno eseguite al momento giusto? I contenitori Docker non ereditano il fuso orario dell'host, quindi puoi incorrere in problemi di pianificazione imprevisti che devastano la tua applicazione.
Ecco la date
comando eseguito 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 ubuntu:20.04
non modificato immagine:
Il container utilizza il fuso orario UTC, creando una differenza di un'ora tra i due orari.
Come funzionano i fusi orari di Linux?
La maggior parte delle distribuzioni Linux utilizza tzdata
pacchetto per fornire informazioni sul fuso orario. Quando tzdata
è installato, puoi controllare il fuso orario corrente leggendo il /etc/timezone
file:
Avrai anche un /etc/localtime
file. Questo è un collegamento simbolico al database del fuso orario corretto per la posizione selezionata:
Se modifichi il fuso orario, usando dpkg-reconfigure tzdata
, il /etc/localtime
il collegamento simbolico 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 container
La sfida con i container deriva in primo luogo dall'impostazione del fuso orario. Se ripensi a quando hai configurato il tuo host, avresti dovuto impostare il fuso orario come parte dell'installazione del sistema operativo. Quando esegui un nuovo container, però, si avvia immediatamente, senza alcuna fase di "installazione". 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 sul tuo computer 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 integrato. Per le immagini più popolari, questo sarà UTC. Molte immagini di base, in particolare quelle minime, non includeranno nemmeno i tzdata
pacchetto. Non avrai /etc/timezone
o /etc/localtime
file.
Aggiunta di fusi orari ai tuoi container
La prima parte dell'impostazione del fuso orario corretto è assicurarsi che tzdata
è installato. Se la tua immagine non la include, dovrai aggiungere manualmente il pacchetto come parte del tuo Dockerfile
.
FROM ubuntu:latest ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y tzdata
Quando tzdata
installazioni, di solito viene visualizzato un prompt interattivo che consente di selezionare il fuso orario corretto da un menu. Questo non è utile quando crei contenitori Docker a livello di codice. Impostazione del DEBIAN_FRONTEND
la variabile di ambiente sopprime il prompt e imposta il fuso orario predefinito su UTC.
Una volta ottenuto tzdata
nella tua immagine, sei pronto per configurare il fuso orario corretto per la tua applicazione. L'approccio più semplice è impostare il TZ
variabile di ambiente al fuso orario che desideri 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 il TZ
variabile quando avvii i contenitori. Passalo come variabile di ambiente a docker run
. Ciò ti consente di ignorare il fuso orario predefinito di un'immagine, a condizione che includa tzdata
pacchetto.
docker run -e TZ=Europe/London -it ubuntu:latest
Un'alternativa alle variabili di ambiente è /etc/timezone
file. 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 la richiesta grafica del fuso orario.
FROM ubuntu:latest RUN echo "Europe/London" > /etc/timezone RUN dpkg-reconfigure -f noninteractive tzdata
Altre tecniche
Se vuoi garantire la sincronizzazione del fuso orario con l'host, puoi montare il tuo tzdata
locale file 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 vale per tutti i motori di container. Podman ha un --tz
dedicato flag che ti consente di impostare il fuso orario quando crei un nuovo contenitore:
podman run --tz=Europe/London -it ubuntu:latest
Dietro le quinte, Podman monterà un /etc/localtime
appropriato file 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 --tz
bandiera. Crea o modifica .config/containers/containers.conf
nella tua home directory. Aggiungi un tz
impostazione su una nuova riga nel file:
# Used when no --tz flag is given tz = "Europe/London"
L'integrazione nativa del fuso orario di Podman semplifica il lavoro rispetto a Docker. Poiché la CLI di Podman è compatibile con Docker, vale la pena considerare il passaggio se lavori spesso con container in fusi orari diversi.
Riepilogo
I fusi orari vengono spesso trascurati durante la configurazione dei contenitori Docker. La maggior parte delle immagini di base è predefinita in base all'ora UTC, il che può creare confusione quando il fuso orario dell'host è diverso.
Installando tzdata
pacchetto, il tuo container ottiene la compatibilità con tutti i fusi orari tramite il TZ
variabile di ambiente, /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 tuoi container utilizzeranno l'ora UTC se non diversamente indicato. Finché puoi impostare variabili d'ambiente, sarai in grado di utilizzare TZ
per regolare il fuso orario per i tuoi carichi di lavoro.