Docker 时区问题定位以及解决
之前在docker启动的服务中,运行的有java和golang的程序,通常会出现时区问题,下面先看个列子代码很简单,打印出时间package mainimport ("fmt""time")func main() {fmt.Println(time.Now())}如果运行机器时间没有问题,当然可以正确输出,先看机器时间dateWed Aug 23 07:50:
·
之前在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
更多推荐
已为社区贡献19条内容
所有评论(0)