我有在Linode服务器上运行的docker。有时,我看到码头工人的时间不对。目前我已经更改了每个docker中的运行脚本以包含以下代码行。
yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org
然而,我理想的做法是,docker应该与主机同步时间。有没有办法做到这一点?
这个答案的来源是对答案的评论:Will docker container auto sync time with the host machine?
看了答案之后,我意识到Docker容器上不会发生时钟漂移。 Docker使用与主机相同的时钟,而docker无法更改它。这意味着在docker中做一个ntpdate
是行不通的。
正确的做法是使用ntpdate
更新主机时间
就同步时区而言,-v /etc/localtime:/etc/localtime:ro
有效。
对于windows的docker,我不得不打勾
MobyLinuxVM > Settings > Integration Services > Time synchronization
在Hyper-V管理器中,它工作正常
将/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
这将重置docker服务器中的时间:
docker run --rm --privileged alpine hwclock -s
下次创建容器时,时钟应该是正确的。
资料来源:https://github.com/docker/for-mac/issues/2076#issuecomment-353749995
虽然这不是每个主机的通用解决方案,但有人可能会发现它很有用。如果你知道你在哪里(英国对我来说),那么看看tianon's
回答here。
FROM alpine:3.6
RUN apk add --no-cache tzdata
ENV TZ Europe/London
这是我添加到我的Dockerfile ^,并修复了时区问题。
如果您正在使用boot2docker并且ntp在docker VM中不起作用(您位于不转发ntp数据包的代理后面)但是您的主机是时间同步的,则可以从主机运行以下命令:
docker-machine ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"
这样,您将使用date
(再次以UTC时区为单位)将机器的当前时间(以UTC时区为单位)发送为字符串以设置泊坞窗VM时间。
注意:在Windows中,在bash shell(来自msys git)中,使用:
docker-machine.exe ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"
这对Fedora 20主机来说非常有用。我运行了一个容器:
docker run -v /etc/localtime:/etc/localtime:ro -i -t mattdm/fedora /bin/bash
最初/etc/localtime
是印度标准时间的/usr/share/zoneinfo/Asia/Kolkata
的软链接。在容器内执行date
显示我与主机上的时间相同。我从shell退出并使用docker stop <container-id>
停止了容器。
接下来,我删除了这个文件并将其链接到/usr/share/zoneinfo/Singapore
以进行测试。主持人时间设定为新加坡时区。然后做了docker start <container-id>
。然后使用nsenter
再次访问它的shell,发现时间现在设置为新加坡时区。
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
。我在this link找到了它。
希望能帮助到你。
您可以在docker-container中将本地文件(/ etc / timezone和/ etc / localtime)添加为卷。
使用以下行更新您的docker-compose.yml
。
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
现在,容器时间与主机上的时间相同
如果您使用的是docker-machine,虚拟机可能会漂移。要在不重新启动运行的情况下更新虚拟机上的时钟:
docker-machine ssh <machine-name|default>
sudo ntpclient -s -h pool.ntp.org
这将使用NTP更新虚拟机上的时钟,然后启动的所有容器将具有正确的日期。
我正面临着-1小时和4分钟的时间偏移
重启Docker本身为我解决了这个问题。
一般设置时区:
docker exec -it my_website_name bash
dpkg-reconfigure tzdata
date
如果您正在使用Docker Machine,那么可能会出现时间漂移,因为这个响应表明:https://stackoverflow.com/a/26454059/105562,由于VirtualBox。
快速简便的解决方法是重新启动VM:
docker-machine restart default
对于macOS上的docker,您可以使用docker-time-sync-agent。这个对我有用。
我在compose文件中有以下内容
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
然后Gerrit docker中的所有好东西,其replication_log设置为正确的时间戳。 :-D