Подтвердить что ты не робот

Как убедиться, что время докера синхронизируется с временем хоста?

У меня есть докеры, работающие на серверах Linode. Время от времени я вижу, что время не подходит для докеров. В настоящее время я изменил прогон script в каждом докере, чтобы включить следующие строки кода.

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

То, что я в идеале хотел бы сделать, заключается в том, что докер должен синхронизировать время с хостом. Есть ли способ сделать это?

4b9b3361

Ответ 1

Источником этого ответа является комментарий к ответу по адресу: Будет ли контейнер Docker автоматически синхронизировать время с хостом?

Посмотрев на ответ, я понял, что на док-контейнере не будет никакого смещения часов. Докер использует те же часы, что и хост, и докер не может их изменить. Это означает, что выполнение ntpdate внутри докера не работает.

Правильная вещь, чтобы сделать, это обновить время хоста с помощью ntpdate

Что касается синхронизации часовых -v/etc/localtime: /etc/localtime:ro, то -v/etc/localtime: /etc/localtime:ro работает.

Ответ 2

Если вы используете boot2docker, а ntp не работает внутри VM Docker (вы находитесь за прокси-сервером, который не передает пакеты ntp), но ваш хост синхронизирован по времени, вы можете запустить после вашего хоста:

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

Таким образом, вы отправляете текущее время вашего компьютера (в часовой пояс UTC) в виде строки, чтобы установить время VM в докере, используя date (снова в часовом поясе UTC).

ПРИМЕЧАНИЕ. В Windows внутри оболочки bash (из msys git) используйте:

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

Ответ 3

Это то, что сработало для меня с хостом Fedora 20. Я запустил контейнер, используя:

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

Изначально /etc/localtime была мягкой ссылкой на /usr/share/zoneinfo/Asia/Kolkata, в индийском стандартном времени. Выполнение date внутри контейнера показало мне то же время, что и на хосте. Я вышел из оболочки и остановил контейнер, используя docker stop <container-id>.

Затем я удалил этот файл и привязал его к /usr/share/zoneinfo/Singapore для целей тестирования. Время пребывания было установлено в часовом поясе Сингапура. А затем сделал docker start <container-id>. Затем снова получил доступ к своей оболочке с помощью nsenter и обнаружил, что время теперь установлено на часовой пояс в Сингапуре.

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

Итак, ключ здесь - использовать -v /etc/localtime:/etc/localtime:ro при первом запуске контейнера. Я нашел его на этой ссылке.

Надеюсь, что это поможет.

Ответ 4

Вы можете добавить локальные файлы (/etc/timezone и /etc/localtime ) в качестве тома в контейнере докеров.

Обновите docker-compose.yml следующими строками.

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

Теперь время контейнера такое же, как на вашем хосте

Ответ 5

Если вы используете докер-машину, виртуальные машины могут дрейфовать. Чтобы обновить часы на виртуальной машине без перезапуска, выполните следующие действия:

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

Это приведет к обновлению часов на виртуальной машине с использованием NTP, а затем все запущенные контейнеры будут иметь правильную дату.

Ответ 6

Я столкнулся со смещением по времени на 1 час и 4 мин

Перезапуск Docker сам исправил проблему для меня.

Чтобы установить часовой пояс в целом:

  • ssh в контейнер: docker exec -it my_website_name bash

  • run dpkg-reconfigure tzdata

  • run date

Ответ 7

Похоже, что при использовании Docker Machine может произойти дрейф времени, поскольку этот ответ подсказывает: fooobar.com/questions/67794/... из-за VirtualBox.

Быстрое и простое исправление - просто перезапустить виртуальную машину:

docker-machine restart default

Ответ 8

Для docker в macOS вы можете использовать docker-time-sync-agent. Меня устраивает.

Ответ 9

У меня есть следующее в файле компоновки

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

Затем все хорошее в докере Gerrit с его установкой replication_log w/correct timestamp.:-D

Ответ 10

С докере для окон мне нужно было отметить

MobyLinuxVM > Settings > Integration Services > Time synchronization 

в диспетчере Hyper-V, и он работал

Ответ 11

использование docker-compose:

Добавьте /etc/localtime: /etc/localtime:ro в атрибут volumes:

version: '3'

services:
  a-service:
      build: .
      image: service-name
      container_name: container-name
      volumes:
        - /etc/localtime:/etc/localtime:ro

Ответ 12

Это сбросит время на док-сервере:

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

В следующий раз, когда вы создадите контейнер, часы должны быть правильными.

Источник: https://github.com/docker/for-mac/issues/2076#issuecomment-353749995

Ответ 13

Хотя это не общее решение для каждого хоста, кто-то может найти его полезным. Если вы знаете, где находитесь (Великобритания для меня), посмотрите ответ tianon's здесь.

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

Это то, что я добавил в свой Dockerfile ^, и проблема с часовым поясом была исправлена.