Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docker timezone #19

Open
davideuler opened this issue May 29, 2022 · 0 comments
Open

docker timezone #19

davideuler opened this issue May 29, 2022 · 0 comments

Comments

@davideuler
Copy link
Owner

Docker 时区调整方案
https://cloud.tencent.com/developer/article/1626811

对于经常使用 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 方面的时区问题。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant