web-dev-qa-db-fra.com

Comment s'assurer que l'heure du docker est synchronisée avec celle de l'hôte?

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?

49

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.

55

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)"
32
gvlx

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.

22
Dharmit

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

16
thhan

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.

10
lukecampbell

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:

  1. sSH dans votre conteneur: docker exec -it my_website_name bash

  2. courir dpkg-reconfigure tzdata

  3. lancer date
7
Stefan Diabo

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
6
Travis Reeder

Pour docker sur macOS, vous pouvez utiliser docker-time-sync-agent . Ça marche pour moi.

6
cranehuang

Avec docker pour Windows je devais cocher

MobyLinuxVM > Settings > Integration Services > Time synchronization 

dans le gestionnaire Hyper-V et cela a fonctionné

5
Christian Opitz

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É

5
j3ffyang

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

2
cahen

utilisation de docker-compose:

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
2
Benyamin Jafari

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é.

0
Hristo Krastevski