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的时候把软链接改成正确的:
1 |
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |
ln -s就是做软链接,-f就是强制覆盖。
搞定后问题就解决了。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~
