¿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
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:
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:
# 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.
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?
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.