在使用tomcat官方docker 镜像时,程序在与微信通信过程中返回了时间差问题,查看后发现是docker 容器的问题。

 

问题

docker 官方镜像使用的都是UTC 标准时间,这就导致了比beijing时间晚8小时。

 

解决这一问题并不难,只要修正容器的时区就可以了。众所周知,对容器的修改并不会影响到镜像,所以又会出现这样一个问题,再次从镜像启动容器时,时间就会又变成UTC 标准时间。对于此问题,自然是可以使用docker commit 来解决,但我并不想这样做……

 

解决方案

基于centos 的镜像,系统时区是由/etc/localtime 控制

基于debian 的镜像,系统时区由/etc/timezone 控制

可将系统内的/usr/share/zoneinfo/Asia/Shanghai 文件直接复制到以上位置修改时区

mv /etc/localtime /etc/localtime_bak

ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

 

但在基于centos 镜像内,只修改/etc/localtime ,tomcat 或者Nginx取的仍可能是UTC 时区,tomcat可配置catalina 启动文件的JAVA_OPTS参数,修正tomcat的时区

JAVA_OPTS="-Duser.timezone=GMT+08"

还有一种方式,就是同时设置/etc/timezone文件

 

docker build -t morrowind/centos .

Dockerfile

#Version: Centos 7.2 CST
FROM centos:latest
MAINTAINER Morro Wind "example@hotmail.com"
RUN yum -y -q upgrade
#update system timezone
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#update application timezone
RUN echo "Asia/Shanghai" >> /etc/timezone

通过Dockerfile 构建镜像时需要注意,对时区的修改一定要放在yum upgrade后面,否则upgrade 后,会修改时区为UTC

 

后面就可以基于此基础镜像,构建应用镜像了

Logo

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

更多推荐