Docker Hub 中的官方镜像,一般都默认设置为 UTC 时间。而我们位于东八区,在启动容器或构建自己的镜像时,往往需要对时区进行设置。根据基础镜像的不同,设置时区的方法也有所区别。
基于 Debian 镜像
由于 Debian 镜像中已经包含了 tzdata
,因此设置时区的方法比较简单,只需添加环境变量 TZ
即可。我们可以通过启动一个 Debian 容器,运行其中的 date
命令来验证。
root@677e5c1c1e19:/# date
Sat Jan 12 10:25:27 UTC 2019
root@677e5c1c1e19:/# export TZ=Asia/Shanghai
root@677e5c1c1e19:/# date
Sat Jan 12 18:25:44 CST 2019
当需要在容器中使用本地时间的时候,只需在启动容器时,添加参数 -e TZ=Asia/Shanghai
即可。
如果是构建 Docker 镜像,可以这样写:
FROM debian:stretch
ENV TZ=Asia/Shanghai
基于 Alpine 镜像
与 Debian 镜像不同,Alpine 镜像中并没有包含 tzdata
,所以只设置 TZ
环境变量并不能达到我们想要的效果,因此需要安装 tzdata
。
/ # date
Sat Jan 12 10:37:07 UTC 2019
/ # export TZ=Asia/Shanghai
/ # date
Sat Jan 12 10:37:34 UTC 2019
/ # apk add tzdata
......
......
/ # date
Sat Jan 12 18:38:18 CST 2019
由于无法直接通过环境变量设置时区,因此需要在容器中使用本地时间时,只能先基于原有的镜像构建自己的镜像,在启动容器时使用自己构建的镜像即可。
FROM alpine:3.9
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 镜像
Ubuntu 镜像中也没有包含 tzdata
,设置时区的方法与 Alpine 镜像相似。
root@2a33fc02c099:/# date
Wed Mar 6 13:12:44 UTC 2019
root@2a33fc02c099:/# export TZ=Asia/Shanghai
root@2a33fc02c099:/# date
Wed Mar 6 13:13:08 Asia 2019
root@2a33fc02c099:/# echo "${TZ}" > /etc/timezone
root@2a33fc02c099:/# ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime
root@2a33fc02c099:/# apt update
......
......
root@2a33fc02c099:/# apt install -y tzdata
......
......
root@2a33fc02c099:/# date
Wed Mar 6 21:15:52 CST 2019
写成 Dockerfile 如下:
FROM ubuntu:bionic
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/*
转载自:https://blog.anguiao.com/archives/set-time-zone-in-docker.html
感谢原作者。
实测 centos:8 镜像也可以用 TZ 变量控制时区。