¿Cómo asegurarse de que la hora de la ventana acoplable se sincronice con la del host?

84

Tengo estibadores funcionando en servidores Linode. A veces, veo que no es el momento adecuado para los estibadores. Actualmente he cambiado el script de ejecución en cada ventana acoplable para incluir las siguientes líneas de código.

yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org

Sin embargo, lo que idealmente me gustaría hacer es que la ventana acoplable sincronice la hora con el host. ¿Hay alguna forma de hacer esto?

Ranjith Ramachandra
fuente
El contenedor utilizará el mismo tiempo que el host. Vea estas preguntas y respuestas con una respuesta de uno de los desarrolladores principales de Docker.
Ben Whaley
Definitivamente, esta es una pregunta duplicada, pero la respuesta incluso a la otra pregunta es hablar de la zona horaria que realmente no me preocupa. El comentario a la respuesta deja en claro que la desviación del reloj no ocurre ya que la ventana acoplable y el host usan el mismo reloj. Gracias Ben por señalarlo.
Ranjith Ramachandra
9
ADVERTENCIA : existe cierta confusión sobre lo que es un host . En sistemas operativos que no sean Linux y Windows 10+ con subsistema Linux, la máquina acoplable (el host) es en realidad una máquina virtual. Cuando el host de la ventana acoplable no es la misma máquina en la que está ejecutando los dockercomandos, es posible que vea un sesgo de tiempo y cosas como el montaje de volúmenes no funcionarán como cabría esperar. Esto también sucede cuando configura una máquina acoplable remota, por ejemplo, en DigitalOcean.
Codificación

Respuestas:

84

La fuente de esta respuesta es el comentario a la respuesta en: ¿El contenedor Docker sincronizará automáticamente el tiempo con la máquina host?

Después de mirar la respuesta, me di cuenta de que no hay forma de que ocurra una desviación del reloj en el contenedor de la ventana acoplable. Docker usa el mismo reloj que el host y no puede cambiarlo. Significa que hacer un ntpdateinside the docker no funciona.

Lo correcto es actualizar la hora del host usando ntpdate

En lo que respecta a la sincronización de zonas horarias, -v /etc/localtime:/etc/localtime:rofunciona.

Ranjith Ramachandra
fuente
4
Dime como puede ser eso Si el expediente usa el mismo reloj que el sistema. ¿En qué puede diferir el reloj de la ventana acoplable del host? Si se produce una desviación del reloj, sucederá en la máquina host de la ventana acoplable, que es donde es necesario corregir la desviación del reloj. Me interesará saber si me equivoco.
Ranjith Ramachandra
10
Al usar Docker en una Mac con boot2docker, la máquina virtual boot2docker puede perder tiempo. Docker permanece sincronizado con su host, pero su host proporciona la hora incorrecta. Reiniciar la máquina virtual es la solución más sencilla para esto.
Nathaniel Waisbrot
56
Ese es un problema totalmente diferente en el que la VM pierde su tiempo. Técnicamente, Docker todavía está sincronizado con su host, que es la VM.
Ranjith Ramachandra
3
@ISJ: boot2docker restartO si ejecuta su propia máquina virtual, puede hacerlo ntpdateallí.
Nathaniel Waisbrot
5
Estoy en Windows. La hora de la máquina host es 15:06, la hora del contenedor es 18:41 ... wtf
willem
37

Puede agregar sus archivos locales (/ etc / timezone y / etc / localtime) como volumen en su contenedor Docker.

Actualice su docker-compose.ymlcon las siguientes líneas.

volumes:
    - "/etc/timezone:/etc/timezone:ro"
    - "/etc/localtime:/etc/localtime:ro"

Ahora el tiempo del contenedor es el mismo que en su host.

que
fuente
¡bonito y limpio! ty!
wopolow
35

Si está utilizando boot2docker y ntp no funciona dentro de la máquina virtual docker (está detrás de un proxy que no reenvía paquetes ntp) pero su host está sincronizado en el tiempo, puede ejecutar lo siguiente desde su host:

docker-machine ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"

De esta manera, está enviando la hora actual de su máquina (en la zona horaria UTC) como una cadena para configurar la hora de la máquina virtual acoplable date(nuevamente en la zona horaria UTC).

NOTA: en Windows, dentro de un shell bash (desde msys git), use:

