近日发现,阿里云docker容器内的时区和宿主机的时区不同,就导致了在mongodb插入数据的时候,少了八个小时
宿主机是这样的
1、缘起
容器内是这样的
可以看见容器内是采用的UTC而宿主机采用的是CST,UTC是世界协调时间主要是用来让各个国家协调时间的,也就是0时区,CST是中央标准时间,如果还不懂的话,举个例子就懂了。
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个小时)
这个时候问题就很清晰了,这个问题不大,但是遇到了也是种缘分,记录下吧。
2、缘灭
解决方法有很多种
1、从根源上消灭这一问题,让docker容器挂载宿主机时区
docker run --name <name> -v /etc/localtime:/etc/localtime:ro
2、复制相应的时区文件,替换系统时区文件;
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
有的容器基础镜像是有这个文件的,直接拷贝就可以,如果不能拷贝,则是因为创建镜像时依赖的基础镜像 运行的容器没有这两个文件,使用下面的办法
创建文件夹
mkdir -p /usr/share/zoneinfo/Asia
回到宿主机,复制宿主机里的文件到容器中
docker cp /usr/share/zoneinfo/Asia/Shanghai 容器ID或容器名:/usr/share/zoneinfo/Asia
进入容器
docker exec -it 容器Id或容器名 bash
执行命令 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3、直接复制
docker cp /etc/localtime:【容器ID或者NAME】/etc/localtime
4、写到Dockerfile里面去
RUN echo ‘Asia/Shanghai’ /etc/timezone
3、关于SpringBoot
上面只是同步了docker容器的时间,如果使用docker发布jar包这样还不够。
docker run -d -p 8080:8080 --name xx -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro xx
这才是正解O(∩_∩)O哈哈~
本文介绍了如何解决Docker容器与宿主机之间的时区不一致问题,提供了多种实用的方法,包括挂载时区文件、复制时区文件等,并针对Spring Boot应用提出了具体的解决方案。

被折叠的 条评论
为什么被折叠?



