docker容器时间与宿主机不同的解决方法

本文介绍了如何解决Docker容器与宿主机之间的时区不一致问题,提供了多种实用的方法,包括挂载时区文件、复制时区文件等,并针对Spring Boot应用提出了具体的解决方案。

近日发现,阿里云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哈哈~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值