当前位置: 首页 > 科技观察

Docker中的时区问题处理

时间:2023-03-19 18:27:56 科技观察

背景这两天在玩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环境变量ForAsia/Shanghai,时区正确,强制修改/etc/localtime文件,时区也正确。docker容器处理时区的方法根据上面的描述,在docker容器中设置时区的方法其实主要有两种。一种是直接进行TZ环境变量设置,另一种是不设置TZ环境变量,直接修改/etc/localtime的内容(可以直接通过软链接或文件复制)这里是设置的例子TZ环境变量(我比较喜欢这样,感觉比修改/etc/localtime方便多了)。首先,我们可以在Dockerfile中添加ENVTZ=Asia/Shanghai,这样docker构建镜像的默认TZ环境变量就是我们想要的值。二、我们也可以在容器中拉上来使用-eTZ=Asia/Shanghai设置TZ环境变量时,这个设置是动态的,拉上来的时候我们可以设置同一个镜像不同的价值观。总结一下,docker中的时区处理其实就是glibc中的时区处理。了解了glibc中事物的处理方式后,核心就是TZ环境变量和/etc/localtime文件。docker中周期问题处理很简单。.