其实,这个问题跟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
的环境变量,问题迎刃而解。