解决Docker容器时区及时间不同步问题

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

拿到交付的docker镜像后,启动后进入容器控制台,使用date命令查看果然时间不正确。再查看宿主机时间是正确,这样肯定是容器启动时未将时区与宿主机保持同步了,由于测试镜像是由dockfile直接构建,因此问题基本了定准在dockerfile文件上了。

打开dockerfile检查后发现确实确失与宿主机时区同步设置。故在此将如何添加时区同步过程记录一下,同时给遇到过类似问题的同学以借鉴:

以下以Alpine制作的docker镜像为例(也是我们的测试镜像):

1 Dockerfile修改

1.1 增加安装tzdata包

在安装包时安装tzdata安装包,并且在构建成功后不能清理此安装包

#定义环境变量
ENV  TIME_ZONE Asiz/Shanghai
#dockerfile增加命令
RUN \

#安装tzdata安装包

&& apk add --no-cache tzdata \

1.2 增加时区配置

安装此安装包后,会在/usr/share/zoneinfo目录下生成各时区配置信息,Alpine目录并无timezone及locatime配置,此时我们需要将时区值覆写至Alpine的timezone及localtime配置中,命令如下:

```
RUN ...
#安装tzdata安装包
&& apk add --no-cache tzdata \
#设置时区
&& echo "${TIME_ZONE}" > /etc/timezone \
&& ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime \

至此,dockerfile的修改工作已经结束。

2 宿主机时区及时间检查

检查宿主机时间及时间是否正确,使用以下命令:

```
[[email protected] ~]# timedatectl
      Local time: Tue 2016-12-13 21:52:13 EST
  Universal time: Wed 2016-12-14 02:52:13 UTC
        RTC time: Wed 2016-12-14 02:52:13
       Time zone: America/New_York (EST, -0500)  //默认为西五区
     NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
      DST active: no
Last DST change: DST ended at
                  Sun 2016-11-06 01:59:59 EDT
                  Sun 2016-11-06 01:00:00 EST
Next DST change: DST begins (the clock jumps one hour forward) at
                  Sun 2017-03-12 01:59:59 EST
                  Sun 2017-03-12 03:00:00 EDT
#修改为东八区
[[email protected] ~]# timedatectl set-timezone Asia/Shanghai
 Local time: Wed 2016-12-14 10:53:10 CST
  Universal time: Wed 2016-12-14 02:53:10 UTC
        RTC time: Wed 2016-12-14 02:53:10
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
      DST active: n/a
[[email protected]cker ~]# date
Wed Dec 14 10:53:49 CST 2016
#调整时间
[[email protected] ~]# date -s "2016-12-13 21:54:20"
#时间同步,不执行则无法生效
[[email protected] ~]# clock -w
[[email protected] ~]# timedatectl
      Local time: Tue 2016-12-13 22:59:44 CST
  Universal time: Tue 2016-12-13 14:59:44 UTC
        RTC time: Tue 2016-12-13 14:59:44
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
      DST active: n/a
```

至此宿主机时区及时间调整完毕。

3. 构建容器测试

根据上述dockerfile重新生成镜像,并使用RUN命令启动容器,查看当时窗口时间

/ # date
Tue Dec 13 23:01:18 CST 2016

已与宿主同步,整个调整过程结束~~

时间: 2024-10-24 18:47:16

解决Docker容器时区及时间不同步问题的相关文章

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

查看linux系统时区和docker容器时区 date -R //查看linux主机时间和时区 date exec [container] date -R // 查看容器时间和时区 2者的时间差了8个小时 解决方案 1.利用Dockerfile创建镜像时.在Dockerfile中加入 ENV TIME_ZONE=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE

解决docker容器的窗口大小问题

解决docker容器的窗口大小问题 最近哥们在是使用docker时,发现有些容器内部窗口大小有问题. 如下午所示,vi窗口只占据左上角一部分.正常情况下vi应该铺满整个窗口才对呀. 所以哥们找到了解决方案,执行下面命令,然后退出容器重新进入. echo "export TERM=xterm" >> /root/.bashrc 参考文献 GitHub 原文地址:https://www.cnblogs.com/WingPig/p/8124353.html

解决docker容器中Centos7系统的中文乱码

解决docker容器中Centos7系统的中文乱码问题有如下两种方案: 第一种只能临时解决中文乱码: 在命令行中执行如下命令: $>localedef -i zh_CN -f UTF-8 zh_CN.UTF-8 $>yum -y install kde-l10n-Chinese && yum -y reinstall glibc-common $>localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 $>export LC_ALL=zh

解决Docker容器 iptables问题

一.问题现象 最近在研究Docker容器日志管理时,启动容器出现iptables相关报错,具体问题如下 运行容器 [[email protected] ~]# docker run -d -p 24224:24224 -p 24224:24224/udp -v /data:/fluentd/log fluent/fluentd 出现如下报错 docker: Error response from daemon: driver failed programming external connect

centos:解决docker容器内挂载目录无权限 ls: cannot open directory .: Permission denied

docker运行一个容器后,将主机中当前目录下的文件夹挂载到容器的文件夹后 进入到docker容器内对应的挂载目录中,运行命令ls后提示: ls: cannot open directory .: Permission denied 解决: 在docker run一个容器时,加上 --privileged=true 给容器加特权即可. 原文地址:https://www.cnblogs.com/UniqueColor/p/9318815.html

解决Docker容器内访问宿主机MySQL数据库服务器的问题

懒得描述太多,总归是解决了问题,方法简要记录如下,虽然简要,但是完整,一来纪念处理该问题耗费的大半天时间,二来本着共享精神帮助其他遇到该问题的哥们儿,当然这个方法并不一定能解决你们的问题,但是多少能提供些解决思路. 第一,先检查防火墙,通常应该没什么问题 (问题解决之后我把这块规则去掉了,发现没什么影响,所以容器的话,可能docker已经解决了防火墙的问题,但是不排除其他人会有这个问题.)添加规则 针对特定地址开放3306端口,一定程度上保证数据库的安全 iptables -I INPUT -s

解决docker容器开启端口映射后,会自动在防火墙上打开端口的问题

在docker中运行第三方服务时,通常需要绑定服务端口到本地主机.但使用 -p 参数进行的端口映射,会自动在iptables中建立规则,绕过firewalld,这对于端口级的黑白名单控制管理是很不利的,所以我们需要对iptables进行手动修改. 这里以从名为centos.19.09.05的image建立一个容器为例: 首先,如果系统是CentOS7的话,需要关闭自带firewalld防火墙,并切换为iptables. 假设需要将新容器的27017端口映射到主机的27017端口,一般情况下我们使

解决docker容器vim高度宽度显示不正常

docker exec -it --env COLUMNS=`tput cols` --env LINES=`tput lines` your_container_name /bin/bash reference: https://blog.csdn.net/DongGeGe214/article/details/86674741 原文地址:https://www.cnblogs.com/i-shu/p/11491301.html

docker 容器配置tocmat时间不统一

1.在tomcat配置文件bin下 vim   setenv.sh #!/bin/bashCATALINA_OPTS='-Duser.timezone=Asia/Shanghai'export CATALINA_OPTS:wq ---------------------------重新启动tomcat  就可以解决问题-----------------------------