¿Hay alguna forma de configurar el tiempo de un sistema de contenedores Docker dinámicamente (en tiempo de ejecución) sin afectar la máquina host?
Utilizando
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.
Utilizando
date -s "2 OCT 2006 18:00:00"
da el siguiente error:
date: cannot set date: Operation not permitted
Caso de uso:
Necesito probar un software sensible al tiempo (el comportamiento depende de la fecha).
Otros casos de uso común:
- ejecutando software heredado con errores y2k
- prueba de software para el cumplimiento del año 2038
- depuración de problemas relacionados con el tiempo, como certificados SSL caducados
- Ejecutar software que deja de ejecutarse fuera de un cierto período de tiempo
- Procesos de construcción deterministas.
Respuestas:
Es posible
La solución es fingirlo en el contenedor. Esta biblioteca intercepta todos los programas de llamadas al sistema que utilizan para recuperar la fecha y hora actuales.
La implementación es fácil. Agregue funcionalidad a su Dockerfile según corresponda:
Recuerde configurar las variables de entorno
LD_PRELOAD
antes de ejecutar la aplicación a la que desea aplicar el tiempo falso.Ejemplo:
Ahora puede cambiar dinámicamente la hora del servidor:
Ejemplo:
fuente
Jenny D tiene razón en que, por defecto, el contenedor Docker no permite el acceso al reloj del sistema.
Sin embargo, en Linux, si está de acuerdo con que su contenedor tenga acceso a esta capacidad, puede permitir esta capacidad utilizando la opción "--cap-add = SYS_TIME" del comando "docker run" al crear su contenedor:
Luego, puede cambiar el tiempo desde el interior del contenedor en ejecución:
Documentación de referencia: https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities
fuente
Inicie el contenedor con una variable de entorno adicional:
fuente
solución de docker-compose:
Añadir
/etc/localtime:/etc/localtime:ro
alvolumes
atributo.Mira este enlace para ver un ejemplo.
fuente