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
一.在构建镜像时修改时区
在构建镜像时修改时区就没有必要在容器运行时进行修改了,比较简单。
- 基于
Debian的镜像,直接添加环境变量即可:
ENV TZ=Asia/Shanghai
- 基于
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/*
- 基于
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