我在Linode服务器上运行了docker。有时,我看到码头上的时间不正确。目前,我已经在每个docker中更改了运行脚本,以包括以下代码行。
yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org
但是,我理想地希望做的是docker应该与主机同步时间。有没有办法做到这一点?
我在Linode服务器上运行了docker。有时,我看到码头上的时间不正确。目前,我已经在每个docker中更改了运行脚本,以包括以下代码行。
yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org
但是,我理想地希望做的是docker应该与主机同步时间。有没有办法做到这一点?
docker
命令的主机不在同一台机器上时,您可能会发现时间偏移,并且诸如挂载卷之类的事情将无法按预期工作。当您在例如DigitalOcean上设置远程docker计算机时,也会发生这种情况。
Answers:
该答案的来源是对该答案的评论:docker容器会自动与主机同步时间吗?
查看答案后,我意识到docker容器上不会发生时钟漂移。Docker使用与主机相同的时钟,并且Docker无法更改它。这意味着ntpdate
在docker内部进行操作不起作用。
正确的做法是使用来更新主机时间 ntpdate
就同步时区而言,它是可行的-v /etc/localtime:/etc/localtime:ro
。
boot2docker restart
或者,如果您运行自己的VM,则可以ntpdate
在那里。
如果您使用的是boot2docker且ntp在docker虚拟机中不起作用(您位于不转发ntp数据包的代理后面),但是主机是时间同步的,则可以从主机运行以下命令:
docker-machine ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"
这样,您将以字符串形式发送计算机的当前时间(以UTC时区为单位)以设置Docker VM时间date
(再次以UTC时区为单位)。
注意:在Windows的bash shell内(来自msys git),使用:
docker-machine.exe ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"
date
命令仅接受MMDDhhmm[[CC]YY][.ss]
用于设置日期的格式,因此要添加秒,您需要将它们放在字符串的末尾,如下所示:+%m%d%H%M%Y.%S
。
这是使用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
在您第一次运行容器时使用。我在此链接上找到了它。
希望能帮助到你。
这将重置Docker服务器中的时间:
docker run --rm --privileged alpine hwclock -s
下次创建容器时,时钟应该正确。
来源:https : //github.com/docker/for-mac/issues/2076#issuecomment-353749995
我正面临-1小时4分钟的时间偏移
重新启动Docker本身为我解决了这个问题。
一般设置时区:
ssh到您的容器中:
docker exec -it my_website_name bash
跑 dpkg-reconfigure tzdata
date
docker-compose exec <servicename> bundle exec dpkg-reconfigure tzdata
如果您使用的是Docker Machine,似乎会随着时间的流逝而变化,因为此响应表明:https : //stackoverflow.com/a/26454059/105562,由于VirtualBox。
快速简便的修复方法是重新启动虚拟机:
docker-machine restart default
对于macOS上的docker,您可以使用docker-time-sync-agent。这个对我有用。
对于Windows的docker,我不得不打勾
MobyLinuxVM > Settings > Integration Services > Time synchronization
在Hyper-V管理器中,并且可以正常工作
添加/etc/localtime:/etc/localtime:ro
到volumes
属性:
version: '3'
services:
a-service:
image: service-name
container_name: container-name
volumes:
- /etc/localtime:/etc/localtime:ro
我发现,如果您的计算机进入睡眠状态,则Docker容器将不同步。
https://forums.docker.com/t/time-in-container-is-out-of-sync/16566
我已经在这里发表了一篇文章 证书总是在5天前在Docker中过期
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"]