# 关于Docker容器中时间时区问题的测试

news2024/12/23 3:33:39

关于Docker容器中时间时区问题的测试

文章目录

  • 关于Docker容器中时间时区问题的测试
    • 1 基础知识
      • 1.1 /etc/localtime
      • 1.2 /etc/timezone
    • 2 我在gitlab中遇到的问题与解决方法
    • 3 ubuntu官方镜像时区相关问题的测试
      • 3.0 官方原版测试
      • 3.1 不设置任何参数测试
      • 3.2 只设置`TZ="Asia/Shanghai"`参数测试
      • 3.3 只设置【`-v /etc/localtime:/etc/localtime`】参数测试,或设置【`TZ="Asia/Shanghai"`及`-v /etc/localtime:/etc/localtime`】参数测试(结果是一样的)
      • 3.4 冲突测试:设置【`TZ="Asia/Phnom_Penh"`】(东7区),设置【`-v /etc/localtime:/etc/localtime`】(东8区)
    • 4 最后

1 基础知识

1.1 /etc/localtime

/etc/localtime是用来描述 系统时间,如果系统时间不正确,通过修改该文件来修改时区
/etc/localtime文件通常是一个到/usr/share/zoneinfo/某时区文件的软链接,例如:`/etc/localtime -> /usr/share/zoneinfo/Etc/UTC`
/usr/share/zoneinfo/目录下是各种时区文件
可以通过软连接修改时区`ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime`,也可以通过`tzselect`修改时区。在容器中可以通过变量或挂载卷文件实现修改,具体要看Dockerfile文件的写法

1.2 /etc/timezone

/etc/timezone是用来描述本机所属时区的。有些程序是通过该文件获取时区的,比如:JAVA,也就是说/etc/timezone时区不正确,像java这样的程序,获取的时间可能不正确
修改时区:`echo 'Asia/Shanghai' >/etc/timezone`

2 我在gitlab中遇到的问题与解决方法

我在使用gitlab-ce:13.x.x版本的官方Docker镜像时(基于ubuntu 20.04),设置TZ变量后(TZ=“Asia/Shanghai”),在容器内部运行date,就会显示我设置的这个中国时区,但是gitlab备份计划生成的备份文件名却是UTC时间(gitlab.rb中的时区也已经设置为"Asia/Shanghai"了),此时我看到/etc/localtim是软链接到/usr/share/zoneinfo/Etc/UTC的,故,我把系统的/etc/localtime挂在到容器内部,再次执行备份计划就备份文件名的日期就变成正确的中国时间了。

3 ubuntu官方镜像时区相关问题的测试

注:检验时,我用的是当前最新的ubuntu的官方镜像,是基于20.04的版本打造的。

3.0 官方原版测试

官方原版ubuntu镜像没有时区配置信息,也没有时区数据文件,你看:

  • 结果:
date                 :UTC
/etc/timezone        :不存在
/etc/localtime       :不存在
/usr/share/zoneinfo  :时区数据文件也是不存在的
  • 过程:
[root@v-192-168-11-81-deploy:~]# docker run -it   --name yyy  ubuntu  bash
root@2aa65bac6540:/# 
root@2aa65bac6540:/# date
Fri Mar 10 14:48:00 UTC 2023
root@2aa65bac6540:/# 
root@2aa65bac6540:/# cat /etc/timezone
cat: /etc/timezone: No such file or directory
root@2aa65bac6540:/# 
root@2aa65bac6540:/# cat  /etc/localtime
cat: /etc/localtime: No such file or directory
root@2aa65bac6540:/# 
root@2aa65bac6540:/# ll /etc/localtime
ls: cannot access '/etc/localtime': No such file or directory
root@2aa65bac6540:/# 
root@2aa65bac6540:/# ll  /usr/share/zoneinfo
ls: cannot access '/usr/share/zoneinfo': No such file or directory
root@2aa65bac6540:/# exit
exit
[root@v-192-168-11-81-deploy:~]# 

以上是因为没有安装软件包tzdata,故,我基于ubuntu官方镜像安装tzdata构建新的补丁版的镜像【new-ubuntu】,Dockerfile内容如下:

FROM ubuntu
MAINTAINER ZZXia
RUN  apt-get update  && \
     apt-get install -y  tzdata

我想gitlab-ce的官方镜像也是这么干的吧

构建他docker build -t new-ubuntu ./
运行它,你会发现上面不存在的文件都有了
另:安装完tzdata后,在交互模式下,你可以运行tzselect命令以设置时区,镜像构建时不行(不方便)。

3.1 不设置任何参数测试

  • 结果:
date                 :UTC
/etc/timezone        :UTC
/etc/localtime       :UTC
/etc/localtime软链接  :UTC
  • 过程:
[root@v-192-168-11-81-deploy:~]# docker run -it   --name yyy  new-ubuntu  bash
root@3fde01074ae6:/# 
root@3fde01074ae6:/# date
2023年 03月 10日 星期五 14:23:27 UTC
root@3fde01074ae6:/# 
root@3fde01074ae6:/# cat  /etc/timezone
Etc/UTC
root@3fde01074ae6:/# 
root@3fde01074ae6:/# cat  /etc/localtime
TZif2UTCTZif2UTC
UTC0
root@3fde01074ae6:/# 
root@3fde01074ae6:/# ll  /etc/localtime 
lrwxrwxrwx 1 root root 27 Mar  9 15:10 /etc/localtime -> /usr/share/zoneinfo/Etc/UTC
root@3fde01074ae6:/# exit
exit
[root@v-192-168-11-81-deploy:~]# 

一切都在意料之中

3.2 只设置TZ="Asia/Shanghai"参数测试

  • 结果:
date                  :CST
/etc/timezone         :UTC
/etc/localtime        :UTC
/etc/localtime软链接   :UTC
  • 过程:
[root@v-192-168-11-81-deploy:~]# docker run -it  --env TZ="Asia/Shanghai"  --name yyy  new-ubuntu  bash
root@f85aa804a1fc:/# 
root@f85aa804a1fc:/# date
2023年 03月 10日 星期五 22:24:11 CST
root@f85aa804a1fc:/# 
root@f85aa804a1fc:/# cat  /etc/timezone
Etc/UTC
root@f85aa804a1fc:/# 
root@f85aa804a1fc:/# cat  /etc/localtime
TZif2UTCTZif2UTC
UTC0
root@f85aa804a1fc:/# 
root@f85aa804a1fc:/# ll  /etc/localtime 
lrwxrwxrwx 1 root root 27 Mar  9 15:10 /etc/localtime -> /usr/share/zoneinfo/Etc/UTC
root@f85aa804a1fc:/# exit
exit
[root@v-192-168-11-81-deploy:~]# 

/etc/timezone/etc/localtime都是UTC,但date输出的却是CST时区,TZ这环境变量到底是怎么达成这个结果的。在我前面gitlab-ce镜像中备份任务中却使用的是UTC时间

3.3 只设置【-v /etc/localtime:/etc/localtime】参数测试,或设置【TZ="Asia/Shanghai"-v /etc/localtime:/etc/localtime】参数测试(结果是一样的)

  • 结果:
date                  :CST
cat /etc/timezone     :UTC
cat /etc/localtime    :CST
/etc/localtime软链接   :为UTC,实际生效的是`-v`挂载的这个,即CST
  • 过程:
