背景
docker-compose里已经加上了volumes: - /etc/localtime:/etc/localtime:ro
宿主机和容器执行node, new Date()
结果显示一样
但是引入moment之后, 执行node console.log(require('moment')().toISOString())
, 宿主机和容器显示结果不一致, 宿主机和容器相差8小时
排查思路
- 初步怀疑是时区不一致导致, 但是在宿主机和容器执行
cat /etc/localtime
结果一致, 即localtime文件有映射进来, 排除localtime问题 - 执行node
console.log(require('moment')().utcOffset())
, 容器结果:0
, 宿主机:480
, 初步定位为, 宿主机和容器时区不一致 - 查看moment源码, 发现utcOffset的本质, 其实还是
new Date().getTimezoneOffset()
, 于是改为执行new Date().getTimezoneOffset()
- 宿主机和容器执行
new Date().getTimezoneOffset()
, 容器结果:0
, 宿主机:-480
, 大概验证了是时区问题 - 查看linux时区的指令:
timedatectl
, 宿主机执行timedatectl
, 返回结果Asia/Shanghai
, 容器执行无效, 原因: 容器内未安装timedatectl, 该方法排查不出结果 - 执行
cat /etc/timezone
, 宿主机和容器结果不一致, 排除是node的问题 - 时区问题, 实锤了!
问题解决
可选解决方案
- 通过docker-compose配置环境变量environment:
- TZ=Asia/Shanghai
- docker-compose里加上volumes:
- /etc/timezone:/etc/timezone:ro
验证
配置环境变量environment
通过docker-compose配置环境变量environment: - TZ=Asia/Shanghai
重启容器后
执行new Date().getTimezoneOffset()
, 容器结果: -480
执行cat /etc/timezone
, 返回结果: Asia/Shanghai
方案可行
docker-compose里加上volumes
docker-compose里加上volumes: - /etc/timezone:/etc/timezone:ro
重启容器后
执行new Date().getTimezoneOffset()
, 容器结果: 0
执行cat /etc/timezone
, 返回结果: Asia/Shanghai
方案不可行