在 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/ 。 - 第一时间看后续精彩文章。觉得好的话,请猛击文章右下角「在看」,感谢支持。