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)

docker tomcat 日志时间时区不对 - 简书 (jianshu.com)

如何给容器配置时区 (Timezone) - 知乎 (zhihu.com)

posted @ 2023-03-20 16:37  dirgo  阅读(756)  评论(0编辑  收藏  举报