前言
如果在启动Docker容器的过程中没有独自配置localtime,很可能造成Docker容器工夫与主机工夫不统一的状况,比方UTC和CST相差8小时,换句话来说就是容器工夫与北京工夫相差8个小时。
更新历史
2020年08月13日 - 初稿
浏览原文 - https://wsgzao.github.io/post...
问题形容
问题:容器工夫与北京工夫相差8个小时
# 查看主机工夫[root@localhost ~]# date2020年07月27日 星期三 22:42:44 CST# 查看容器工夫# docker exec -it <containerid> /bin/shroot@b43340ecf5ef:/# dateWed Jul 27 14:43:31 UTC 2020
起因:宿主机设置了时区,而Docker容器并没有设置,导致两者相差8小时
能够发现,他们相隔了8小时
CST应该是指(China Shanghai Time,东八区工夫)
UTC应该是指(Coordinated Universal Time,规范工夫)
所以,这2个工夫实际上应该相差8个小时
所以,必须对立两者的时区
解决方案
docker run 增加工夫参数
-v /etc/localtime:/etc/localtime# 实例1docker run -p 3306:3306 --name mysql -v /etc/localtime:/etc/localtime# 实例2docker run \ --detach \ --restart always \ --name 'scribe' \ --publish 11315:11315 \ --mount type=bind,source=/data/gop/,destination=/data/gop/,consistency=consistent \ -v /etc/localtime:/etc/localtime \ wsgzao/facebook-scribe
Dockerfile
# 办法1# 增加时区环境变量,亚洲,上海ENV TimeZone=Asia/Shanghai# 应用软连贯,并且将时区配置笼罩/etc/timezoneRUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone# 办法2# CentOSRUN echo "Asia/shanghai" > /etc/timezone# UbuntuRUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
docker-compose
#第一种形式(举荐):environment: TZ: Asia/Shanghai #第二种形式:environment: SET_CONTAINER_TIMEZONE=true CONTAINER_TIMEZONE=Asia/Shanghai#第三种形式:volumes: - /etc/timezone:/etc/timezone - /etc/localtime:/etc/localtime
宿主机间接执行命令给某个容器同步工夫
# 办法1:间接在宿主机操作docker cp /etc/localtime 【容器ID或者NAME】:/etc/localtimedocker cp -L /usr/share/zoneinfo/Asia/Shanghai 【容器ID或者NAME】:/etc/localtime# 办法2:登录容器同步时区timezoneln -sf /usr/share/zoneinfo/Asia/Singapore /etc/localtime
在实现后,再通过date命令进行查看以后工夫
然而,在容器中运行的程序的工夫不肯定能更新过去,比方在容器运行的mysql服务,在更新工夫后,通过sql查看mysql的工夫
select now() from dual;
能够发现,工夫并没有更改过去
这时候必须要重启mysql服务或者重启docker容器,mysql能力读取到更改过后的工夫