
大部分Docker镜像都是基于Alpine、Ubuntu、Debian、CentOS等基础镜像制作而成,这些镜像都采用的UTC时间,与我们的北京时间整整相差8小时。时区问题是十分重要的,时间不统一,业务会乱套。
在Linux系统中,控制时区和时间的主要有两处:
我们可以直接将宿主机上的/etc/timezone和/etc/localtime挂载到容器中,这样可以保持容器和宿主机时区和时间一直。
-v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro范例如下:
$ sudo docker run --name time-demo --rm -it -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro debian /bin/bash
# date -R
Sat, 06 Aug 2022 21:53:49 +0800该方案只适应于基于Debian、CentOS基础镜像制作的Docker镜像,不适应于Alpine、Ubuntu基础镜像制作的Docker镜像。
对于Debian、CentOS镜像制作的Docker镜像,在运行容器时,通过传递-e TZ=Asia/Shanghai参数,实现修改容器时区的效果:
-e TZ=Asia/Shanghai使用范例如下:
$ sudo docker run --name time-demo -it -e TZ=Asia/Shanghai debian /bin/bash
# date -R
Sat, 06 Aug 2022 21:59:16 +0800Docker镜像时调整时区编写Dockerfile文件,构建自己的Docker镜像,可以一劳永逸解决时区问题。
Alpine通过查阅官方文档,我们可以将以下代码添加到Dockerfile中:
ENV TZ Asia/Shanghai
RUN apk add tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone \
&& apk del tzdataDebianDebian基础镜像中已经安装了tzdata包,因此可以将以下代码添加到Dockerfile中:
ENV TZ=Asia/Shanghai \
DEBIAN_FRONTEND=noninteractive
RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone \
&& dpkg-reconfigure --frontend noninteractive tzdata \
&& rm -rf /var/lib/apt/lists/*UbuntuUbuntu基础镜像中没有安装tzdata包,因此需要先安装tzdata包。代码如下:
ENV TZ=Asia/Shanghai \
DEBIAN_FRONTEND=noninteractive
RUN apt update \
&& apt install -y tzdata \
&& ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone \
&& dpkg-reconfigure --frontend noninteractive tzdata \
&& rm -rf /var/lib/apt/lists/*CentOSCentOS镜像中已经安装tzdata包,代码如下:
ENV TZ Asia/Shanghai
RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone