docker 时区调整方案

问题

使用 docker 经常会遇到时区问题。
基本上都是UTC时间,默认时区为0时区,

1
2
3
docker run --name test --rm -ti alpine /bin/sh
# date
Mon Jan 11 02:52:18 UTC 2021

而我们主要用的是 CST 时间,北京时间,位于东八区。时区代号: Asia/Shanghai

1
2
3
docker run --name test --rm -ti -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro alpine /bin/sh
# date
Mon Jan 11 10:53:06 CST 2021

下面汇总几个方案:

方案

运行容器时调整时区

在 Linux 系统中,控制时区和时间的主要是两个地方:

1
2
/etc/timezone  主要代表当前时区设置,一般链接指向/usr/share/zoneinfo目录下的具体时区。
/etc/localtime 主要代表当前时区设置下的本地时间。

通用 docker 时区修改方案

当宿主机为 Linux 系统时,我们可以直接将宿主机上的/etc/timezone/etc/localtime挂载到容器中,这样可以保持容器和宿主机时区和时间一致。

1
-v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro
1
2
3
docker run --name test --rm -ti -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro alpine /bin/sh
# date
Mon Jan 11 10:58:31 CST 2021

通过传递环境变量改变容器时区

  • 适用于基于 Debian 基础镜像, CentOS 基础镜像 制作的 Docker 镜像
  • 不适用于基于 Alpine 基础镜像, Ubuntu 基础镜像 制作的 Docker 镜像

对于基于 Debian 基础镜像,CentOS 基础镜像制作的 Docker 镜像,在运行 Docker 容器时,传递环境变量-e TZ=Asia/Shanghai进去,能修改 docker 容器时区。

1
-e TZ=Asia/Shanghai

使用示例如下:

1
2
3
docker run --name test -e TZ=Asia/Shanghai --rm -ti debian /bin/bash
# date
Mon Jan 11 11:00:52 CST 2021

制作 Docker 镜像时调整时区

通过编写 Dockerfile,构建自己的 Docker 镜像,可以永久解决时区问题。

Alpine

根据《Setting the timezone》提示,我们可以将以下代码添加到 Dockerfile 中:

1
2
3
4
5
ENV TZ Asia/Shanghai

RUN apk add tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone \
&& apk del tzdata

Debian

Debian 基础镜像 中已经安装了 tzdata 包,我们可以将以下代码添加到 Dockerfile 中:

1
2
3
4
5
6
7
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/*

Ubuntu

Ubuntu 基础镜像中没有安装了 tzdata 包,因此我们需要先安装 tzdata 包。

1
2
3
4
5
6
7
8
9
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/*

CentOS

CentOS 基础镜像 中已经安装了 tzdata 包,我们可以将以下代码添加到 Dockerfile 中。

1
2
3
4
ENV TZ Asia/Shanghai

RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone

reference

转载自
https://www.itcoder.tech/posts/docker-timezone-localtime/