[root@v-192-168-11-81-deploy:~]# docker run -it  -v /etc/localtime:/etc/localtime  --name yyy  new-ubuntu  bash
root@b8d2b195f6bf:/# 
root@b8d2b195f6bf:/# date
2023年 03月 10日 星期五 22:25:12 CST
root@b8d2b195f6bf:/# 
root@b8d2b195f6bf:/# cat  /etc/timezone
Etc/UTC
root@b8d2b195f6bf:/# 
root@b8d2b195f6bf:/# cat  /etc/localtime
TZif�����y��Y^��	�p�ӽ����|@�;>�Ӌ{��B���E"�L���<��fp���A|��R i�� ~��!I}�"g� #)_�$G� %|&'e &�^(G (�@~�p�CDTCSTTZif2
                                                                                                                        ����~6C)�������������y������Y^������	�p�����ӽ������������|@�����;>�����Ӌ{������B�������E"�����L�������<������fp�����������A|��R i�� ~��!I}�"g� #)_�$G� %|&'e &�^(G (�@q�~�pLMTCDTCST
CST-8
root@b8d2b195f6bf:/# 
root@b8d2b195f6bf:/# ll  /etc/localtime 
lrwxrwxrwx 1 root root 27 Mar  9 15:10 /etc/localtime -> /usr/share/zoneinfo/Etc/UTC
root@b8d2b195f6bf:/# exit
exit
[root@v-192-168-11-81-deploy:~]# 

一切都在意料之中,正与我在前面【我在gitlab中遇到的问题与解决方法】一节中讲到的一样,在date与计划任务中都能达成想要的结果

3.4 冲突测试:设置【TZ="Asia/Phnom_Penh"】(东7区),设置【-v /etc/localtime:/etc/localtime】(东8区)

  • 结果:
date                  :+07
cat /etc/timezone     :UTC
cat /etc/localtime    :CST(+08)
/etc/localtime软链接   :UTC
  • 过程:
[root@v-192-168-11-81-deploy:~]# docker run -it  --env TZ="Asia/Phnom_Penh"  -v /etc/localtime:/etc/localtime  --name yyyx  my-oracle-java-8  bash
root@29561a94da99:/# 
root@29561a94da99:/# date
2023年 03月 11日 星期六 13:20:16 +07
root@29561a94da99:/# 
root@29561a94da99:/# cat /etc/timezone 
Etc/UTC
root@29561a94da99:/# 
root@29561a94da99:/# cat  /etc/localtime 
TZif�����y��Y^��	�p�ӽ����|@�;>�Ӌ{��B���E"�L���<��fp���A|��R i�� ~��!I}�"g� #)_�$G� %|&'e &�^(G (�@~�p�CDTCSTTZif2
                                                                                                                        ����~6C)�������������y������Y^������	�p�����ӽ������������|@�����;>�����Ӌ{������B�������E"�����L�������<������fp�����������A|��R i�� ~��!I}�"g� #)_�$G� %|&'e &�^(G (�@q�~�pLMTCDTCST
CST-8
root@29561a94da99:/# 
root@29561a94da99:/# ll  /etc/localtime 
lrwxrwxrwx 1 root root 27 39 14:10 /etc/localtime -> /usr/share/zoneinfo/Etc/UTC
root@29561a94da99:/# 
root@29561a94da99:/# exit
exit
[root@v-192-168-11-81-deploy:~]# 

看到没,两个相互冲突的设置,最终date命令取得是TZ变量的设置,为什么?他是怎么做到的?网上说(简单查下)ubuntu镜像的Dockerfile是这么写的:

FROM ubuntu:bionic
ENV TZ=Asia/Shanghai
RUN apt update
    && apt install -y tzdata
    && echo "${TZ}" > /etc/timezone
    && rm -f /etc/localtime  &&  ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime

4 最后

  • 猜测:交互程序一般会使用date的结果,但计划任务之类的程序可能会使用/etc/localtime的设置(/etc/localtime可能属于系统级的)
  • 容器中TZ变量是怎么做到影响date命令结果的,以后有时间再研究下

爱你

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/404328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud Gateway 监控、多网关实例路由共享 | Spring Cloud 18

一、监控 Actuator是Spring Boot提供的用来对应用系统进行监控的功能模块&#xff0c;借助于Actuator开发者可以很方便地对应用系统某些监控指标进行查看、统计等。 Actuator的核心是端点Endpoint。 Endpoint可以让我们监视应用程序并与其交互。Spring Boot包含许多内置端点…

rapidcsv 写csv文件实例

csv实质是一个文本文件&#xff0c;可以使用rapidcsv写文件操作&#xff0c;如下实例&#xff1a; 第一行实质是从-1行开始&#xff0c;列是从0开始 #include "rapidcsv.h" #include <string> using namespace std; void CMFCApplication1Dlg::OnBnClickedBu…

【flask】URL和视图映射

目录 首页 传参 URL数据类型 get传参 首页 url与视图函数的映射是通过app.route()装饰器实现的。 只有一个斜杠代表的是根目录——首页。 传参 URL传参是通过<参数名称>的形式进行传递。URL中有几个参数&#xff0c;在视图函数中也要指定几个参数 from flask im…

WattOS:一个稳又快的轻量级 Linux 发行版

导读Linux 领域里的每个人不是听说过就是使用过某个轻量级的 Linux 发行版。大家都知道我们不断追求的是&#xff1a;占用内存少&#xff0c;配置资源要求低&#xff0c;包含一个轻量级的桌面环境&#xff08;或者窗口管理器&#xff09;&#xff0c;并且提供和其他发行版相似的…

从官网下载/处理 MNIST 数据集,并构造CNN网络训练

这里写自定义目录标题MNIST 网络 测试用1. 导入所需要的模块2. 下载 MNIST 数据集3. 读取 MNIST 数据集MNIST 网络 测试用 1. 导入所需要的模块 import sys sys.path.append(../../) from zfdplearn import fdutils, fdtorch_net, fddata import os import os.path as path i…

# 数据完整性算法在shell及python中的实践

数据完整性算法在shell及python中的实践 文章目录数据完整性算法在shell及python中的实践1 预备知识1.1 摘要算法1.2 报文&#xff08;数据&#xff09;完整性校验1.3 python byte类型字符串与普通字符串区别2 传统方法&#xff08;散列函数&#xff09;2.1 在shell中实践2.2 在…

python调试模块ipdb

1. 调试python ipdb是用来python中用以交互式debug的模块&#xff0c;可以直接利用pip安装; 其功能类似于pycharm中 python控制台&#xff0c; 而使用ipdb 的优点&#xff0c;便是直接在代码中调试&#xff0c; 避免了在python控制台&#xff0c;或者重新设置一些简单变量。…

Web前端开发--自用

第一章 1.1 时间&#xff1a;1980 人物&#xff1a;Tim Berners-Lee 地点&#xff1a;欧洲核子研究组织中最大的欧洲核子物理实验室 事件&#xff1a;与Robert Cailliau建立ENQUIRE系统 1984年&#xff0c;世界上第一个客户端浏览器&#xff08;World Wide Web&#xff09;和第…

软考高项——配置管理

配置管理配置管理配置管理6个主要活动配置项配置基线配置项的状态配置库配置库权限管理配置审计配置管理 配置管理的总线索包括&#xff1a; 1&#xff09;配置管理6个主要活动 2&#xff09;配置项 3&#xff09;配置基线 4&#xff09;配置项的状态 5&#xff09;配置库 6&a…

SAP SQVI快速报表的使用

SQVI快速报表 一、说明 对数据表进行查询通常使用SE16&#xff0c;但只限于单张表&#xff0c;对于多表联动的查询&#xff0c;则需要通过创建Query的方式&#xff0c;方法有多种&#xff0c;而SQVI是一种简洁快速的工具。SQVI全称是Quick Viewer&#xff0c;可以快速生成多表…

动态规划回文子串

647. 回文子串方法&#xff1a;双指针回文子串有长度为奇数和偶数两种&#xff0c;extend(s, i, i, n); extend(s, i, i 1, n);就分别对应长度为奇数和偶数的情况class Solution { private:int extend(const string& s, int i, int j, int n) {int res 0;while (i > 0…

前端——8.超链接标签

这篇文章&#xff0c;我们来讲一下超链接标签 目录 1.超链接标签介绍 1.1链接的分类 2.具体案例讲解 2.1外部链接 2.2 内部标签 2.3 空链接 2.4下载连接 2.5网页元素链接 2.6锚点标签 3.小结 1.超链接标签介绍 超链接标签是HTML中一个十分重要的标签&#xff0c;下…

案例18-面向对象之开门小例子

目录 一&#xff1a;背景介绍 二&#xff1a;思路&方案 1.面向过程 2.面向对象 3.面向对象(反射) 三&#xff1a;过程 1.面向过程&#xff1a;原本何老师的作用交给我了米老师来完成。 2.面向对象&#xff1a;把开门的方法完全交个何老师&#xff0c;米老师不需要有…

k8s 部署 skywalking 并持久化到es

1、k8s中安装部署 skywalking skywalking集群情况下需要保证用同一数据源&#xff0c;这里我们存储方式改为es 1.1 部署elasticsearch docker run -it -d -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS"-Xms256m -Xmx256m" -e "discovery.typesingle-node"…

DSRC技术

DSRC(Dedicated Short Range Communication)专用短程通信 定位 是V2X领域存在的两大通信技术之一&#xff08;另一个为LTE-V2X&#xff09;。 所属技术路线 与这两大技术相对应&#xff0c;是V2X无线通信技术的两大技术路线&#xff1a; IEEE 802.11p 本是04年指定的一个通…

一文入门HTML+CSS+JS(样例后续更新)

一文入门HTMLCSSJS&#xff08;样例后续更新&#xff09;前言HTML&#xff0c;CSS和JS的关系HTMLhead元素titlelinkmetabody元素设置网页正文颜色与背景颜色添加网页背景图片设置网页链接文字颜色设置网页边框文字与段落标记普通文字的输入对文字字体的设置 font使用文字的修饰…

代码随想录刷题-数组总结篇

文章目录数组二分查找原理习题题目1思路和代码题目-2移除元素习题我的想法暴力解法双指针有序数组的平方习题暴力排序双指针长度最小的子数组习题暴力解法滑动窗口螺旋矩阵 II习题我的解法别人的解法总结数组 二分查找 本节对应代码随想录中&#xff1a;代码随想录-二分查找 …

java教程--函数式接口--lambda表达式--方法引用

函数式接口 介绍 jdk8新特性&#xff0c;只有一个抽象方法的接口我们称之为函数接口。 FunctionalInterface ​ JDK的函数式接口都加上了FunctionalInterface 注解进行标识。但是无论是否加上该注解只要接口中只有一个抽象方法&#xff0c;都是函数式接口。 如在Comparato…

Makefile的概述

什么是makemake 是个命令&#xff0c;是个可执行程序&#xff0c;用来解析Makefile文件的命令&#xff0c;这个命令存放在 /usr/binmake概述1.GUN make是一种代码维护工具2.make 工具会根据makefile文件定义的规则和步骤&#xff0c;完成整个软件项目的代码维护工作。3.一般用来…

解决Win10图片/文件右键单击自动退出并刷新桌面问题

问题描述 这两天开始不知道怎么回事儿&#xff0c;右键选择图片时候&#xff0c;电脑黑屏且资源管理器自动重启。然后我就开始找很多方法去解决。 我试了很多种复杂的简单的方法&#xff0c;但是只有一种解决了我的问题。 解决方案【解决我的问题】 这个方法如下&#xff1…