前言

当我们把应用部署到容器里面之后,基本都会要和时间/时区打交道!!

大部分的应用,多多少少都会有获取当前时间的操作,试想一下应用拿到的时间不对,那么业务极有可能会乱套,造成严重的损失。

时间和时区是浑然一体的,我们在东八区,看到的是8点钟,同一时间点,别人在另外的时区看到的可能是10点钟。

所以我们要对这个问题有个简单的认知,这样才能避免在实际使用的时候踩坑。

下面来简单看看 Docker 和时区的一些内容吧。

常用镜像

比较常用的基础镜像应该是 Alpine,Ubuntu,Debian 和 CentOS 这 4 个了。

看看分别启动对应的容器,执行 date 命令,看看输出的时间。

从上面的图可以看出,这些镜像基本上都采用 UTC 时间,默认时区为零时区。

图片中,这些容器的时间都是 5 点多, 老黄本地的电脑则输出的是 13 点。

在国内的大多数应用,可能用的时间会是 13 点的比较多。

知道了这个背景,那么要怎么对容器的时区进行调整的。

时区调整

回想一下,.NET Core 的应用,在部署的时候,一般会在启动的时候指定环境变量 -e TZ=Asia/Shanghai,或者是在Dockerfile里面直接加一个 ENV TZ=Asia/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

先写一个 Dockerfile

FROM 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,还可以接受。

写在最后

时区这个问题,其实比较简单,只是要特别注意。

如果时间存储用的是时间戳,展示的时候,再根据参数转成对应的本地时间,也可以一定程度的避免踩到时区这个坑。

聊一聊Docker与时区相关推荐

  1. 解决Docker容器时区不一致的问题

    解决Docker容器时区不一致的问题 参考文章: (1)解决Docker容器时区不一致的问题 (2)https://www.cnblogs.com/zhi-leaf/p/10604574.html ( ...

  2. docker容器时区与宿主机不一致的解决方法

    一般情况下,我们的宿主机服务器的时区都是在东八区,而docker容器里却是在零时区.这样就导致了时间差了8个小时,所以需要把容器的时间也设置成东八区. 在dockerfile中的设置如下: RUN l ...

  3. alpine linux docker容器时区修改

    适用对象 使用 Alpine Linux 发行版的 Docker 镜像容器. 仅仅适用于没有安装uclibc的系统. 修改步骤 进入容器命令行 # docker exec -it container_ ...

  4. Docker 容器时区时间不一致问题解决

    解决方案: 最傻瓜也最方便的处理方式,运行新的容器前设置本机时区和时间文件与容器的映射 docker run -v /etc/timezone:/etc/timezone -v /etc/localt ...

  5. Docker内时区查询和修改方法

    首先,在宿主机上执行[date]命令,查看宿主机的时间. 利用[docker exec -u 0 -it 容器ID /bin/bash]命令进入Docker容器内,执行[date]命令查看Docker ...

  6. docker 修改服务器时间同步,解决Docker容器时区及时间不同步问题的方法

    今天在系统集成测试时由测试人员提交了一个测试bug,原因是提交业务数据时间与实际时间(北京时间)有偏差,导致统计异常.由于我们集成测试是向测试人员直接提供完整的Docker镜像作为测试环境,原因应该是 ...

  7. 深入浅出聊一聊Docker

    网易云信IM私有化部分用到Docker技术,今天我们就深入浅出来聊聊Docker Docker是什么? Docker是一个工具,能把应用打包部署于container里,这里可以把container看做 ...

  8. docker mysql 时区_配置mysql docker容器的时区

    所以你需要在这种情况下使用Dockerfile并像下面那样处理它 FROM mysql:5.7.21 RUN echo "USE mysql;" > /docker-entr ...

  9. docker oxidized时区问题,时间显示不是北京时间问题的解决办法

    问题描述:oxidized web界面时间显示,默认显示UTC时间,为北京时间-8个小时 问题原因:ruby语言的时间直接获取的UTC时间 出现版本:oxidized 0.28.0 问题解决: doc ...

最新文章

  1. 数据仓库的架构与设计
  2. java强引用、软引用、弱引用、虚引用-Java的引用类型总共有四种,你都知道吗
  3. 数据挖掘应用现状与产品分析
  4. VTK:Video之OggTheora
  5. 图的基本运算及智能交通中的最佳路径选择问题
  6. 前端学习(3188):ant-design的icon图标
  7. mySQL数据库中的备份代码_MySQL中的备份数据库
  8. Wootrade宣布加入SushiSwa旗下Mirin协议和子池计划
  9. 更改Android 默认键盘映射值
  10. RH850F1L 移植freeRTOS
  11. windows批处理for循环用法
  12. boot版本是什么 cent os_确定 BootROM 或固件版本
  13. html 页面换皮肤,HTML中如何实现更换网页皮肤
  14. 信息学奥赛一本通:1132:石头剪子布
  15. 【拆电脑清灰】戴尔游匣G3
  16. Git 使用过程中遇到的问题以及解决办法
  17. java计算机毕业设计再生产公益管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
  18. HbuildX H5+App监听手机返回键以及webview关闭
  19. 2018-2019-2 20175317 实验三《敏捷开发与XP实践》实验报告
  20. 店盈通:拼多多如何看到关键词进店?

热门文章

  1. 三星笔记本进入BIOS后找不到U盘启动项/快速启动键F12没有反应
  2. iOS runtime实战应用:关联对象
  3. Comparable、Iterator接口和Collections类的实现方法
  4. ReactDom.render和React.render的区别
  5. JNI中的内存管理(转)
  6. sql-逻辑循环while if
  7. hotmail_在新的Hotmail Wave 4中禁用Messenger
  8. 从Windows计算机上完全删除iTunes和其他Apple软件
  9. applecare多少钱?_否,AppleCare +无法覆盖丢失或被盗的iPhone
  10. 微信小程序仿微信SlideView组件slide-view