首页 > 其他分享 >docker内时间与北京时间相差8小时解决

docker内时间与北京时间相差8小时解决

时间:2024-01-22 18:47:27浏览次数:18  
标签:容器 相差 etc 时间 TZ docker localtime

在使用docker容器查看日志的过程中,发现容器内的时间与实际时间晚了8小时,其实那个是UTC时间(标准时间),而我们所处的是CST时间(东八区时间)

 

创建容器查看日志

  启动一个容器

1 docker run --3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql3306 mysql:5.7

   查看日志

1 docker logs mysql3306

   可以看到日志比系统时候少8小时

一,进入容器内修改(已经实践过的)
(1)更改容器时间
也就是操作的文件夹是容器内的文件夹,不再是宿主机的
首先是从宿主机进入容器,输入以下命令(containerID就是我们在宿主机通过docker ps -a获取到的容器id值):

docker exec -it containerID /bin/bash

进入容器后,我们ls即可看到已经进入容器内部,容器内部的文件目录和我们的linux目录是一样的(退出容器是exit),我们输入以下命令进行修改:

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

我们此使输入date即可查看到时区已经进行了更改,即便是重启也会保存此次更改


(2)更改java相关程序获取到的时间
虽然系统时间有改为CST时区,但是java中的new Date()获取到的时间仍然是UTC时间,这是因为:
LINUX下:jre是从/etc/sysconfig/clock这个文件中获取时区信息的,修改次文件即可,没有的话添加一个。
我们使用以下命令在sysconfig目录添加一个clock文件(如果目录也不存在,那么目录也添加上)

touch clock

clock文件创建好了,我发现没有办法使用vim去编辑clock文件,可能容器内没有装vim,所以我们分别执行下边两条命令进行安装:

apt update
apt install vim

然后编辑clock文件放入以下内容,然后:wq保存退出,

ZONE="Asia/Shanghai"
UTC=false
ARC=false

就可以发现与java相关的系统日志时间已经是CST的了,我操作时间就是14:10


下边这两种方法是在网上找的另外两种,但是如果要是java相关程序获取到CST时间,仍然要使用上边(2)做法

二,在宿主机内对容器进行修改
直接执行以下命令,不需要进入容器内

docker cp /etc/localtime [容器ID或者NAME]:/etc/localtime

三,通过dockerfile对容器进行修改
这个方法的好处是不用每次启动新的容器都要进行修改,上边两种方法修改后只能在同一容器中生效,通过更改dockerfile,进行创建新的容器时就已经是修改过的了,我们需要在对应镜像的dockerfile中添加如下内容:

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

 

容器生成前(进入dockerfile里面设置)

 

FROM ${docker.registry.public}/jdk:8u252       

 ENV TZ=Asia/Shanghai                 

   RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

WORKDIR /

COPY ${project.build.finalName}.jar ${project.artifactId}.jar

ENTRYPOINT ["java","-Duser.timezone=GMT+08", "-jar", "${project.artifactId}.jar"]

上面指定时区TZ,时间-Duser.timezone

 

-s  --symbolic比较容易,有-s时表示创建软连接,没有-s时,表示创建硬链接

-f  --force 强行删除任何已存在的目标文件

-n  --no-dereference 把符号连接的目的目录视为一般文件

 

 

jdk读取linux系统时间步骤:

0. 先找vm参数 :  -Duser.timezone=Asia /Shanghai

1.先找“TZ”变量,没有,到2,

2.读/etc/timezone,没有到3,

3.比较/etc/localtime文件与"/usr/share/zoneinfo目录下所有时区文件,如果有一致的,就为该时区,如果没有,到4,

4.默认为标准GMT

(参考:https://blog.csdn.net/weixin_34072159/article/details/88031424

JVM加载TimeZone读取文件优先级实战分析

     ) 或者:

在dockerfile中加入:

RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \

    && echo 'Asia/Shanghai' >/etc/timezone \

把时间改成东八区就可以了

 



