GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Cómo manejar zonas horarias en contenedores Docker

Las zonas horarias son una fuente común de confusión al contener una aplicación. ¿Sus tareas cron se ejecutarán en el momento adecuado? Los contenedores de Docker no heredan la zona horaria del host, por lo que puede encontrarse con problemas de programación inesperados que causan estragos en su aplicación.

Aquí está la date comando que se ejecuta de forma nativa en un host Ubuntu 20.04 en la zona horaria del horario de verano británico:

Y aquí está el mismo comando en un contenedor basado en un ubuntu:20.04 sin modificar imagen:

El contenedor utiliza la zona horaria UTC, lo que crea una diferencia de una hora entre las dos horas.

¿Cómo funcionan las zonas horarias de Linux?

La mayoría de las distribuciones de Linux usan tzdata paquete para proporcionar información de la zona horaria. Cuando tzdata está instalado, puede inspeccionar la zona horaria actual leyendo el /etc/timezone archivo:

También tendrá un /etc/localtime expediente. Este es un enlace simbólico a la base de datos de la zona horaria correcta para la ubicación seleccionada:

Si cambia la zona horaria, use dpkg-reconfigure tzdata , el /etc/localtime el enlace simbólico se actualiza para apuntar a la nueva base de datos. La salida de comandos como date se ajustará para incluir el desplazamiento de la zona horaria activa.

El problema de los contenedores

El desafío con los contenedores se deriva de establecer la zona horaria en primer lugar. Si recuerda cuando configuró su host, habría tenido que configurar la zona horaria como parte de la instalación del sistema operativo. Sin embargo, cuando ejecuta un nuevo contenedor, comienza de inmediato, sin ninguna etapa de "instalación". No hay posibilidad de seleccionar una zona horaria adecuada.

Teóricamente, los tiempos de ejecución de contenedores podrían ofrecer herencia automática de la zona horaria del host. Esto no sucede, ya que podría generar resultados inesperados al implementar en entornos remotos. Sería fácil pasar por alto que su programación cron funciona en su máquina local pero se ejecuta de forma inesperada en un clúster de Kubernetes administrado utilizando la hora UTC.

En su lugar, las imágenes de contenedor se envían con una zona horaria integrada. Para las imágenes más populares, esto será UTC. Muchas imágenes base, particularmente las mínimas, ni siquiera incluirán los tzdata paquete. No tendrás /etc/timezone o /etc/localtime archivos.

Agregar zonas horarias a sus contenedores

La primera parte de establecer la zona horaria adecuada es asegurarse de que tzdata esta instalado. Si su imagen no la incluye, deberá agregar manualmente el paquete como parte de su Dockerfile .

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

Cuando tzdata instala, por lo general recibe un aviso interactivo que le permite seleccionar la zona horaria correcta de un menú. Esto no es útil cuando crea contenedores Docker mediante programación. Configuración de DEBIAN_FRONTEND La variable de entorno suprime el aviso y la zona horaria predeterminada es UTC.

Una vez que tenga tzdata en su imagen, está listo para configurar la zona horaria correcta para su aplicación. El enfoque más simple es configurar el TZ variable de entorno a la zona horaria que desea utilizar:

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

Si lo prefiere, puede establecer la TZ variable cuando inicia contenedores. Páselo como una variable de entorno a docker run . Esto le permite anular la zona horaria predeterminada de una imagen, siempre que incluya los tzdata paquete.

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

Una alternativa a las variables de entorno es /etc/timezone expediente. Puede escribir la zona horaria requerida como parte de su Dockerfile . Si usa este método, debe reconfigurar tzdata usando su administrador de paquetes. Recuerde usar el modo no interactivo o volverá a recibir el aviso gráfico de la zona horaria.

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

Otras Técnicas

Si desea garantizar la sincronización de la zona horaria con el host, puede montar su tzdata local archivos en sus contenedores. Seguirás necesitando tzdata dentro del contenedor para que esto funcione correctamente.

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

Aunque Docker no proporciona ningún soporte integrado para las zonas horarias, eso no es cierto para todos los motores de contenedores. Podman tiene un --tz dedicado bandera que le permite establecer la zona horaria al crear un nuevo contenedor:

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

Detrás de escena, Podman montará un /etc/localtime apropiado archivo para usted. La zona horaria especificada persistirá durante la vida útil del contenedor.

Podman también le permite establecer una zona horaria predeterminada para los contenedores creados sin --tz bandera. Cree o edite .config/containers/containers.conf en su directorio de inicio. Agrega un tz configuración en una nueva línea en el archivo:

# Used when no --tz flag is given
tz = "Europe/London"

La integración de la zona horaria nativa de Podman hace que sea más fácil trabajar con él que con Docker. Como la CLI de Podman es compatible con la de Docker, vale la pena considerar hacer el cambio si trabaja con frecuencia con contenedores en diferentes zonas horarias.

Resumen

Las zonas horarias a menudo se pasan por alto al configurar contenedores Docker. La mayoría de las imágenes base tienen la hora UTC predeterminada, lo que puede generar confusión cuando la zona horaria del host es diferente.

Al instalar el tzdata paquete, su contenedor obtiene compatibilidad con todas las zonas horarias a través de TZ variable de entorno, /etc/timezone y /etc/localtime . Alternativamente, puede sincronizar la zona horaria de su host montando los archivos relevantes en sus contenedores.

Finalmente, recuerde que estas consideraciones también se aplican a los servicios alojados de Docker y a los clústeres de Kubernetes. Sus contenedores utilizarán la hora UTC a menos que se indique lo contrario. Siempre que pueda establecer variables de entorno, podrá usar TZ para ajustar la zona horaria para sus cargas de trabajo.


Docker
  1. Cómo actualizar automáticamente los contenedores Docker en ejecución

  2. Cómo exportar e importar contenedores Docker

  3. Cómo usar Docker Compose

  4. Cómo conectar contenedores Docker

  5. Cómo listar contenedores Docker

Cómo ejecutar contenedores Docker

Cómo eliminar contenedores Docker

Cómo detener los contenedores de Docker

Cómo nombrar o renombrar contenedores Docker

Cómo gestionar contenedores Docker

Cómo configurar espacios de nombres de red en contenedores Docker