学习
实践
活动
专区
工具
TVP
写文章
专栏首页ITCoderDocker 时区调整方案

Docker 时区调整方案

对于经常使用 Docker 的人来说,可能会碰到一个问题:时区问题。

大部分 Docker 镜像都是基于 Alpine,Ubuntu,Debian,CentOS 等基础镜像制作而成。

基本上都采用 UTC 时间,默认时区为零时区。

docker run --name test --rm -ti alpine /bin/sh
/ # date
Fri Nov 29 08:14:49 UTC 2019

而我们主要用的是 CST 时间,北京时间,位于东八区。时区代号: Asia/Shanghai

docker run --name test --rm -ti -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro alpine /bin/sh
/ # date
Fri Nov 29 16:13:55 CST 201

对比一下,我们会发现,时间上相差 8 小时。

经过一系列探索实践,我们总结了一些 Docker 时区调整方案。

一、运行 Docker 容器时调整时区

在 Linux 系统中,控制时区和时间的主要是两个地方:

  • /etc/timezone 主要代表当前时区设置,一般链接指向/usr/share/zoneinfo目录下的具体时区。
  • /etc/localtime 主要代表当前时区设置下的本地时间。

1. 通用 docker 时区修改方案

宿主机为 Linux 系统

当宿主机为 Linux 系统时,我们可以直接将宿主机上的/etc/timezone/etc/localtime挂载到容器中,这样可以保持容器和宿主机时区和时间一致。

 -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro

使用示例如下:

docker run --name test --rm -ti -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro alpine /bin/sh
/ # date
Fri Nov 29 16:13:55 CST 2019

2. 通过传递环境变量改变容器时区

  • 适用于基于 Debian 基础镜像, CentOS 基础镜像 制作的 Docker 镜像
  • 不适用于基于 Alpine 基础镜像, Ubuntu 基础镜像 制作的 Docker 镜像

对于基于 Debian 基础镜像,CentOS 基础镜像制作的 Docker 镜像,在运行 Docker 容器时,传递环境变量-e TZ=Asia/Shanghai进去,能修改 docker 容器时区。

-e TZ=Asia/Shanghai

使用示例如下:

docker run --name test -e TZ=Asia/Shanghai --rm -ti debian /bin/bash
/# date
Fri Nov 29 18:46:18 CST 2019

二、制作 Docker 镜像时调整时区

通过编写 Dockerfile,构建自己的 Docker 镜像,可以永久解决时区问题。

1. Alpine

根据《Setting the timezone》提示,我们可以将以下代码添加到 Dockerfile 中:

ENV TZ Asia/Shanghai

RUN apk add tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && apk del tzdata

2. Debian

Debian 基础镜像 中已经安装了 tzdata 包,我们可以将以下代码添加到 Dockerfile 中:

ENV TZ=Asia/Shanghai \
    DEBIAN_FRONTEND=noninteractive

RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && dpkg-reconfigure --frontend noninteractive tzdata \
    && rm -rf /var/lib/apt/lists/*

3. Ubuntu

Ubuntu 基础镜像中没有安装了 tzdata 包,因此我们需要先安装 tzdata 包。

我们可以将以下代码添加到 Dockerfile 中。

ENV TZ=Asia/Shanghai \
    DEBIAN_FRONTEND=noninteractive

RUN apt update \
    && apt install -y tzdata \
    && ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && dpkg-reconfigure --frontend noninteractive tzdata \
    && rm -rf /var/lib/apt/lists/*

4. CentOS

CentOS 基础镜像 中已经安装了 tzdata 包,我们可以将以下代码添加到 Dockerfile 中。

ENV TZ Asia/Shanghai

RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone

总结

时区问题是大问题。

时间没统一好,业务会乱套。

希望通过上面的内容,能够帮助大家解决好 Docker 方面的时区问题。

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://www.itcoder.tech/复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • MySQL时区问题_docker设置时区

    使用mysql-connector-java-8.0.9-rc出现以下异常:

    全栈程序员站长
  • 小知识:调整OCI实例的时区

    之前在随笔中《Linux (RHEL)修改时区》 介绍了时区修改方法。 默认OCI实例中,时区是GMT,在国内用看着这个时区就是很别扭的事情,于是修改时区,实...

    Alfred Zhao
  • Docker 容器时区问题

    kubectl exec -it podName -n namespace /bin/sh

    晓晨
  • springboot设置时区不起作用_docker设置时区

    此时数据库时区、容器时区、springboot时区都是CST,输出的时间还是可能差8小时,这因为Date进行json的时候还存一个时区,而springboot默...

    全栈程序员站长
  • Docker容器时间不同步,修改Docker时区

    今天发现日志服务器采集到的某一个系统的日志时间不对,和实际的时间相差了8个小时,我们估计问题是出在容器的时区的设置上。

    齐天小胜
  • alpine镜像修改docker的时区 转

    (adsbygoogle = window.adsbygoogle || []).push({});

    bdcn
  • 基于docker封装prometheus解决时区问题

    发现修改变量TZ=Asia/Shanghai,修改/etc/localtime 文件都无法修改时区,均失败了。

    py3study
  • Docker学习之宿机容器时区同步

    数据库挂掉以后,登录天兔查询监控时间,发现一些监控数据时间极其不准确,经查询原来容器采用的UTC时区,导致宿主机和容器两者之间的时间相差了八个小时!

    小柒2012
  • 不同Docker操作系统的时区同步

    我们经常会发现docker和宿主机的时间是不同步的,这几乎是个坑,特别是数据库系统,时间错误简直要命。这时间一般是相差8小时,因我们的时间是东八区时间,而doc...

    smooth00
  • Docker学习之宿机容器时区同步

    数据库挂掉以后,登录天兔查询监控时间,发现一些监控数据时间极其不准确,经查询原来容器采用的UTC时区,导致宿主机和容器两者之间的时间相差了八个小时!

    小柒2012
  • Linux/Centos7.x设置Docker镜像时区

    4xx.me
  • Docker 存储调整的几种方法

    通常情况下,不管是使用云服务器,还是物理服务器,根目录不会设置太大,很多docker使用者会遇到一个问题,就是默认所有的资源存储在/var/lib/docker...

    李俊鹏
  • SpringBoot 统一时区的方案

    思路为: 将数据库和服务器的时间都采用标准时区UTC存储处理。前端拿到标准时区的数据,统一根据用户所在时区进行转换。这样保证了后端数据时区的一致性,前端根据实...

    飞奔去旅行
  • Docker镜像制作实战:设置时区和系统编码

    在制作Docker镜像时常用centos的官方镜像作为基础镜像,这些基础镜像的时区和系统编码都不满足我们的需求,我们需要时区CST,系统编码UTF-8,今天我们...

    程序员欣宸
  • Docker修改正在运行的容器的时区

    笔者在对网站日志(nginx)做分析时,发现时间不在东八区,也就服务器时间和当前时间对不上,而该Web网站是放在Nginx容器中,本文是修改已经运行了的容器时区...

    肓己
  • 译|调整JavaScript抽象的迭代方案

    原文作者:Kaloyan Kosev 原文链接:https://css-tricks.com/adapting-javascript-abstractions-...

    iKcamp
  • Docker镜像制作实战:设置时区和系统编码

    先来看一下centos官方镜像的情况: 在装好了docker的机器上执行docker run —-name centos001 -idt centos:7,即可...

    PHP开发工程师
  • 关于调整Oozie时区为GMT+0800后,导致HUE Oozie的Bundle提交失败的问题解决方案

    如果将 Oozie 时区设置为 GMT+0800 后,在 HUE 3.12.0 版本中,提交 Oozie Bundle 时,会出现:

    create17
  • docker 日志方案

    运行上述镜像,在对于的容器进程目录下可以看到该进程打开个4个文件,其中fd为10的即是运行的shell 脚本,

    charlieroro

扫码关注腾讯云开发者

领取腾讯云代金券