docker容器和宿主机时区不一致问题

背景

docker-compose里已经加上了volumes: - /etc/localtime:/etc/localtime:ro
宿主机和容器执行node, new Date()结果显示一样
但是引入moment之后, 执行node console.log(require('moment')().toISOString()), 宿主机和容器显示结果不一致, 宿主机和容器相差8小时

排查思路

  1. 初步怀疑是时区不一致导致, 但是在宿主机和容器执行cat /etc/localtime结果一致, 即localtime文件有映射进来, 排除localtime问题
  2. 执行node console.log(require('moment')().utcOffset()), 容器结果: 0, 宿主机: 480, 初步定位为, 宿主机和容器时区不一致
  3. 查看moment源码, 发现utcOffset的本质, 其实还是new Date().getTimezoneOffset(), 于是改为执行new Date().getTimezoneOffset()
  4. 宿主机和容器执行new Date().getTimezoneOffset(), 容器结果: 0, 宿主机: -480, 大概验证了是时区问题
  5. 查看linux时区的指令:timedatectl, 宿主机执行timedatectl, 返回结果Asia/Shanghai, 容器执行无效, 原因: 容器内未安装timedatectl, 该方法排查不出结果
  6. 执行cat /etc/timezone, 宿主机和容器结果不一致, 排除是node的问题
  7. 时区问题, 实锤了!

问题解决

可选解决方案

  1. 通过docker-compose配置环境变量environment: - TZ=Asia/Shanghai
  2. 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
方案不可行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值