k8s随笔 – 容器时区错误问题

今天发现了一个诡异的问题。

在容器内的运行了PHP应用,已经设置过了timezone,结果出现了如下的诡异问题:

  • 在PHP CLI命令行,date格式化时间是正确的时区。
  • 在PHP FPM中,date格式化时间是UTC时区。

为什么同样的php.ini配置文件,有两种表现?

我通过strace分别观察了2种情况下的系统调用:

  • 发现PHP-CLI读取系统的/usr/share/zoneinfo/Asia/Shanghai文件获取时区信息。
  • 发现PHP-FPM读取系统的/etc/localtime文件获取时区信息。

PHP-CLI使用的就是我期望的时区,而/etc/localtime则错误的软链到了/usr/share/zoneinfo/UTC,也就是UTC时区。

想必不止是PHP-FPM,应该很多程序都会读/etc/localtime来获取时区信息,所以要从根本上修正/etc/localtime配置。

解决方案最好的就是在基础镜像里修复这个问题,即docker build的时候把软链接改成正确的:

ln -s就是做软链接,-f就是强制覆盖。

搞定后问题就解决了。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~