详解如何在golang镜像中设置指定时区
在使用golang:alpine或scratch构建最小化Docker镜像时,应用默认采用UTC时区。这会导致日志打印与用户期望的时间存在差异。为了解决这个问题,需要在Dockerfile中添加时区文件并通过环境变量强制指定时区。
时区读取机制
在Go语言中,时区信息通常从操作系统环境变量中读取。具体来说,它使用了名为TZ的环境变量。如果未设置该变量,则使用操作系统的默认时区。
首先,我们需要知道的是确定golang会从哪些路径中读取时区文件,默认情况下,golang会从如下的路径中读取时区文件:
- /usr/share/zoneinfo/
- /usr/share/lib/zoneinfo/
- /usr/lib/locale/TZ/
当然,也可以通过ZONEINFO指定一个时区文件;那我们如何将时区文件放入到这些目录下面呢?
大部分时候,我们都可以从基础镜像中找到时区文件,然后将其添加到最终镜像中就可以了;但是,有时候我们会使用golang:alpine镜像,这种镜像本身并不包含时区文件,所以我们需要使用命令进行添加时区文件了,如下:
FROM golang:alpine as build RUN apk --no-cache add tzdata WORKDIR /app ADD . . RUN CGO_ENABLED=0 GOOS=linux go build -o myapp FROM scratch as final COPY --from=build /app/myapp . COPY --from=build /usr/share/zoneinfo /usr/share/zoneinfo ENV TZ=Asian/Shanghai CMD ["/myapp"]
我们通过命令RUN apk --no-cache add tzdata添加时区文件,然后将其添加到最终镜像中,最后通过ENV TZ指定当前时区,这样问题就解决了。
但是,有时候公司的防火墙可能会屏蔽掉这些源,这样执行RUN apk --no-cache add tzadd时就会拉取不下来,那此时就需要其他的办法找到时区文件了。
幸运的是在golang的库中是包含时区文件的,位置在的$GOROOT/lib/time/zoneinfo.zip,那么就可以直接将这个时区文件复制到image当中了,如下:
FROM golang:alpine as build WORKDIR /app ADD . . RUN CGO_ENABLED=0 GOOS=linux go build -o myapp FROM scratch as final COPY --from=build /app/myapp . COPY --from=build /usr/local/go/lib/time/zoneinfo.zip / ENV TZ=Asian/Shanghai ENV ZONEINFO=/zoneinfo.zip CMD ["/myapp"]
在该dockerfile中,我们使用ENV ZONEINFO告诉golang从哪获取时区文件,然后使用ENV TZ指定当前的时区,这样就能够保证镜像能够读取到正确的时区文件了。
以上就是如何在golang镜像中设置指定时区的详细内容,更多关于golang镜像设置时区问题的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













