1

我在一个正在运行的带有节点的 docker 容器中,由于某种原因,主机的时区/时间与 docker 容器内部的时间从不对齐:

root@foobar:~# node -e "console.log(new Date())"
>> Tue May 17 2016 15:12:43 GMT+0200 (CEST)
root@foobar:~# docker exec 9179105c0ff9 node -e "console.log(new Date())"
>> Tue May 17 2016 13:13:01 GMT+0000 (Europe)
root@foobar:~# cat /etc/timezone
>> Europe/Vienna
root@foobar:~# docker exec 9179105c0ff9 cat /etc/timezone
>> Europe/Vienna

所以我已经在我的 docker-start shell 中做的是脚本如下:

docker run \
...
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-e "TZ=Europe/Vienna" \
...

...但是,正如您在第一个代码块中看到的那样,时间仍然是错误的!对此有什么想法吗?我错过了什么?

(仅供参考:我正在运行一个通过mupx部署的流星应用程序)

更新:

date在宿主机上和容器内运行后,再次有 2hrs 的差异。所以由于某种原因,docker容器只是没有“应用”我的时区,而且问题似乎与 JS/node 无关,因为date它只是一个简单的 unix 系统 cmd ......我在这里错过了什么?!

4

3 回答 3

2

>> Tue May 17 2016 15:12:43 GMT+0200 (CEST)

>> Tue May 17 2016 13:13:01 GMT+0000 (Europe)

大约相同的时间(大约 18 秒的差异,因为您没有同时运行命令)。仔细看看,大约是 GMT+0200 下午 3 点和 GMT+0000 下午 1 点左右。这只是输出格式的不同,但时间是一样的。如果您.getTime()对 的值执行new Date(),您可能会有相同的值。这可能是由于不同 node.js 版本中默认输出格式的差异。

于 2016-05-17T13:49:08.030 回答
0

我这样做是这样的: args: ["-v /etc/timezone:/etc/timezone:ro","-v /etc/localtime:/usr/share/zoneinfo/Europe/Prague:ro", '- e TZ=欧洲/布拉格']

需要安装timedatectl

于 2021-09-04T10:02:20.200 回答
0

在容器中使用 new Date().toString() 时,我很惊讶地看到同样的问题。它总是返回 GMT+000 的字符串,而不是服务器的时区。可能有特定于容器的设置来更改时区,但由于我知道我的时区 - 纽约,我只使用 toLocaleString: new Date().toLocaleString("en-US", {timeZone: "America/New_York" })

于 2021-09-13T00:58:02.677 回答