docker 容器内系统时区tomcat时区修改
现象:
查看docker 容器 运行的项目的日志时发现时间与北京时间差8小时
原因:
很容易猜到是 容器 时区错误,使用的是 协调世界时 UTC,可以近似看作0时区,
我们中国应该使用 东8区 时区,时区代号: Asia/Shanghai
解决:
先百度查询到 可以改 /etc/timezone 文件指向:
进入容器
docker exec -it 容器id /bin/bash
用ls 可以看到,此文件为 软链接文件,指向 /usr/share/zoneinfo/Etc/UTC
在/usr/share/zoneinfo 下可以找到 各个时区的文件,只需要将/etc/timezone指向 /usr/share/zoneinfo/Asia/Shanghai 即可,命令:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
s参数代表软连接,f参数是覆盖
此时 使用 date 查看系统时间已经正常
然后重启 项目容器,查看日志,发现还是不对
又查了一下,发现有些 程序,比如 Java 是用另一个文件 /etc/timezone 作为时区进行推算时间的,这个是 普通文件,可以用vim直接修改,也可以用 输出重定向 符号命令:
echo "Asia/Shanghai" > /etc/timezone
再重启容器,查看日志日期,已经正常
可能有人想不重启项目和容器是否可以,很遗憾没有找到此方法,如果业务确实不能停,应该考虑 微服务 或者 nginx负载均衡,起多个 项目docker容器,就可以一个一个改而不影响业务.
还有就是再构建 docker 镜像的时候,DockerFile里可以把时区用命令提前设置好,
或者 docker run 运行参数上设置好(包括使用 -v 映射 宿主机时区文件到容器内同步),
详细可参考以下文章:
Docker容器时间如何与宿主机同步问题解决方案小结 - 掘金 (juejin.cn)
docker 时区调整 - 简书 (jianshu.com)
设置Docker 容器时区的几种方法 - 掘金 (juejin.cn)