如何以最通用且与发行版无关的方式设置本地时间/时区?

fre*_*rik 5 linux centos docker

我创建了一个 docker 容器,它在错误的时区运行。我个人需要它在我的时区运行(欧洲/斯德哥尔摩,GMT+1)。由于该项目是开源的,其他用户也可能希望改变它。我希望任何人都可以轻松地在 Dockerfile 或 docker-compose.yml 中更改它。

如果可能,我还希望该解决方案不仅适用于 CentOS,以防有人希望使用不同的发行版。

在我的 docker 容器中设置本地时间/时区的最与发行版无关的方法是什么?


这两种方法似乎很常见,但我不确定它们是否真的对我来说是最好的方法:

TZ 环境变量

一些 Linux 发行版读取 TZ 环境变量。但是,我注意到当我使用centos:7图像时它不起作用。

/etc/本地时间

您可以在 docker-compose.yml 中将容器映射/etc/localtime/etc/localtime主机上。但是这样做时,使用的发行版/etc/timezone会保留在 UTC 和软件中,这些软件可能正在读取然后会读取错误的时区。

小智 3

与发行版无关的需要一个脚本来检测正在使用哪个发行版。这是因为每个发行版“系列”都有不同的时区标记方式。对于某些人来说,将以下内容添加到 Dockerfile 可能会起作用:

RUN echo "欧洲/斯德哥尔摩" > /etc/timezone

其他(例如 Debian)需要使用上述命令,然后使用另一个 Dockerfile 命令,例如:

运行 运行 sudo dpkg-reconfigure -f 非交互式 tzdata

其他发行版(IIRC,包括 CentOS)需要类似:

运行 ln -s /usr/share/zoneinfo/Europe/Stockhom /etc/localtime

使其与发行版无关需要研究每个发行版重新配置时区的方法。如果您查看 /etc/localtime,您会发现它不是一个文本文件。