以alpine为基础镜像的go docker时区设置问题

其实,这个问题跟docker与go都没关系,但是因为我是打包的go镜像,所以表现就是go的time.Format时区错误,进到docker环境执行date命令显示的是UTC时区。

打包的Dockerfile如下


FROM golang:latest AS builder
LABEL authors="tiyee"
WORKDIR /build

ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,direct
COPY . .
RUN make build
FROM alpine:latest AS final

WORKDIR /app
COPY --from=builder /build/bin/web /app/
RUN echo "https://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories \
    && echo "https://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories \
    && apk update  \
    && apk upgrade  \
    && apk add --no-cache    tzdata bash \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  \
    && echo "Asia/Shanghai" > /etc/timezone \
    && apk del tzdata \
    && rm -rf /var/cache/apk/* /tmp/* /var/tmp/* $HOME/.cache

ENTRYPOINT ["/app/web", "-b"]
EXPOSE 8080

这是很常见的脚本,在github里有很多都是这个打包脚本。但是为何别人都没问题呢?

试过了网上的所有方法,都不奏效。

偶然想到,是不是 删掉tzdata造成的呢?于是去掉了apk del tzdata这行,发现果然好了。可是,我看过别人的脚本,他们都好好的,为啥我的就不行呢?

后来发现,是画蛇添足,增加环境变量TZ = Asia/Shanghai造成的。在有 TZ 环境变量时会去/usr/share/zoneinfo/${TZ} 目录下取时区信息,而我们删掉的 tzdata 就删除了这个目录,导致找不到对应的 /usr/share/zoneinfo/Asia/Shanghai文件 ,于是默认设置为 UTC 时间了。如果没有 TZ 这个环境变量时,就直接从 /etc/timezone 取时区,再从 /etc/localtime 读时区信息。

所以,删掉所有设置TZ的环境变量,问题迎刃而解。