设置Docker 容器时区的几种方法

21,905 阅读3分钟

Docker的基础镜像设置大多是Etc/UTC,也就是标准的UTC 时间,所以要简单的调整一下,变成中国标准时间CST(China Standard Time UT+8:00)

简单介绍一下时区的划分标准:
世界时区的划分以本初子午线为标准。从西经7°30'到东经7°30'(经度间隔为15°)为零地区。由零时区的两个边界分别向东和向西,每隔经度15º划一个时区,东、西各划出12个时区,东十二时区与西十二时区相重合;全球共划分成24个时区。
UTC(世界标准时间)
协调世界时,又称世界标准时间或世界协调时间,简称UTC(从英文“Coordinated Universal Time”/法文“Temps Universel Coordonné”而来),是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间。
GMT(格林尼治平时)
格林尼治平时(又称格林尼治平均时间或格林尼治标准时间,旧译格林威治标准时间;英语:Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能与实际的太阳时有误差,最大误差达16分钟。 由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治时间已经不再被作为标准时间使用。现在的标准时间,是由原子钟报时的协调世界时(UTC)。
CST(中国标准时间)
北京时间,China Standard Time,中国标准时间。在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8。不过这个CST这个缩写比较纠结的是它可以同时代表四个不同的时间:

  • 美国中部时间:Central Standard Time (USA) UT-6:00
  • 澳大利亚中部时间:Central Standard Time (Australia) UT+9:30
  • 中国标准时间:China Standard Time UT+8:00
  • 古巴标准时间:Cuba Standard Time UT-4:00

一.在构建镜像时修改时区

在构建镜像时修改时区就没有必要在容器运行时进行修改了,比较简单。

  1. 基于Debian的镜像,直接添加环境变量即可:
ENV TZ=Asia/Shanghai
  1. 基于Alpine的镜像 与 Debian 镜像不同,此类镜像中并没有包含tzdata,所以只设置环境变量并不能达到我们想要的效果,因此需要安装tzdata。
ENV TZ=Asia/Shanghai
RUN apk update \
    && apk add tzdata \
    && echo "${TZ}" > /etc/timezone \
    && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
    && rm /var/cache/apk/*
  1. 基于ubuntu的镜像 与 Debian 镜像不同,此类镜像中并没有包含tzdata,所以只设置环境变量并不能达到我们想要的效果,因此需要安装tzdata。
ENV TZ=Asia/Shanghai 
RUN echo "${TZ}" > /etc/timezone \ 
&& ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ 
&& apt update \ 
&& apt install -y tzdata \ 
&& rm -rf /var/lib/apt/lists/*

二.在启动容器时修改时区

docker run -e TZ=Asia/Shanghai .........   

三.在容器运行时修改时区

docker exec -it -u root 容器名或id /bin/sh
mkdir -p /usr/share/zoneinfo/Asia
exit
docker cp /usr/share/zoneinfo/Asia/Shanghai 容器ID或容器名:/usr/share/zoneinfo/Asia
docker exec -it -u root 容器名或id /bin/sh
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime