Hora y zona horaria del contenedor Docker (no reflejará los cambios)

¿De dónde obtienen los contenedores Docker su información de tiempo? He creado algunos contenedores de ubuntu básico: trusty image, y cuando lo corro y solicito 'fecha', obtengo la hora UTC.

Durante un tiempo, evité esto haciendo lo siguiente en mi Dockerfile:

RUN sudo echo "America/Los_Angeles" > /etc/timezone

Sin embargo, por alguna razón que dejó de funcionar. Buscando en línea Vi lo que se sugiere a continuación:

docker run -v /etc/timezone:/etc/timezone [image-name]

¡Ambos métodos establecen correctamente la zona horaria!

$ cat /etc/timezoneAmerica/Los_Angeles$ dateTue Apr 14 23:46:51 UTC 2015

¿Alguien sabe lo que da?

El secreto aquí es que dpkg-reconfigure tzdata simplemente crea /etc/localtime como copia, enlace rígido o enlace simbólico (se prefiere un enlace simbólico) a un archivo en /usr/share/zoneinfo. Por lo tanto, es posible hacer esto completamente desde su archivo acoplable. Considerar:

ENV TZ=America/Los_AngelesRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

Y como bono, TZ también se establecerá correctamente en el contenedor.

Esto también es independiente de la distribución, por lo que funciona con casi cualquier Linux.

Nota: si está utilizando una imagen basada en alpine, debe instalar el tzdata primero. (ver este número aqui)

Se parece a esto:

RUN apk add --no-cache tzdataENV TZ America/Los_Angeles

Por lo general, es suficiente establecer una variable de entorno en el contenedor de docker, como se indica a continuación:

docker run -e TZ=Europe/Amsterdam debian:jessie date

Por supuesto, esto también funcionaría con docker-compose.

Puede agregar sus archivos locales (/etc/timezone y /etc/localtime) como volumen en su contenedor acoplable.

Actualizar su docker-compose.yml con las siguientes líneas.

volumes:    - "/etc/timezone:/etc/timezone:ro"    - "/etc/localtime:/etc/localtime:ro"

Ahora el tiempo del contenedor es el mismo que en su host

Montaje /etc/localtime en la imagen, por lo que está en sincronización con host -v es la más popular.

Pero mira tema 12084:

no es correcto porque no funciona cuando el software requiere en su lugar el archivo /etc/timezone por fijar.
De esta forma, lo deja como valor predeterminado etc/UTC.

He determinado que en realidad no hay una forma elegante e infalible de establecer la zona horaria dentro de un contenedor acoplable.
Así que finalmente se han asentado en esta solución:

Aplicación dockerfile:

# Relocate the timezone fileRUN mkdir -p /config/etc && mv /etc/timezone /config/etc/ && ln -s /config/etc/timezone /etc/

Script de punto de entrada de la aplicación:

# Set timezone as specified in /config/etc/timezonedpkg-reconfigure -f noninteractive tzdata

Volumen de datos /config dockerfile, localizado en un país o región específicos:

# Set the time zoneRUN echo "Europe/London" > /config/etc/timezone

... no es elegante porque involucra 3 archivos separados y re-crea /etc/localtime en cada inicio de contenedor en tiempo de ejecución. Lo cual es un desperdicio.

Sin embargo, funciona correctamente y logra la separación entre la imagen de la aplicación base y cada configuración localizada por país.
En 3 líneas de código.

En la imagen de ubuntu 16.04 hay un error. La solución era

    ENV TZ 'Europe/Tallinn'    RUN echo $TZ > /etc/timezone && \    apt-get update && apt-get install -y tzdata && \    rm /etc/localtime && \    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \    dpkg-reconfigure -f noninteractive tzdata && \    apt-get clean

Agregando mis dos centavos aquí, porque he probado varios de estos, pero ninguno funcionó en imágenes basadas en alpinos.

Sin embargo, esto hizo el truco:

ENV TZ=America/TorontoRUN apk updateRUN apk upgradeRUN apk add ca-certificates && update-ca-certificatesRUN apk add --update tzdataRUN rm -rf /var/cache/apk/*

[Fuente]

En la imagen básica de alpine (ejemplo de nodo de uso: 10.16.0-alpine):

Archivo acoplable

FROM node:10.16.0-alpineENV TZ=America/Los_AngelesRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneWORKDIR /appCOPY package.json package-lock.json ./RUN npm i --productionCOPY . .CMD node index.js

Usando un contenedor de Fedora (probablemente también funcione con ubuntu):

La solución más sencilla que encontré fue usar lo siguiente en docker-compose.yml

environment:   TZ: "${TZ:-America/Los_Angeles}"

Luego en tu .archivo env (que docker-compose lee automáticamente)

TZ=America/Los_Angeles

Esto le permite poner docker-compose.yml bajo control de versiones y uso personalizado .archivo env que puede ser ignorado por git.

Obtienes un valor predeterminado para el contenedor y obtienes personalización, lo mejor de ambos mundos.

Para Fedora no fueron necesarios otros cambios, ¡simplemente funciona!

si está utilizando una imagen de docker basada en ubuntu :

# Change the docker default timezone from UTC to SGTecho "Asia/Singapore" > /etc/timezonedpkg-reconfigure tzdatadate

Gracias a VonC por la información y enlace al tema. Esto parece un lío tan complicado, así que hice algunas pruebas en mi propia idea de cómo resolver esto y parece funcionar muy bien.

>docker run -it ubuntu:trusty /bin/bash#dpkg-reconfigure tzdata

(siga las indicaciones para seleccionar mi zona horaria)

>docker commit [container-id] chocko/ubuntu:local

Luego actualizé mis archivos Docker para reflejar esto:

FROM chocko/ubuntu:local

Tiene que haber algo malo en esto porque parece demasiado fácil ser pasado por alto... O es esto aceptable?