Est-il possible de changer la date dans Docker container?
j'ai un conteneur avec un programme en cours d'exécution à l'intérieur de tomcat. Je dois changer la date seulement dans ce container et tester mon comportement de programme. J'ai une logique temporelle, et j'ai parfois besoin de voir ce qui se passe quelques jours ou mois plus tard. Est-il possible dans le panneau? J'ai lu que si je change la date dans le conteneur, la date sera changée sur le système hôte. Mais c'est une mauvaise idée pour moi. J'ai besoin d'avoir quelques instances de cette application sur un serveur et d'avoir des possibilités de configurer différentes heures pour chaque instance.
Mais quand j'essaie de changer la date à l'intérieur du conteneur, j'obtiens l'erreur:
sudo date 04101812
date: cannot set date: Operation not permitted
Fri Apr 10 18:12:00 UTC 2015
5 réponses
il est tout à fait possible de changer dynamiquement l'heure dans un conteneur Docker, sans affecter L'OS de l'hôte.
La solution est faux. lib intercepte tous les appels système les programmes pour récupérer l'heure et la date actuelles.
la mise en oeuvre est facile. Ajouter des fonctionnalités à votre Dockerfile:
WORKDIR /
RUN git clone https://github.com/wolfcw/libfaketime.git
WORKDIR /libfaketime/src
RUN make install
n'oubliez pas de définir les variables d'environnement LD_PRELOAD
avant de lancer l'application, vous voulez que le faux temps appliqué.
Exemple:
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]
vous pouvez maintenant changer dynamiquement l'heure des serveurs:
Exemple:
def set_time(request):
import os
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())
ce n'est pas possible avec Docker. Docker utilise la même horloge que le noyau extérieur. Ce qu'il vous faut, c'est une virtualisation complète qui émule un PC complet.
sudo
échoue car il ne fait que vous root
de l'environnement virtuel à l'intérieur du conteneur. Cet utilisateur n'est pas lié au réel root
du système hôte (sauf par le nom et l'UID) et il ne peut pas faire ce que le réel root
pourrait le faire.
vous utilisez un langage de haut niveau comme Python ou Java, vous souvent ont des crochets où vous pouvez simuler un certain temps du système pour les tests ou vous pouvez écrire le code qui enveloppe "obtenir le temps actuel du système" et renvoie ce que votre test exige.
Cela a fonctionné pour moi, peut-être que vous pourriez essayer:
dpkg-reconfigure tzdata
Edit: exécutez-le dans le conteneur que vous avez des problèmes. Une interface apparaîtra. Là, vous pouvez éditer le fuseau horaire et localtime par exemple, et le régler correctement, ce qui a corrigé mon problème, c'était le même que le vôtre.
Bonne chance!
pour moi, j'avais en fait besoin de fixer la date réelle pour les tests. J'ai trouvé que les options suivantes fonctionnent sur Mac, mais vous devez réaliser que vous allez changer la date pour tous vos conteneurs parce que vous changez la date de la VM Alpine sous-jacente que Docker utilise pour tous ses conteneurs.
OPTION 1: changer la date de votre machine hôte & redémarrer docker
utilisez ceci quand:
- Vous pouvez redémarrer docker.
- vous pouvez changer la date de votre machine hôte
Mesures:
- arrêtez vos conteneurs.
- modifier la date de votre machine via les préférences Date & Heure
- redémarrez docker.
- démarrez vos conteneurs.
Exécuter cette séquence à nouveau pour revenir à la bonne date et heure.
OPTION 2: Changer la date de la VM Alpine
Utilisation cette quand:
- vous ne pouvez pas redémarrer docker.
- Vous ne pouvez pas définir la date de votre machine hôte
Mesures:
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
- L'écran commence à vide, appuyez sur entrée plusieurs fois.
date -s [hh:mm]
- tous vos conteneurs docker auront maintenant votre nouveau temps. Vous pouvez utilisez également d'autres formats, recherchez la documentation sur "Date busybox" comme ce n'est pas tout à fait la même chose que les autres date implémentations.
- Pour quitter le menu appuyez sur
control-a :
et tapezd
- ceci désactive la session écran, mais laisse l'ATS en marche.
Pour réinitialiser le temps:
screen -r
- ceci reprend votre ATS.
ntpd -q
- utilise le serveur défini dans /etc/ntp.conf (cela ressemble à un pont magique de retour à l'hôte l'horloge)
- Pour quitter le menu appuyez sur
control-a :
et tapezquit
- ceci met fin à votre session écran et ATS.
Oui, je l'ai testé et il fonctionne!
utiliser --privileged
quand vous lancez votre image
exemple:
docker run -i -t --rm --privileged my_image /bin/bash