【问题标题】:Setting TimeZone for a Windows Container为 Windows 容器设置时区
【发布时间】:2019-08-26 03:19:01
【问题描述】:

我正在尝试设置基于 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 容器完成此操作吗?

【问题讨论】:

  • 您的主机设置为非英语吗? (如果是这样,github.com/moby/moby/issues/38146 可能是相关的!)
  • 感谢@tianon,我发现在 Windows Container 的情况下,它们能够与主机同步,并且相应的时区设置为主机操作系统的时区。现在这个功能对我有用.....所以我很好
  • @SoumenMukherjee 您介意将您的评论作为答案吗?我认为应该是。至少它对我有用。
  • 我并不是在所有情况下都这样。如果主机是云管理的(例如:AWS ECS),我找不到任何方法来更改主机时区

标签: docker powershell windows-server-2019 windows-container windows-server-2022


【解决方案1】:

已编辑:正如Pierre-Luc Champigny 指出的那样,据微软称,现在 ltsc 版本和即将推出的版本都支持此功能:https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/virtual-time-zone

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

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

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

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

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

【讨论】:

  • 我会添加声音:-)
  • ...团队意识到了这个问题 :-) 此时(2020 年 10 月)发生的情况是时区未虚拟化,主机上设置的任何内容都会流入使用创建的容器中--isolation=进程
  • 您的答案完全正确,尽管这将随着 Windows Server 2022 的变化而改变。
  • @Joao 你能更新你的答案吗?根据微软的说法,现在 ltsc 版本和即将推出的版本都支持此功能:docs.microsoft.com/en-us/virtualization/windowscontainers/…
【解决方案2】:

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

更多信息在这里:https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/virtual-time-zone

【讨论】:

    【解决方案3】:

    您是否尝试使用tzutil 命令?

    • 方法一:

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

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

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

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

    【讨论】:

    • 在我写这篇文章时,在 --isolation=process 模式下的容器内设置时区被阻止。原因是内核中的时区代码没有虚拟化,但很快就会虚拟化,从最近在 MS Ignite 2021 上宣布的 Windows Server 2022 开始。目前,从容器内更改时区会影响到主机和其他容器,即不可取。容器也不会读取该注册表位置,该数据仅在内核初始化期间读取,并且处于 --isolation=process 模式的容器共享主机的内核,该内核显然已经初始化。
    【解决方案4】:

    Tzutil.exe 和 PowerShell 的 Set-TimeZone 以及所有通过系统 API 更改时区的应用程序将能够从 Windows Server 2022 开始以 --isolation=process 模式在容器内设置时区。无论在主机上运行什么都会在容器内工作,包括 DST,即使容器的时区与主机的 DST 政策不同,例如某些地区在不同的日期进入/退出 DST,或者根本没有。

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

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

    【讨论】:

      【解决方案5】:

      我发现,在 Windows Container 的情况下,它们能够与主机同步,并且相应的时区设置为主机操作系统的时区,所以我们真的不需要做任何特定的事情来设置 TimeZone码头集装箱。

      【讨论】:

        猜你喜欢
        • 2020-01-29
        • 1970-01-01
        • 2017-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多