我们经常会发现docker和宿主机的时间是不同步的,这几乎是个坑,特别是数据库系统,时间错误简直要命。这时间一般是相差8小时,因我们的时间是东八区时间,而docker用的是标准时间:

CST是指(China Shanghai Time,东八区时间) 
UTC是指(Coordinated Universal Time,标准时间)

这2个时间相差8个小时,一般没有设置过的容器,跟宿主机时间相差8h,通过date命令就能看出来。虽然这个问题很简单,但没人提醒的话,一顿找别的原因,也足以让很多人抓狂(我在部署docker版的skywalking时就犯了这个错,怎么修改配置都看不到监控数据,因为当前收集的数据全变成8小时前的历史数据了)。

遇到docker时区不一致,我们只需要对其进行同步处理就可以了,但由于docker运行的基础操作系统不同,或者系统里没装时区工具或是没有zoneinfo信息,那么我们的处理方式就略有不同:

1. Docker常用的运行环境

docker常用的操作系统包括busybox、alpine、debian、ubuntu、centos,它们的大小都不一样,适用的范围也会有区别,一般由docker中部署的项目特性来决定,镜像大小肯定也是优先考虑的因素:

基本上除了busybox,大部分的linux系统都可以通过命令 cat /etc/issue 来获知其系统版本:
# 进入容器命令行 docker exec -it [container_name | container_id] /bin/sh
########################################## / # cat /etc/issue Welcome to Alpine
Linux 3.12 Kernel \r on an \m (\l) ##########################################
root@9f1fc6293ff9:/# cat /etc/issue Debian GNU/Linux 10 \n \l
######################################### [root@qa ~]# cat /etc/issue CentOS
release 6.5 (Final) Kernel \r on an \m
对于CentOS / Redhat 可以通过 cat /etc/redhat-release 来看具体版本:
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.7.1908
(Core)
  busybox和alpine系统在bin目录下,可以找到busybox文件:
/ # find /bin |grep busybox /bin/busybox

对于docker环境,除了进入容器用以上的命令查看方式来判断操作系统版本,有时候可以通过镜像文件dockerfile的images标识或是RUN命令来判断(其实不好判断,一般apk命令是针对alpine,apt-get是针对debian或ubuntu,yum命令是针对centos):

2. busybox下同步时区

busybox是极度轻量版的操作系统,很多时候没法安装时区数据文件,我们可以采用简单粗暴方式,直接从宿主机拷。
# 查看是否有Shanghai时区文件 ls /usr/share/zoneinfo/Asia/Shanghai #
如果没有就需要获取时区文件,先进入busybox,如container_id=be318f78137f docker exec -ti
be318f78137f /bin/sh mkdir -p /usr/share exit # 拷贝宿主机的时区文件到docker中 docker cp
/usr/share/zoneinfo be318f78137f:/usr/share/zoneinfo # 进入busybox,同步时区 docker
exec -ti be318f78137f /bin/sh ln -sf /usr/share/zoneinfo/Asia/Shanghai
/etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
同步完时间后,通过date命令就可以看到时间已和宿主机同步。

另外也可以在dockerfile中完成这个工作:
# 需将/usr/share/zoneinfo先拷到dockerfile的目录下 COPY zoneinfo /usr/share/zoneinfo/
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo
'Asia/Shanghai' >/etc/timezone
3. alpine下同步时区

alpine默认也是没有时区文件,也需要安装:
# 进入容器命令行 docker exec -it [container_name | container_id] /bin/sh # 安装
timezone 数据包,为了防止添加失败,加上-U参数,更新仓储缓存。 apk add -U tzdata # 列出安装的时区文件,验证是否下载成功。 ls
/usr/share/zoneinfo # 拷贝需要的时区文件到localtime,国内需要的是Asia/Shanghai: RUN ln -sf
/usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai'
>/etc/timezone # 验证时区,CST 即为中国标准时间。 date # Tue Jun 30 11:53:46 CST 2020 #
移除时区文件: apk del tzdata
另外也可以在dockerfile中添加以下内容,完成时区的构建:
# Install root filesystem ADD ./rootfs / # Install base packages RUN apk
update && apk add curl bash tree tzdata \ && cp -r -f
/usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo -ne "timezone
Asia/Shanghai. (`uname -rsv`)\n" >> /root/.built
4. debian / ubuntu下同步时区
# 进入容器命令行 docker exec -it [container_name | container_id] /bin/bash #
列出安装的时区文件,验证是否存在tzdata。 ls /usr/share/zoneinfo # 一般是已经安装了 timezone 数据包,如未安装则执行
apt-get install tzdata # 软链接时区文件到localtime ln -sf
/usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai'
>/etc/timezone
另外也可以在dockerfile中添加以下内容,完成时区的构建:
ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &&
echo $TZ > /etc/timezone
5. centos下同步时区
# 进入容器命令行 docker exec -it [container_name | container_id] /bin/bash # 一般都已经安装了
timezone 数据包,如遇到未安装则执行 yum install -y tzdata # 软链接时区文件到localtime ln -sf
/usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai'
>/etc/timezone
在dockerfile中可以添加:
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo
'Asia/Shanghai' >/etc/timezone
如果你获取的docker镜像没有root权限,你又着急马上进入容器修改时区,那就简单暴力一点,直接从宿主机拷入时区文件到docker中,来实现时区的修改:
docker cp /usr/share/zoneinfo/Asia/Shanghai 容器ID:/etc/localtime echo
'Asia/Shanghai' >/etc/timezone && docker cp /etc/timezone 容器ID:/etc/timezone

技术
©2019-2020 Toolsou All rights reserved,
基于神经网络的车辆牌照字符识别技术Java基础(三) String深度解析 dedecms网站被黑 劫持到其他网站如何解决精准手机号抓取,运营商大数据利用梆梆加固逻辑漏洞取巧脱壳QT 删除目录及文件Java小明A+B苹果不送充填器耳机真为环保?可能还是为了赚钱吧在Pytorch上使用summaryC#中字典的排序方法