GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

Come gestire i fusi orari nei contenitori Docker

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.


Docker
  1. Come aggiornare automaticamente i contenitori Docker in esecuzione

  2. Come usare Docker Compose

  3. Come collegare i contenitori Docker

  4. Come passare le variabili d'ambiente ai container Docker

  5. Come gestire gli aggiornamenti di sicurezza all'interno dei container Docker?

Come eseguire i contenitori Docker

Come rimuovere i contenitori Docker

Come fermare i container Docker

Come rinominare o rinominare i contenitori Docker

Come gestire i container Docker

Come configurare gli spazi dei nomi di rete nei contenitori Docker