J'ai des dockers fonctionnant sur des serveurs Linode. Parfois, je vois que l'heure n'est pas juste sur les dockers. Actuellement, j'ai modifié le script d'exécution dans chaque menu fixe pour inclure les lignes de code suivantes.
yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org
Ce que je voudrais idéalement cependant faire est que le menu fixe doit synchroniser l'heure avec l'hôte. Y a-t-il un moyen de faire cela?
La source de cette réponse est le commentaire de la réponse à l'adresse suivante: L'heure de synchronisation automatique du conteneur docker avec l'ordinateur hôte?
Après avoir examiné la réponse, je me suis rendu compte qu’il n’y avait aucune dérive de l’horloge sur le conteneur du docker. Docker utilise la même horloge que l'hôte et le docker ne peut pas la modifier. Cela signifie que faire un ntpdate
à l'intérieur du menu fixe ne fonctionne pas.
La bonne chose à faire est de mettre à jour l'heure de l'hôte en utilisant ntpdate
En ce qui concerne la synchronisation des fuseaux horaires, -v /etc/localtime:/etc/localtime:ro
travaux.
Si vous utilisez boot2docker et que ntp ne fonctionne pas dans le menu fixe VM ( vous êtes derrière un proxy qui ne transmet pas les paquets ntp) mais votre hôte est synchronisé dans le temps, vous pouvez exécuter les opérations suivantes à partir de votre hôte:
docker-machine ssh default "Sudo date -u $(date -u +%m%d%H%M%Y)"
De cette manière, vous envoyez l'heure actuelle de votre machine (dans le fuseau horaire UTC) sous forme de chaîne pour définir le menu fixe VM heure utilisant date
(encore dans le fuseau horaire UTC).
NOTE: sous Windows, dans un shell bash (à partir du msit git), utilisez:
docker-machine.exe ssh default "Sudo date -u $(date -u +%m%d%H%M%Y)"
C'est ce qui a fonctionné pour moi avec un hôte Fedora 20. J'ai couru un conteneur en utilisant:
docker run -v /etc/localtime:/etc/localtime:ro -i -t mattdm/Fedora /bin/bash
Initialement /etc/localtime
était un lien symbolique vers /usr/share/zoneinfo/Asia/Kolkata
quelle heure normale de l'Inde. L'exécution de date
à l'intérieur du conteneur m'a montré la même heure que celle sur l'hôte. J'ai quitté le shell et arrêté le conteneur en utilisant docker stop <container-id>
.
Ensuite, j'ai supprimé ce fichier et l'ai lié à /usr/share/zoneinfo/Singapore
à des fins de test. L'heure hôte a été réglée sur le fuseau horaire de Singapour. Et ensuite, docker start <container-id>
. Puis, accédant à nouveau à son shell à l’aide de nsenter
, il s’est avéré que l’heure était maintenant réglée sur le fuseau horaire de Singapour.
docker start <container-id>
docker inspect -f {{.State.Pid}} <container-id>
nsenter -m -u -i -n -p -t <PID> /bin/bash
Donc, la clé ici est d'utiliser -v /etc/localtime:/etc/localtime:ro
lorsque vous exécutez le conteneur pour la première fois. Je l'ai trouvé sur ce lien .
J'espère que ça aide.
Vous pouvez ajouter vos fichiers locaux (/ etc/timezone et/etc/localtime) en tant que volume dans votre conteneur Docker.
Mettez à jour votre docker-compose.yml
avec les lignes suivantes.
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
Maintenant, le temps de conteneur est le même que sur votre hôte
Si vous utilisez docker-machine, les machines virtuelles peuvent dériver. Pour mettre à jour l'horloge sur la machine virtuelle sans redémarrer, exécutez:
docker-machine ssh <machine-name|default>
Sudo ntpclient -s -h pool.ntp.org
Ceci mettra à jour l'horloge sur la machine virtuelle en utilisant NTP) et tous les conteneurs lancés auront la date correcte.
Je faisais face à un décalage horaire de -1 heure et 4min
Le redémarrage de Docker lui-même a résolu le problème pour moi.
Pour définir le fuseau horaire en général:
sSH dans votre conteneur: docker exec -it my_website_name bash
courir dpkg-reconfigure tzdata
date
Il semble qu'il puisse y avoir une dérive temporelle si vous utilisez Docker Machine, comme le suggère cette réponse: https://stackoverflow.com/a/26454059/105562 , en raison de VirtualBox.
La solution rapide et facile consiste simplement à redémarrer votre machine virtuelle:
docker-machine restart default
Pour docker sur macOS, vous pouvez utiliser docker-time-sync-agent . Ça marche pour moi.
Avec docker pour Windows je devais cocher
MobyLinuxVM > Settings > Integration Services > Time synchronization
dans le gestionnaire Hyper-V et cela a fonctionné
J'ai le suivant dans le fichier de composition
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
Ensuite, tout va bien dans Gerrit docker avec son replication_log défini avec un horodatage correct. :-RÉ
Cela réinitialisera l’heure sur le serveur Docker:
docker run --rm --privileged Alpine hwclock -s
La prochaine fois que vous créez un conteneur, l'horloge doit être correcte.
Source: https://github.com/docker/for-mac/issues/2076#issuecomment-353749995
Ajouter /etc/localtime:/etc/localtime:ro
à l'attribut volumes
:
version: '3'
services:
a-service:
build: .
image: service-name
container_name: container-name
volumes:
- /etc/localtime:/etc/localtime:ro
Bien que ce ne soit pas une solution générale pour chaque hôte, quelqu'un peut la trouver utile. Si vous savez où vous êtes basé (Royaume-Uni pour moi), alors regardez tianon's
_ répondre ici .
FROM Alpine:3.6
RUN apk add --no-cache tzdata
ENV TZ Europe/London
C’est ce que j’ai ajouté à mon fichier Dockerfile ^ et le problème du fuseau horaire a été corrigé.