快捷搜索:  as  test  test and 1=1  test and 1=2  test+and+1=2

linux中的时区问题到底怎么处理

背景

这两天在打docker的时刻,发明自己的容器启动之后,里面date -R的输出时区是UTC,老是和北京光阴差了8个小时。

标准镜像

时区是UTC

查看/etc/localtime,发明默认指向的是Etc/UTC时区。而且TZ情况变量也没有被设置。

linux中的时区问题到底是怎么处置惩罚的

实际上,我们所有关于时区处置惩罚的问题都是glibc中处置惩罚时区的问题。 这个问题最势力巨子的文档便是glibc的官方文档,里面关于TZ情况变量的描述先容了时区问题的处置惩罚。

https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html#TZ-Variable

此中和我们相关的部分如下。

核心意思如下: 在glibc中,TZ情况变量的值是一个文件的名字,这个文件的内容描述了时区相关的信息。

假如TZ这个情况变量没有设置,那么系统会选择一个默认值,在glibc中,其默认值为/etc/localtime. 假如TZ情况变量有值,并且这个值因此/开首的,那么是一个绝对路径的文件名,否则文件名为/usr/share/zoneinfo/$TZ. /usr/share/zoneinfo目录下面有天下各地的本地光阴信息,比如Asia/Shanghai.一样平常这个目录下面的文件是被tzdata这个包安装的。

按照这个思路,我们强制指定TZ情况变量为Asia/Shanghai,时区精确

强制改动/etc/localtime文件,时区也精确。

docker容器处置惩罚时区的措施

根据上面的描述,在docker容器中设置时区着实有两个主要的措施。 一个是直接进行TZ情况变量设置,另一个是不设置TZ情况变量,直接改动/etc/localtime的内容(经由过程软链接或者文件直接复制都可以)

这里以设置TZ情况变量为例(我自己对照爱好这样做,感到比改动/etc/localtime更方便)。

首先,我们可以在Dockerfile里面添加ENV TZ=Asia/Shanghai,这样docker build出来的镜像默认TZ情况变量便是我们要的值了。

其次,我们也可以在容器拉起的时刻应用-e TZ=Asia/Shanghai进行TZ情况变量设置,这个设置便是动态的,同一个镜像我们可以在拉起的时刻设置不合的值。

总结

docker中的时区处置惩罚实际上便是glibc中的时区处置惩罚,懂得了glibc中对工作的处置惩罚措施,核心是TZ情况变量和/etc/localtime文件,docker中的时期问题处置惩罚就简单了.

您可能还会对下面的文章感兴趣: