我在Linode服务器上运行了docker。有时,我看到码头工人的时间不对。目前,我已经更改了每个docker中的运行脚本,以包含以下代码行。
yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org
然而,我理想的做法是,docker应该与主机同步时间。有没有办法做到这一点?
答案 0 :(得分:49)
此答案的来源是对答案的评论:Will docker container auto sync time with the host machine?
在看了答案之后,我意识到Docker容器上不会发生时钟漂移。 Docker使用与主机相同的时钟,而docker无法更改它。这意味着在docker中执行ntpdate
不起作用。
正确的做法是使用ntpdate
就同步时区而言,-v /etc/localtime:/etc/localtime:ro
有效。
答案 1 :(得分:29)
如果你正在使用 boot2docker 并且ntp 在docker VM中没有工作(你是在不转发ntp数据包的代理的后面),而是你的主机是时间同步的,您可以从主机运行以下命令:
docker-machine ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"
这样您就可以将机器的当前时间(以UTC时区为单位)作为字符串发送,以使用date
(再次以UTC时区为单位)设置泊坞窗VM时间。
注意:在Windows中,在bash shell(来自msys git)中,使用:
docker-machine.exe ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"
答案 2 :(得分:19)
这对我使用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找到了它。
希望它有所帮助。
答案 3 :(得分:12)
您可以在docker-container中将本地文件(/ etc / timezone和/ etc / localtime)添加为卷。
使用以下行更新docker-compose.yml
。
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
现在,容器时间与主机上的相同
答案 4 :(得分:9)
如果您正在使用泊坞机,虚拟机可能会漂移。要在不重新启动运行的情况下更新虚拟机上的时钟,请执行以下操作:
docker-machine ssh <machine-name|default>
sudo ntpclient -s -h pool.ntp.org
这将使用NTP更新虚拟机上的时钟,然后启动的所有容器将具有正确的日期。
答案 5 :(得分:6)
我面临时间偏移-1小时和4分钟
重启Docker本身为我解决了这个问题。
一般设置时区:
ssh到你的容器中:
docker exec -it my_website_name bash
运行dpkg-reconfigure tzdata
date
答案 6 :(得分:5)
如果您正在使用Docker Machine,那么可能会出现时间漂移,因为这个响应表明:https://stackoverflow.com/a/26454059/105562,归因于VirtualBox。
快速简便的解决方法是重新启动VM:
docker-machine restart default
答案 7 :(得分:5)
对于macOS上的docker,您可以使用docker-time-sync-agent。它对我有用。
答案 8 :(得分:3)
使用docker for windows我必须打勾
MobyLinuxVM > Settings > Integration Services > Time synchronization
在Hyper-V管理器中并且它可以工作
答案 9 :(得分:3)
我在撰写文件中有以下内容
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
然后Gerrit docker中的所有好东西,其replication_log设置为正确的时间戳。 :-D
答案 10 :(得分:1)
我在 Windows 上看到了这个,从 docker-compose 启动 Prometheus。我有 15 小时的时间漂移。
如果您在 WSL 上运行 Docker 桌面,您可以尝试从 powershell 提示符运行 wsl --shutdown
。
Docker Desktop 应该会重新启动,您可以再次尝试运行您的 docker 容器。
为我工作,我不必重新启动。
答案 11 :(得分:1)
对我来说,重新启动Docker Desktop并没有帮助。关闭Win10并重新启动它,确实有帮助。
答案 12 :(得分:1)
Docker使用情况
这是一个完整的示例,它以多阶段构建为go应用构建docker镜像。它显示了如何在图像中包括时区。
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"]
答案 13 :(得分:1)
我发现,如果您的计算机进入睡眠状态,则Docker容器将不同步。
https://forums.docker.com/t/time-in-container-is-out-of-sync/16566
我在这里发表了一篇关于它的文章 Certificate always expires 5 days ago in Docker
答案 14 :(得分:1)
将Median
添加到/etc/localtime:/etc/localtime:ro
属性:
volumes
答案 15 :(得分:0)
尽管这并不是每个主机的通用解决方案,但有人可能会发现它很有用。如果您知道自己的居住地(对我来说是英国),那么请看tianon's
回答here。
FROM alpine:3.6
RUN apk add --no-cache tzdata
ENV TZ Europe/London
这是我添加到Dockerfile ^中的内容,时区问题已修复。
答案 16 :(得分:0)
在Windows功能中启用Hyper-V解决了该问题: Windows Features
答案 17 :(得分:0)
这将重置Docker服务器中的时间:
docker run --rm --privileged alpine hwclock -s
下次创建容器时,时钟应该正确。
来源:https://github.com/docker/for-mac/issues/2076#issuecomment-353749995
答案 18 :(得分:0)
解决方案非常简单。只需打开powershell提示并输入:
docker run --privileged --rm alpine date -s "$(Get-Date ([datetime]::UtcNow) -UFormat "+%Y-%m-%d %H:%M:%S")"
要检查其是否有效,请运行以下命令:
docker run --rm -it alpine date
我的解决方案受到在docker论坛线程中发现的启发。无论如何,这是在docker桌面上对我唯一有效的解决方案,除了重启我的机器(也可以)。这是原始线程的链接:https://forums.docker.com/t/syncing-clock-with-host/10432/23
线程答案和我的问题之间的区别是我的将时间转换为UTC时间,这对于例如AWS。否则,论坛的原始答案将如下所示:
docker run --privileged --rm alpine date -s "$(date -u "+%Y-%m-%d %H:%M:%S")"
答案 19 :(得分:0)
无论出于何种原因,这些答案都没有解决我的问题。
它与我创建的图像的 docker 日期/时间无关。这与我当地的 WSL 日期时间有关。
一旦我运行 sudo ntpdate-debian
一切正常。
如果您没有 ntp,只需安装它并运行命令。如果您不使用 debian,那么您可能没有 shell 脚本 ntpdate-debian,但您也可以使用 ntpd -gq
。基本上只需更新主要 WSL 发行版的日期。