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.