背景
项目迁移至docker
环境部署,原本正常的接口,突然报错失败。查看日志得到:panic: time: missing Location in call to Time.In
。
排查
项目中我们封装了时间转换的方法,如下:
1 2 3 4 5 6 7 8 9 10 |
func StringToTimeFormatE(s string, format string) (time.Time, error) { if s == "" { return time.Time{}, nil } local, _ := time.LoadLocation("Asia/Shanghai") return time.ParseInLocation(format, s, local) } |
当系统执行到local, _ := time.LoadLocation("Asia/Shanghai")
时发生报错。
分析
我们常用的linux
系统,诸如,ubuntu
、centos
等,在/usr/share/zoneinfo/
目录下存放了各个时区。
项目打包后我们使用了alpine
镜像,该镜像/usr/share/zoneinfo/
并没有这个目录。
解决
我们自己编译一个包含zoneinfo
的镜像。
1 2 3 4 5 6 7 |
# Dockerfile FROM alpine RUN apk add tzdata && \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezone |
执行命令docker build -t pangou/alpine-tz .
进行编译。
完成编译后,推送至仓库, docker push pangou/alpine-tz
。
仓库地址:https://hub.docker.com/r/pangou/alpine-tz
docker-compose
替换镜像执行,验证成功。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
... g-shop: image: pangou/alpine-tz:latest restart: unless-stopped ports: - 30100:30100 - 30200:30200 - 30300:30300 volumes: - ../../:/app container_name: ms-g-shop working_dir: /app/gateway/shop logging: *loki-logging command: sh -c "./main --config=config/config-docker.toml" ... |