如何在docker file 里面更改时区

很多时候我们都是可以用UTC的,但是有时候为了方便,或者兼容现在的系统,我们需要把时区改成自己想的的时区。 如我们 +8的北京时间 设置环境变量 TZ Asia/Shanghai 如下

FROM nginx
ENV TZ Asia/Shanghai

接下来用如下的命令来构建和测试它

docker build -t test .
docker run test date 

可以看到如下的 Sat Nov 21 17:03:29 CST 2020

对于asp.net core 的镜像也是有效的 mcr.microsoft.com/dotnet/core/runtime:3.1

alpine 镜像

用alpine构建出来的镜像是没有时区信息的。 C#当中用这个来获取时区也是获取不到的 TimeZoneInfo.FindSystemTimeZoneById("Europe/Amsterdam");

可以用Apk 来安装 tzdata,代码如下。

FROM alpine:3.10.2

RUN apk update \
    && apk add tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone

后面的这两步是用来指定时区的,如果不用这两步的话,也是可以用环境变量TZ。

ZoneId

C# 代码想要获取某个时区的写法也是不一样的。 linux下的zoneId 跟 windows下是不一样的。

var zoneId = "W. Europe Standard Time";
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
    zoneId = "Europe/Amsterdam";
}
var zone = TimeZoneInfo.FindSystemTimeZoneById(zoneId);
//TimeZoneInfo.GetSystemTimeZones() 整个列表可以通过这个来获取
最近更新的
...