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

¿De dónde obtienen los contenedores Docker su información horaria? He creado algunos contenedores a partir de la imagen básica de ubuntu:trusty, y cuando lo ejecuto y solicito 'fecha', obtengo la hora UTC.

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

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

Sin embargo, por alguna razón eso dejó de funcionar. Buscando en línea, vi lo siguiente::

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

Sin embargo, ambos métodos configuran 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 fijo 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 Dockerfile. Considerar:

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

Y como beneficio adicional, 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, de la siguiente manera:

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 docker.

Actualice 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á sincronizado con host -v es el más popular.

Pero mira tema 12084:

no es correcto porque no funciona cuando el software requiere en su lugar el archivo /etc/timezone para ser fijado.
De esa manera, lo está utilizando como el valor predeterminado etc/UTC.

He determinado que en realidad no existe una forma elegante e infalible de establecer la zona horaria dentro de un contenedor docker.
Así que finalmente se han decidido por 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 de tiempo de ejecución. Lo cual es bastante derrochador.

Sin embargo, funciona correctamente y logra con éxito 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 Alpine.

Sin embargo, esto funcionó:

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, use el nodo: 10.16.0-alpine):

Dockerfile

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

Uso de un contenedor de Fedora (probablemente también funcione con Ubuntu):

La solución más simple 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 use un 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 el enlace al problema. 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 actualicé mis Dockerfiles para reflejar esto:

FROM chocko/ubuntu:local

Debe haber algo mal con esto porque parece demasiado fácil pasarlo por alto... ¿O es aceptable?

Si usa ‘Alpine’, primero debe instalar ‘tzdata’, consulte aquí How can I set the timezone please? · Issue #136 · gliderlabs/docker-alpine · GitHub

PARA SU INFORMACIÓN . . . Deseo establecer la zona horaria del contenedor en el tiempo de ejecución de docker, no en el tiempo de compilación/dockerfile de docker. El uso de '- v /etc / localtime:/etc / localtime: ro ’ (CentOS) funciona. La fecha de la línea de comandos del contenedor devuelve la fecha en el formato de zona horaria esperado. PERO jenkins que se ejecuta en el contenedor piensa que la zona horaria es UTC. ¿Por qué? /etc / localtime es un enlace simbólico a …/usr / share/zoneinfo / UTC en el contenedor integrado. El contenido del archivo UTC en el contenedor es ahora la nueva zona horaria. Pero jenkins (y quizás otro software basado en Java) usa el nombre del enlace simbólico que sigue siendo “UTC”. En busca de una solución . . .

Necesito 2 cosas, 1. cuando se crea el contenedor, use un script de inicio para establecer el enlace simbólico /etc/localtime y /etc/timezone y 2. para que la zona horaria de jenkins se tome de dos opciones de Java, estas opciones deben pasarse al script de inicio que inicia el proceso de jenkins. por ejemplo, " - Dorg.apache.común.jalea.Tags.fmt.Zona horaria=America / New_York-Duser.zona horaria=America / New_York ". Disculpas, esto es específico de Jenkins, pero espero que sea útil para otros usuarios de Jenkins.