TIC Tac. ¿Tu contenedor sabe qué hora es?

Tradicionalmente, los sistemas informáticos Linux se instalan en una máquina física o virtual, y una de las preguntas que se hacen durante la instalación es: El instalador establece un vínculo entre /etc/localtime y un archivo de zona horaria. En mi máquina Fedora, veo el siguiente enlace:

$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 38 Feb 29 13:11 /etc/localtime -> ../usr/share/zoneinfo/America/New_York

Cuando le pregunta al sistema qué hora es, el glibc la biblioteca lee este enlace para mostrar la hora según la zona horaria.

$ date
Tue 11 Aug 2020 03:57:43 PM EDT

Si fuerzo un cambio en este archivo para que apunte a Japón, la forma en que se muestra la fecha cambia:

$ ln -fs ../usr/share/zoneinfo/Japan /etc/localtime
$ date
Wed 12 Aug 2020 04:58:59 AM JST
Índice

    Problema: las imágenes de contenedores tienen una zona horaria integrada

    Cuando los motores de contenedores como Podman, Docker o CRI-O ejecutan contenedores, extraen la imagen OCI especificada de un registro de contenedor. Esta imagen está construida con un enlace codificado de /etc/localtime a una zona horaria. Por lo general, la zona horaria se establece en la ubicación donde se creó la imagen o la imagen base, o UTC ± 00: 00. No hay un proceso de instalación para cambiar la zona horaria. Después de extraer la imagen, el motor del contenedor simplemente inicia el contenedor en función de la zona horaria codificada. Esto significa que su contenedor que se ejecuta en Tokio podría informar que se está ejecutando en Nueva York, dependiendo de dónde se haya creado la imagen.

    Los usuarios han intentado resolver este problema montando el archivo de zona horaria del host en el contenedor o agregando una variable de entorno como TZ=jst. Estos intentos han causado problemas desde la /etc/localtime suele ser un enlace simbólico y es posible que no haga lo que el usuario espera. La variable de entorno TZ también es un problema porque no todos los servicios prestan atención a la variable, confundiendo a los usuarios debido a los diferentes resultados para el mismo parámetro. Por ejemplo, las imágenes de Fedora aceptan la variable de entorno, mientras que las imágenes de Alpine la ignoran por completo.

    Además, algunas zonas horarias incluso comparten la misma abreviatura, como CST, que es tanto la hora estándar central (en los EE. UU.) como la hora estándar de China. Teniendo en cuenta todo esto, no había una manera fácil de cambiar el sistema para que TODOS los contenedores usaran la zona horaria deseada.

    Podman (2.1) agrega la bandera --tz

    el --tz la bandera toma las zonas horarias de IANA, así como local. La palabra reservada local establece la zona horaria para que coincida con la zona horaria de su máquina host.

    mirando a la página del manual ejecutada por podman, podemos ver el nuevo --tz opción:

    $ man podman-run
    …
    --tz=time zone
    
    Set a time zone in the container. This flag takes area-based time zones, GMT, as well as local, which sets the time zone in the container to match the host machine. See /usr/share/zoneinfo/ for valid time zones.

    Y aquí hay algunos ejemplos en acción:

    $ date
    Tue Aug 11 16:48:10 EDT 2020
    
    $ podman run --tz=local alpine date
    Tue Aug 11 16:48:27 EDT 2020
    
    $ podman run --tz=Asia/Shanghai alpine date
    Wed Aug 12 04:48:42 CST 2020
    
    $ podman run --tz=US/Eastern alpine date
    Tue Aug 11 16:48:47 EDT 2020

    Esta bandera también está disponible en el podman create pedido.

    ¿Como funciona?

    Establecer una zona horaria funciona de la misma manera en contenedores rooteados y no rooteados. Funcionalmente, el indicador de zona horaria monta una copia de su archivo de zona horaria especificado que se encuentra en /usr/share/zoneinfo me gusta /etc/localtime, configurando así la zona horaria en el contenedor. Si la zona horaria especificada es local (o pasa a ser un enlace simbólico, porque algunos archivos de zona horaria son solo un enlace simbólico a otro archivo), la bandera sigue el enlace simbólico y monta el archivo apuntado. Esto soluciona los problemas de variables de entorno y enlaces simbólicos que los usuarios pueden haber encontrado antes. La configuración de la zona horaria es permanente durante la vida útil del contenedor.

    ¿No quiero especificar esta bandera para cada contenedor que ejecuto?

    Los administradores y usuarios pueden establecer una zona horaria predeterminada en todo el sistema para todos sus contenedores usando Contenedores.conf. Esto garantiza que cada contenedor creado en su sistema tenga la zona horaria especificada, a menos que la línea de comando lo anule. Configuración de la zona horaria en Contenedores.conf iEsto es útil si desea crear contenedores siempre con la misma zona horaria, lo que evita tener que usar la bandera cada vez que se crea o ejecuta un contenedor.

    $ cat $HOME/.config/Contenedores/Contenedores.conf
    [containers]
    # Set time zone in container. Takes IANA time zones as well as "local",
    # which sets the time zone in the container to match the host machine.
    #
    tz = "Europe/London"
    
    $ podman run alpine date
    Tue Aug 11 21:54:21 BST 2020

    Notar: Contenedores.conf se encuentra en /usr/share/Contenedores/Contenedores.conf y /etc/Contenedores/Contenedores.conf para el modo raíz y $HOME/.config/Contenedores/Contenedores.conf para el modo sin raíces.

    Conclusión

    El indicador de zona horaria hace que sea fácil e infalible configurar la hora en un contenedor para satisfacer sus necesidades personales, sin preocuparse por montajes, enlaces simbólicos y variables de entorno. Establecer una zona horaria en Contenedores.conf le permite "configurarlo y olvidarlo" para todos sus contenedores.

    Ahora sigue tu caminito y recorre el mundo: todo en tu contenedor.

    Artículos de interés

    Subir