docker中时区问题的处理方法
背景
这两天在打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中的时期问题处理就简单了.
推荐阅读
-
对python PLT中的image和skimage处理图片方法详解
-
Python3中常用的处理时间和实现定时任务的方法的介绍
-
在Python中关于中文编码问题的处理建议
-
Python2.x中str与unicode相关问题的解决方法
-
mysqlreport显示Com_中change_db占用比例高的问题的解决方法
-
PHP中source #N问题的解决方法
-
在centos7 中docker info报错docker bridge-nf-call-iptables is disabled 的解决方法
-
Win2008 R2中IIS7.5配置完网站权限不足问题的解决方法
-
Docker 下载镜像慢的问题解决方法
-
基于vue中keep-alive缓存问题的解决方法