docker-machine.exe ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"
gvlx
fuente
¡Perfecto! Ese era exactamente mi problema y lo soluciona instantáneamente sin necesidad de reiniciar la máquina acoplable.
qwertzguy
1
¿Es posible configurar los segundos? Intenté agregar% S pero obtengo una hora no válida
Sakib
@Sakib, el datecomando sólo se acepta el formato MMDDhhmm[[CC]YY][.ss]para ajustar la fecha, por lo que añadir segundos, es necesario ponerlos al final de la cadena como esta: +%m%d%H%M%Y.%S.
gvlx
28

Esto es lo que me funcionó con un host Fedora 20. Ejecuté un contenedor usando:

docker run -v /etc/localtime:/etc/localtime:ro -i -t mattdm/fedora /bin/bash

Inicialmente /etc/localtimefue un vínculo suave al /usr/share/zoneinfo/Asia/Kolkataque Indian Standard Time. La ejecución datedentro del contenedor me mostró el mismo tiempo que el del host. Salí del caparazón y detuve el contenedor usando docker stop <container-id>.

A continuación, eliminé este archivo y lo vinculé con /usr/share/zoneinfo/Singaporefines de prueba. La hora del host se estableció en la zona horaria de Singapur. Y luego lo hizo docker start <container-id>. Luego accedió a su caparazón nuevamente usando nsentery descubrió que la hora ahora estaba configurada en la zona horaria de Singapur.

docker start <container-id>
docker inspect -f {{.State.Pid}} <container-id>
nsenter -m -u -i -n -p -t <PID> /bin/bash

Entonces, la clave aquí es usar -v /etc/localtime:/etc/localtime:rocuando ejecute el contenedor por primera vez. Lo encontré en este enlace .

Espero eso ayude.

Dharmit
fuente
esto funcionó para mí en una versión de CentOS Linux 7.6.1810
k4cy
26

Esto restablecerá la hora en el servidor de la ventana acoplable:

docker run --rm --privileged alpine hwclock -s

La próxima vez que cree un contenedor, el reloj debería ser correcto.

Fuente: https://github.com/docker/for-mac/issues/2076#issuecomment-353749995

Cahen
fuente
3
¡Ese es el secreto que estaba buscando! Estaba apagado por días y los certificados estaban de mal humor. ¡Gracias!
Josiah
2
Gracias por esto. Trabajado como un encanto.
Ryan Nutt
¿cómo usarlo con docker-compose?
Surya Swanoff
1
Estaba viendo que el Docker para Windows tan reportado no sincronizaba el tiempo después del error de suspensión, ¡esta solución funcionó como magia! ¿Qué está haciendo?
StackG
11

Si está utilizando docker-machine, las máquinas virtuales pueden desplazarse. Para actualizar el reloj en la máquina virtual sin reiniciar, ejecute:

docker-machine ssh <machine-name|default>
sudo ntpclient -s -h pool.ntp.org

Esto actualizará el reloj en la máquina virtual usando NTP y luego todos los contenedores lanzados tendrán la fecha correcta.

lukecampbell
fuente
El comando funcionó y actualizó la hora. Sin embargo, el tiempo volvió a pasar y tuve que ejecutar el comando nuevamente. ¿Cómo se sincroniza automáticamente dentro del host de la ventana acoplable?
chitti
10

Me enfrentaba a una compensación de tiempo de -1 hora y 4 minutos

Reiniciar Docker me solucionó el problema.

Para configurar la zona horaria en general:

  1. ssh en su contenedor: docker exec -it my_website_name bash

  2. correr dpkg-reconfigure tzdata

  3. correr date
Stefan Diabo
fuente
Esto funcionó para mí desde la consola en macOS High Sierra 10.13.6 (17G65) usando docker-compose :docker-compose exec <servicename> bundle exec dpkg-reconfigure tzdata
Zack Morris
9

Parece que puede variar en el tiempo si está utilizando Docker Machine, como sugiere esta respuesta: https://stackoverflow.com/a/26454059/105562 , debido a VirtualBox.

La solución rápida y fácil es simplemente reiniciar su VM:

docker-machine restart default
Travis Reeder
fuente
1
en la ventana acoplable no era una máquina predeterminada, reinicié el demonio sobre la pestaña de reinicio en el programa de configuración de la ventana acoplable que se envió con las ventanas acoplables, después de eso, el tiempo estuvo bien
wutzebaer
9

