默认情况下的docker容器启动之后,系统时间是UTC时间,这导致和我们的北京时间相差8小时,会引出很多问题。
有一些容器是和项目一起构建的,我们可以在构建的时候,将系统时区修改为Asia/Shanghai。如下所示,我们在定义Dockerfile的时候,可以直接加上这段指令:
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime; \
echo 'Asia/Shanghai' >/etc/timezone;
这样的话,容器构建之后,再启动,就不会有时差问题了。
有时候,我们的容器是三方提供的,比如elasticsearch服务,mysql服务,mongodb服务等等。可能有的镜像在制作的时候,考虑了时差问题,但是大多数可能并不会考虑。这就需要我们设置时区了,当然,不可能在容器启动之后去设置,这样可以改变系统时间,但是如果服务随着容器启动,服务的时间并不会随着系统时间改变而发生变化。所以,我们改变系统时区就应该在服务启动之前,或者在容器启动时指定。
改变时区,主要是改变/etc/localtime这个文件。
确保docker host主机的时间是准确的,可以考虑直接挂载/etc/localtime到宿主机的/etc/localtime,所以我们看到很多这样的设置:
如果是docker run启动容器,那么会指定-v /etc/localtime:/etc/localtime;
如果是docker-compose编排容器,那么会指定:
volumes:
- /etc/localtime:/etc/localtime
当然,通过这种方式肯定是可以确保时区一致的问题。另外,我根据一些资料,发现可以通过指定环境变量TZ="Asia/Shanghai"的方式来修改时区,比如elasticsearch服务就可以生效。但是busybox就怎么都不生效,只有通过改变/etc/localtime才行。