Docker中的时区问题处理

开发 架构
这两天在打docker的时候,发现自己的容器启动之后,里面date -R的输出时区是UTC,总是和北京时间差了8个小时.

[[277323]]

背景

这两天在打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中的时期问题处理就简单了.

责任编辑:华轩 来源: 今日头条
相关推荐

2021-10-13 08:53:09

Docker Django 容器

2021-01-21 09:09:18

时区转换程序

2024-04-29 08:58:44

2013-08-21 10:46:02

DatePicker时区

2013-04-28 10:53:44

iOS开发NSDate计算日期计算

2022-07-01 13:17:13

Docker

2024-06-21 09:02:27

.NET开发C#

2020-12-17 08:00:18

java8时间类时间戳

2016-11-24 09:22:20

Linux时区NTP服务器

2014-02-19 09:51:29

iOS开发时间处理

2022-05-18 09:02:28

Flink SQLSQL字符串

2016-03-23 11:03:40

2021-02-26 13:50:37

Java并发代码

2015-05-15 09:37:24

iOS开发争议

2011-08-01 10:05:36

服务器虚拟化存储

2010-09-25 15:19:04

DHCP故障问题

2018-08-30 15:48:43

ConsulSpring Clou开源

2009-12-01 12:50:21

PHP字符处理函数

2010-10-14 09:15:20

MySQL查询

2010-10-14 13:55:58

MySQL创建函数
点赞
收藏

51CTO技术栈公众号