Cómo establecer la hora del sistema dinámicamente en un contenedor Docker

Hay alguna forma de establecer una hora del sistema de contenedores Docker dinámicamente (en tiempo de ejecución) sin afectar la máquina host?

Utilizar

hwclock --set --date "Sat Aug 17 08:31:24 PDT 2016"

da el siguiente error:

hwclock: Cannot access the Hardware Clock via any known method.hwclock: Use the --debug option to see the details of our search for an access method.

Utilizar

date -s "2 OCT 2006 18:00:00"

da el siguiente error:

date: cannot set date: Operation not permitted

Caso de uso:

Necesito probar software sensible al tiempo (el comportamiento depende de la fecha).

Otros casos de uso comunes:

  • ejecución de software heredado con errores y2k
  • software de pruebas para el cumplimiento del año 2038
  • depuración de problemas relacionados con el tiempo, como certificados SSL caducados
  • ejecución de software que deja de ejecutarse fuera de un determinado período de tiempo
  • procesos de construcción deterministas.

Es posible

La solución es falsificarlo en el recipiente. Esta biblioteca intercepta todas las llamadas al sistema que los programas utilizan para recuperar la fecha y la hora actuales.

La implementación es fácil. Agregue funcionalidad a su Dockerfile según corresponda:

WORKDIR /RUN git clone https://github.com/wolfcw/libfaketime.gitWORKDIR /libfaketime/srcRUN make install

Recuerde establecer las variables de entorno LD_PRELOAD antes de ejecutar la aplicación a la que desea que se aplique la hora falsa.

Ejemplo:

CMD ["/bin/sh", "-c", "LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME_NO_CACHE=1 python /srv/intercept/manage.py runserver 0.0.0.0:3000]

Ahora puede cambiar dinámicamente la hora de los servidores:

Ejemplo:

import osdef set_time(request):    print(datetime.today())    os.environ["FAKETIME"] = "2020-01-01"  # Note: time of type string must be in the format "YYYY-MM-DD hh:mm:ss" or "+15d"    print(datetime.today())

Aca docker-compose solución:

Añadir /etc/localtime:/etc/localtime:ro a la volumes atributo.

Compruebe esto enlace para obtener un ejemplo.

Inicie el contenedor con una variable de entorno adicional:

docker run -e "SET_CONTAINER_TIMEZONE=true" \           -e "CONTAINER_TIMEZONE=US/Arizona" [docker image name]

En realidad, acabo de encontrar y probar positivamente una solución usando libfaketime

Actualizaré con una respuesta + ejemplo de trabajo en breve.

¿Cuál sería el propósito de hacerlo? ¿cuál es tu caso de uso?

Por favor, vea editar.