在服务器上运行docker容器之后,发现项目输出日志的时间少了8小时,查看了一下数据库的添加时间,也是少了8小时,通过查找资料得知,是宿主机时间与容器时间时差不一样
UTC时间:世界协调时间(UTC)是世界上不同国家用来调节时钟和时间的主要时间标准,也就是零时区的时间。
CST时间:中央标准时间
Central Standard Time (USA) UT-6:00(美国cst时间:零区时减6个小时)
Central Standard Time (Australia) UT+9:30(澳大利亚cst:加9个半小时)
China Standard Time UT+8:00(中国cst:加8个小时)
Cuba Standard Time UT-4:00 (古巴cst:减4个小时)
如:当UTC时间为0点时,中国CST时间为8点,因为零时区和中国北京时区相差8个时区。
此时搜到了解决方案,如下:
复制主机的localtime
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
或者
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
设置完之后,输入指令查看当前docker容器时区
docker exec [name] date
发现时区已改过来,可是项目的日志时间以及数据库的时间还是没改过来
又找到了另一种解决方案:修改Dockerfile文件,重新build镜像
#设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
在build的时候报错如下:
cp: can't stat '/usr/share/zoneinfo/Asia/Shanghai': No such file or directory
通过查找资料得知,现在需要用以下写法:
# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
Dockerfile设置完时区,重新build,成功,查看日志,成功
docker exec [name] date 查看一下时区,又回到了UTC时区,于是尝试一下2者并用
最终解决方案:
1.Dockerfile文件里设置时区:
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
2.在启动docker容器时,指定启动参数,挂载localtime文件到容器内,保证两者所采用的时区是一致的
docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime
至此,主机时区与容器时区一致,日志输出结果时间也对了,数据库保存的时间也对了。