查 网站接入服务提供者名称,深圳市网站建设有补贴吗,中关村在线摄影论坛,广州室内设计公司排行榜前言 当我们把应用部署到容器里面之后#xff0c;基本都会要和时间/时区打交道#xff01;#xff01;大部分的应用#xff0c;多多少少都会有获取当前时间的操作#xff0c;试想一下应用拿到的时间不对#xff0c;那么业务极有可能会乱套#xff0c;造成严重的损失。时… 前言 当我们把应用部署到容器里面之后基本都会要和时间/时区打交道大部分的应用多多少少都会有获取当前时间的操作试想一下应用拿到的时间不对那么业务极有可能会乱套造成严重的损失。时间和时区是浑然一体的我们在东八区看到的是8点钟同一时间点别人在另外的时区看到的可能是10点钟。所以我们要对这个问题有个简单的认知这样才能避免在实际使用的时候踩坑。下面来简单看看 Docker 和时区的一些内容吧。常用镜像 比较常用的基础镜像应该是 AlpineUbuntuDebian 和 CentOS 这 4 个了。看看分别启动对应的容器执行 date 命令看看输出的时间。从上面的图可以看出这些镜像基本上都采用 UTC 时间默认时区为零时区。图片中这些容器的时间都是 5 点多 老黄本地的电脑则输出的是 13 点。在国内的大多数应用可能用的时间会是 13 点的比较多。知道了这个背景那么要怎么对容器的时区进行调整的。时区调整 回想一下.NET Core 的应用在部署的时候一般会在启动的时候指定环境变量 -e TZAsia/Shanghai或者是在Dockerfile里面直接加一个 ENV TZAsia/Shanghai 来指定当前用的时区。下面先来尝试一下这种方式行不行。可以看到 debian 和 centos 在指定这个环境变量后是可以正常获取到正确的时间的但是 alpine 和 ubuntu 却不行。影响这个时区的其实是一个叫 tzdata 的东西可以理解成是一个时区的数据库。可以参考下面的资料https://en.wikipedia.org/wiki/Tz_database之所以上面 debian 和 centos 可以通过指定环境变量来切换时区是因为这两个镜像里面已经安装了 tzdata 。可以查看一下 /usr/share/timezone 目录。那么alpine 和 ubuntu 这两个镜像我们要怎么操作才可以适配。下面以比较常用的 alpine 为例重新构建一个镜像。加时区的可以参考下面这个 wiki 地址https://wiki.alpinelinux.org/wiki/Setting_the_timezone先写一个 DockerfileFROM alpine:3.13RUN sed -i s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g /etc/apk/repositories \ apk add tzdata
再来构建docker build -t alpine:3.13-tz -f Dockerfile.alpine .
下面来看看通过运行时指定环境变量的方式来获取当前时间是否是正确的。从上面的图可以看到时间是正确的了同样也可以看到一堆时区信息了。再来看看加了 tzdata 后镜像的大小如何。相比原始的多了 2M还可以接受。写在最后 时区这个问题其实比较简单只是要特别注意。如果时间存储用的是时间戳展示的时候再根据参数转成对应的本地时间也可以一定程度的避免踩到时区这个坑。