在 Docker 容器中设置时区原来这么简单
Docker 容器中设置时区
在 linux 中, 通过 /etc/timezone 这个文件设置。 可以通过如下命令 持久化 时区设置, 其中 Asia/Shanghai 是我们需要的时区。
| |
容器中设置时区一直是独立于宿主机的。 可以通过挂载 /etc/timezone 的方式保持与宿主机时间一致。
| |
这种方法只适合 本地的、简单的、临时的 容器。
容器有一个很重要的特点, 就是 一处编译, 处处运行。 另外, 容器运行环境本身应该是 独立/隔离 的, 即使是时区也不应该依赖于宿主机。
通过 TZ 环境变量 设置时区
在 Linux 中, 还可以通过 TZ 这个环境变量来设置时区。 但是这种设置并不能实现持久化, 只能在 当前进程和其子进程 中生效。
| |
这种方式在 Linux 系统中不合适, 但是在容器中却相当合适。 因为容器核心就是 单进程应用, 不会像 Linux 系统上启动很多。
| |
如果需要是用 TZ 环境变量 实现时区控制, 需要安装 tzdata 这个包。
在 debian/ubuntu 中安装。
debian 的基础镜像默认情况下已经安装了 tzdata,而 ubuntu 并没有。
tzdata 安装时有交互操作, 需要选择默认时区。 通过 DEBIAN_FRONTEND=noninteractive 进入非交互模式, 直接安装。
| |
在 alpine 中安装
| |
容器中通过 TZ 环境变量 实现时区控制
- 我们需要在构建业务镜像的时候安装
tzdata并设置 默认时区。 - 在容器启动的时候, 根据需要再通过注入环境变量的方式设置时区。
Dockerfile 以 nginx:debian 为例
| |
假设通过上述 Dockerfile 构建的镜像名为 nginx:1.23-tz-shanghai。 通过 注入变量 修改时区。
直接使用, 我们将得到 CST 时区。
以下就不通过上述 Dockerfile 构建镜像了。 时区反着来。
默认 nginx:1.23 使用的是 Etc/UTC 时间。
| |
在启动的时候, 注入上海时区的环境变量
| |
docker-compose 或 Kubernetes 通过各自的方式注入环境变量即可。
时区列表
全球所有可用时区, 参考地址 https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
- 原文链接:https://typonotes.com/posts/2022/12/21/docker-container-set-timezone/
- 本文为原创文章,转载注明出处。
- 欢迎 扫码关注公众号
Go与云原生或 订阅网站 https://typonotes.com/ 。 - 第一时间看后续精彩文章。觉得好的话,请猛击文章右下角「在看」,感谢支持。


