So stellen Sie die Systemzeit dynamisch in einem Docker-Container ein

Gibt es eine Möglichkeit, die Systemzeit eines Docker-Containers dynamisch (zur Laufzeit) festzulegen, ohne den Hostcomputer zu beeinträchtigen?

Wobei

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.

Wobei

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 (Verhalten hängt vom Datum ab).

Andere häufige Anwendungsfälle:

  • ausführen von Legacy-Software mit y2k-Fehlern
  • testsoftware für Jahr-2038-Konformität
  • debuggen von zeitbezogenen Problemen, z. B. abgelaufenen SSL-Zertifikaten
  • laufende Software, die außerhalb eines bestimmten Zeitraums nicht mehr läuft
  • deterministische Bauprozesse.

Es ist möglich

Die Lösung besteht darin, 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 gegebenenfalls Funktionen hinzu:

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

Denken Sie daran, die Umgebungsvariablen festzulegen LD_PRELOAD bevor Sie die Anwendung ausführen, auf die die gefälschte Zeit angewendet werden soll.

Beispiel:

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]

Sie können jetzt die Serverzeit dynamisch ändern:

Beispiel:

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())

Hier ist docker-compose Lösung:

Hinzufügen /etc/localtime:/etc/localtime:ro zu den volumes Attribut.

Überprüfen Sie dies verknüpfen um ein Beispiel zu bekommen.

Starten Sie den Container mit einer zusätzlichen Umgebungsvariablen:

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

Eigentlich habe ich gerade eine Lösung mit der libfaketime gefunden und positiv getestet

Ich werde in Kürze mit einer Antwort + einem Arbeitsbeispiel aktualisieren.

Was wäre der Zweck, dies zu tun? was ist Ihr Anwendungsfall?

Siehe edit.