之前在docker启动的服务中,运行的有java和golang的程序,通常会出现时区问题,下面先看个列子
代码很简单,打印出时间

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println(time.Now())
}

如果运行机器时间没有问题,当然可以正确输出,先看机器时间

date
Wed Aug 23 07:50:26 CST 2017

再看一下程序输出,都是标准的北京时间

./time 
2017-08-23 07:53:04.087431036 +0800 CST

没有问题,现在把程序达到容器内运行

FROM golang:1.7.3
ADD time /root
CMD ["sh","-c","/root/time"]

此时输出结果如下

date
Wed Aug 23 00:00:07 UTC 2017
./time
2017-08-22 23:55:08.547500771 +0000 UTC

容器内采用的是UTC时间,导致晚了八个小时,CST=UTC/GMT +8 小时。
如果此时想设置成北京的时间的话,有两种解决方案,第一个是修改容器时区

# CentOS

RUN echo "Asia/shanghai" > /etc/timezone;

# Ubuntu

RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

第二种方案,更简单,直接把宿主机的时间设置挂载到容器里面,通过docker run -v的方式直接挂载

-v /etc/localtime:/etc/localtime:ro 

这种方案需要注意/etc/timezone内容,因为代码中会用到这个设置,也要改成上海时区。最后测试一下,两种方案都是可行的。

如果是apline还需要安装一下tzdate

apk add tzdata
# 复制上海时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 指定为上海时区
echo "Asia/Shanghai" > /etc/timezone
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