Tengo lo siguiente en el archivo de redacción

volumes:
  - "/etc/timezone:/etc/timezone:ro"
  - "/etc/localtime:/etc/localtime:ro"

Entonces todo bien en la ventana acoplable Gerrit con su replication_log configurado con la marca de tiempo correcta.

j3ffyang
fuente
Tengo contenedores Debian (9) en el host CentOS (7), y el montaje de localtime funciona, pero la zona horaria no puede, porque en el host es el directorio mientras que en el contenedor es el archivo.
tometchy
6

Para docker en macOS, puede usar docker-time-sync-agent . Esto funciona para mi.

cranehuang
fuente
Aparentemente, esto está arreglado ahora github.com/docker/for-mac/issues/17
Ryan R
El tiempo de desincronización aún ocurre en la versión 18.03.1-ce-mac65 de la ventana acoplable y esta solución lo corrige.
Hana Alaydrus
5

Con Docker para Windows tuve que marcar

MobyLinuxVM > Settings > Integration Services > Time synchronization 

en el administrador de Hyper-V y funcionó

Christian Opitz
fuente
Sin embargo, hay un problema. Parece que después de reiniciar el host, la configuración no está marcada
user725408
Sí, esto parece suceder en algunas compilaciones de Windows (consulte github.com/docker/for-win/issues/409 )
Christian Opitz
1
En mi caso, esa casilla de verificación ya está marcada, pero el tiempo del contenedor está tres días por detrás del tiempo del host.
Scott Hutchinson
5

uso de docker-compose:

Agregue /etc/localtime:/etc/localtime:roal volumesatributo:

version: '3'

services:
  a-service:
      image: service-name
      container_name: container-name
      volumes:
        - /etc/localtime:/etc/localtime:ro
Benyamin Jafari
fuente
3

Aunque esta no es una solución general para todos los hosts, alguien puede encontrarla útil. Si sabe dónde se encuentra (Reino Unido para mí), mire la tianon'srespuesta aquí .

FROM alpine:3.6
RUN apk add --no-cache tzdata
ENV TZ Europe/London

Esto es lo que agregué a mi Dockerfile ^ y se solucionó el problema de la zona horaria.

batristio
fuente
1

Uso de Docker

Aquí hay un ejemplo completo que crea una imagen de Docker para una aplicación Go en una compilación de varias etapas. Muestra cómo incluir la zona horaria en su imagen.

FROM golang:latest as builder

WORKDIR /app

ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

COPY go.mod .
COPY go.sum .

RUN go mod download

COPY . .

RUN go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o main

### Certs
FROM alpine:latest as locals

RUN apk --update --no-cache add ca-certificates

RUN apk add --no-cache tzdata

### App
FROM scratch 

WORKDIR /root/

COPY --from=locals /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt

COPY --from=builder app/main .

COPY --from=builder app/templates ./templates

COPY --from=locals /usr/share/zoneinfo /usr/share/zoneinfo

ENV TZ=Asia/Singapore

EXPOSE 8000

CMD ["./main"]
Markhorrocks
fuente
1

Para mí, reiniciar Docker Desktop no ayudó. Apagar Win10 y comenzar de nuevo, ayudó.

Csongor Halmai
fuente
1

Usuarios de Windows:

La solución es muy simple. Simplemente abra un indicador de PowerShell e ingrese:

docker run --privileged --rm alpine date -s "$(Get-Date ([datetime]::UtcNow) -UFormat "+%Y-%m-%d %H:%M:%S")"

Para comprobar que funciona, ejecute el comando:

docker run --rm -it alpine date


Mi solución está inspirada en algo que encontré en el hilo del foro de Docker. De todos modos, fue la única solución que funcionó para mí en el escritorio de la ventana acoplable, excepto para reiniciar mi máquina (que también funciona). Aquí hay un enlace al hilo original: https://forums.docker.com/t/syncing-clock-with-host/10432/23

La diferencia entre la respuesta del hilo y la mía es que la mía convierte la hora a la hora UTC, que es necesaria para, por ejemplo, AWS. De lo contrario, la respuesta original del foro se ve así:

docker run --privileged --rm alpine date -s "$(date -u "+%Y-%m-%d %H:%M:%S")"

Andreas Forslöw
fuente