Docker 设置时区

按照最近项目的开发习惯

Posted by if on 2019-01-11

Dockerfile 里设定 timezone

给 Java 等自带时区信息的程序使用只需要类似 ENV TZ=Asia/Shanghai 即可,需要整个容器设置或者程序没有自带时区的使用下面的方法。

Spring boot 项目设置timezone

1
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Duser.timezone=GMT+08","-jar","/app.jar"]

Ubuntu 安装和指定 timezone

1
2
3
4
5
6
ENV TZ=Asia/Shanghai

RUN apt-get update \
&& apt-get install -y tzdata \
&& ln -fs /usr/share/zoneinfo/$TZ /etc/localtime \
&& rm -rf /var/lib/apt/lists/*

不用判断 tzdata 是否存在,直接更新到最新版本更好。

Alpine 安装和指定 timezone

1
2
3
RUN apk add --no-cache tzdata \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& apk del tzdata

注意上面2种方式分别使用了 ln / cp 的方式,并且一个设置了 TZ 一个没有,根据需要自由组合使用。

对 Linux 系统自身来说,影响 timezone 的是 /etc/localtime 这个文件,对于安装了 tzdata 包的系统,在 /usr/share/zoneinfo 目录下有各 timezone 的文件,以 ‘Asia/Shanghai’ 为例指定 timezone 可以
sudo ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
也可以
sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
如果保留 tzdata 推荐 ln,否则就 cp。只要 /etc/localtime 是正确的文件,卸载掉 tzdata 当前 timezone 依然有效。

环境变量 TZ 可以覆盖系统的 timezone 设置,前提是 tzdata 存在,但是 Java 自带这些数据,没有 tzdata 时 TZ 照样生效。