为 Windows 容器设置时区

Setting TimeZone for a Windows Container

我正在尝试设置基于 windows nano server 2019 Build 1809 的 WindowsContainer 的时区。

对 linux 容器执行此操作的最简单方法之一是设置 TimeZone 环境变量,如下所示:

docker run -e TZ=Asia/Kolkata ubuntu date

Windows 容器有类似的东西吗?基于一般的 windows 方法,我尝试使用 PowerShell 在入口点脚本中设置它(如下所示),但它也给我一个错误。

Set-TimeZone -Name "India Standard Time"
Set-TimeZone : Access is denied
At line:1 char:1
+ Set-TimeZone -Name "India Standard Time"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : FromStdErr: (:) [Set-TimeZone], Win32Exception
+ FullyQualifiedErrorId : SetTimeZoneFailed,Microsoft.PowerShell.Commands.SetTimeZoneCommand

知道如何为基于 Windows Nanoserver 2019 Build 1809 的 Windows 容器完成此操作吗?

我发现,在 Windows 容器的情况下,它们能够与主机同步,并且相应的时区设置为主机 OS 的时区,所以我们真的不知道需要做任何特定的事情来设置 docker 容器的时区。

您是否尝试使用 tzutil 命令?

  • 方法一:

    以下示例使用命令并设置澳大利亚时区:

    tzutil /s "AUS Eastern Standard Time"
    
  • 方法二:

    注册表项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation 包含与时区相关的所有信息。

    从具有正确时区的虚拟机或物理机,您可以导出注册表值并导入到容器中。

已编辑:Pierre-Luc Champigny pointed, according to Microsoft, this is now supported on ltsc versions and upcoming ones: https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/virtual-time-zone

无法在 Windows Server Core 容器上正确设置时区、语言或 Windows-位置等全球化设置。
  • tzutil 抛出权限不足错误
  • 容器启动时注册表设置被忽略

看来您必须确保容器主机上的时区正确。 这没有多大意义,AFAIK,关于容器的全部事情就是将它作为图像发送一次,然后 运行 它随处可见,具有 环境隔离和完整性 .. 对吧?!

无论如何你可以看到更多关于那个的细节issue on github

另外,我打开这个 suggestion on Windows Server uservoice 来改变那个行为。

此外,我已经为时区打开了这个 feature suggestion for improving Azure AKS host configuration

Tzutil.exe 和 PowerShell 的 Set-TimeZone 以及所有通过系统 API 更改时区的应用程序将能够从 --isolation=process 模式的容器内设置时区,从 Windows 服务器 2022。主机上的任何工作都将在容器内工作,包括 DST,即使容器的时区具有与主机不同的 DST 策略,例如某些区域 enter/exit DST 在不同的日期,或者根本没有。

最初,新容器和现有容器将像以前一样继承主机的时区(时区偏差和所有其他时区设置,例如 DST 策略),但一旦从特定容器实例中设置,相关容器将在它的剩余生命周期中坚持使用它,直到重新启动,直到再次更改。

在特定容器实例中更改时区对其他容器没有副作用,当然对主机也没有副作用,反之亦然。

自 2021 年 5 月起,在 2105B 服务版本(WS2019 内部版本 10.0.17763.1935)中,现在支持在容器内配置时区的功能。您可以使用 tzutil 或 Set-TimeZone 来设置容器本地的时区配置。

可在此处获取更多信息:https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/virtual-time-zone