Gibt es eine Möglichkeit, die Systemzeit eines Docker-Containers dynamisch (zur Laufzeit) festzulegen, ohne dass dies Auswirkungen auf den Host-Computer hat?
Verwenden
hwclock --set --date "Sat Aug 17 08:31:24 PDT 2016"
gibt den folgenden Fehler aus:
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.
Verwenden
date -s "2 OCT 2006 18:00:00"
gibt den folgenden Fehler aus:
date: cannot set date: Operation not permitted
Anwendungsfall:
Ich muss zeitkritische Software testen (das Verhalten hängt vom Datum ab).
Andere häufige Anwendungsfälle:
- Ausführen von Legacy-Software mit y2k-Fehlern
- Testsoftware für die Jahr-2038-Compliance
- Debuggen von zeitbezogenen Problemen, z. B. abgelaufene SSL-Zertifikate
- Ausführen von Software, die außerhalb eines bestimmten Zeitraums nicht mehr ausgeführt wird
- deterministische Build-Prozesse.
Antworten:
Es ist möglich
Die Lösung ist, es im Behälter zu fälschen. Diese Bibliothek fängt alle Systemaufrufprogramme ab, die zum Abrufen der aktuellen Uhrzeit und des aktuellen Datums verwendet werden.
Die Implementierung ist einfach. Fügen Sie Ihrer Docker-Datei nach Bedarf Funktionen hinzu:
Denken Sie daran, die Umgebungsvariablen festzulegen,
LD_PRELOAD
bevor Sie die Anwendung ausführen, auf die die gefälschte Zeit angewendet werden soll.Beispiel:
Sie können die Serverzeit jetzt dynamisch ändern:
Beispiel:
quelle
Jenny D hat insofern Recht, als der Docker-Container standardmäßig keinen Zugriff auf die Systemuhr zulässt.
Unter Linux können Sie diese Funktion jedoch mit der Option "--cap-add = SYS_TIME" des Befehls "docker run" zulassen, wenn Ihr Container Zugriff auf diese Funktion hat:
Dann können Sie die Zeit im laufenden Container ändern:
Referenzdokumentation: https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities
quelle
Starten Sie den Container mit einer zusätzlichen Umgebungsvariablen:
quelle
Docker-Compose-Lösung:
In
/etc/localtime:/etc/localtime:ro
an dasvolumes
Attribut.Schauen Sie sich diesen Link für ein Beispiel an.
quelle