链接:https://www.jianshu.com/p/387959fc2fae  


参考:https://blog.csdn.net/Jarbein/article/details/103631718

标签:容器,相差,etc,时间,TZ,docker,localtime
From: https://www.cnblogs.com/youxin/p/17980720

相关文章

  • 卡西欧运动表怎么调时间
    卡西欧运动表怎么调时间卡西欧是一家专业时尚电子产品制造商,其运动表系列深受消费者的喜爱。随着现代人们越来越关注健康和运动,卡西欧运动表也成为了很多人日常生活中必不可少的物品。在使用卡西欧运动表的过程中,调整时间是基础操作之一。下面,我们来看看卡西欧运动表怎么调时间。第......
  • 微信小程序如何获取当前日期时间
    Hello大家好!我是咕噜铁蛋,获取当前日期时间是小程序中经常会用到的一个功能。因此,在本文中,我通过科技手段给大家收集整理了下,今天我将向大家介绍如何在微信小程序中获取当前日期时间的方法,并分享一些实用技巧和注意事项。一、获取当前日期时间的方法在微信小程序中,获取当前日期时间......
  • 时间跨度为一个月
    vardateObj=this.getLastMonth();this.dateTime=[newDate(dateObj.last).Format("yyyyMMdd"),newDate(dateObj.now).Format("yyyyMMdd")];getLastMonth(){varnow=newDate();varyear=now.getFullYear()......
  • SQL Server 2012 AlwaysON 同步延迟时间
     SELECTavailability_mode_desc,role_desc,replica_server_name,last_redone_time,GETDATE()now,DATEDIFF(ms,last_redone_time,GETDATE())diffMSFROM((sys.availability_groupsASagJOINsys.......
  • linux下安装dockers
    Linux下安装docker清除原先dockersyumremovedockerdocker-clientdocker-client-latestdocker-commondocker-latestdocker-latest-logrotatedocker-logrotatedocker-engine部署dockers依赖yuminstall-yyum-utils配置阿里dockers镜像源yum-config-manager--......
  • abc等多个系统 每个系统有多个文档 ,每个系统根据不同的文类型获取该文件类型最新上传
    假如有abc等多个系统每个系统有多个文档,每个系统根据不同的文类型获取该文件类型最新上传时间文档(文件类型(文件类型字段为idoctype)分别为设计文档和评审记录文档,最新上传时间字段为duptime)这个思路和Java代码list怎莫处理对于这个问题,可以使用一个嵌套的Map来处理。外层的M......
  • 如何检查 docker 容器日志大小并进行清理
    检查各容器日志大小:ls-lh$(find/var/lib/docker/containers/-name*-json.log)清空日志(需先进入到具体容器目录):cat/dev/null>*-json.log 限制容器日志大小(以配置日志文件最大为10MB,最多留存3个为例)1、在docker运行时添加参数:dockerrun-d\--log-optmax-si......
  • js---格式化时间显示
    我们在做时间渲染的时候,经常会遇到需要将时间转为特定的显示方式,以下是常见的时间显示格式化方法:exportfunctionformateTime(timeStamp){timeStamp=timeStamp*1000;letdate=newDate(timeStamp);letyear=date.getFullYear();letmonth=date.g......
  • docker构建跨平台应用(x86,arm)
    1.直接从官方仓库拉去指定平台的镜像dockerpull--platform=<plartform><image-name>:<tag>例:dockerpull--platform=arm64nginx:latest2.打包指定平台的镜像安装并使用 buildx 使用 builder 构建跨平台镜像现在一些准备工作已经就绪,我们终于可以使用......
  • 企业级GitLab在Docker部署使用
    一、部署gitlab这里使用的是Centos8,安装Docker环境,这里不说了,参考:https://www.cnblogs.com/wei325/p/15139701.htmlgitlab有ce版和ee版,ce版为免费版本;ee版为企业版本,需要收费;这里用ce版。1)拉取Gitlab镜像dockerpullgitlab/gitlab-ce  2)启动Docker先建3个目......