需在docker run时挂载以下两个文件
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro\
解释
Docker容器的默认时区取决于使用的基础镜像。许多常见的基础镜像(例如Debian,Ubuntu等)的默认时区通常是UTC(协调世界时)。这意味着如果没有在创建或运行Docker容器时显式设置一个特定的时区,那么容器内部的时间将按照UTC来显示。
-
/etc/timezone
: 这个文件包含了当前设置的时区信息。比如,如果系统设置为美国东部时区,这个文件的内容可能会是America/New_York
。 -
/etc/localtime
: 这个文件是当前设定的时区对应的数据文件的复制品或者软链接。这个文件用于提供本地化的日期和时间显示。
这两个文件在系统中扮演着不同的角色,而且都是影响系统时间表现的重要因素。如果希望让Docker容器的时间与宿主机完全一致,那么在运行容器时需要同时挂载这两个文件:
docker run -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro your_image
只挂载 /etc/timezone
或 /etc/localtime
可能会导致一些问题,比如在处理跨时区的日期和时间时可能出现错误。
默认情况下,Docker容器并不会自动挂载 /etc/localtime
文件。容器是通过宿主机的内核获取物理时间的。
Docker容器虽然在很多方面都与宿主机隔离,但它们共享同一个内核。这意味着,当容器需要获取当前的物理时间(例如,调用 time()
系统调用)时,它会直接从宿主机的内核获取这个信息。这就是为什么即使不挂载 /etc/localtime
,容器中的程序仍然能够获取到正确的物理时间。
然而,时区信息并不只是物理时间,它还涉及到逻辑时间的处理,包括日历计算、夏令时调整等等。这些信息是存储在 /etc/timezone
和 /etc/localtime
这两个文件中的。如果希望容器中的程序能够正确地处理这些时区相关的问题,那么需要将这两个文件同时挂载到容器中,缺一不可。
20240229 在Centos系列中没有/etc/timezone
文件(包括华为的openEuler)(只是个目录而且没有内容)
如果你想让 Docker 容器的时间与宿主机保持一致,你应该挂载以下两个文件:
/etc/localtime
:这个文件是一个到实际时区配置文件的链接,用于设置系统的本地时间。/etc/timezone
:这个文件包含了时区名称。不过请注意,并非所有的 Linux 发行版都有这个文件,比如 CentOS 就没有。在 Docker 运行命令中添加下面的参数可以将这两个文件挂载到容器中:
-v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro
:ro
意味着以只读方式挂载这些文件。然而,因为并非所有的 Linux 发行版都有
/etc/timezone
文件,如果你在没有这个文件的系统上尝试挂载它,可能会出现错误。解决方法就是仅挂载/etc/localtime
文件,像这样:
-v /etc/localtime:/etc/localtime:ro
这样做通常也能确保容器使用正确的时间,虽然可能无法获取到具体的时区名称。