【发布时间】:2018-05-24 02:26:14
【问题描述】:
我的 docker 容器在 mac (v10.13.4) 上运行时遇到了时间漂移:
一个应用正在执行如下代码:
var waitTime = InitialWaitTime;
while(condition)
{
Log($"Waiting for {waitTime}");
await Task.Delay(waitTime, cancelToken);
waitTime = await TimeSensitiveTask(cancelToken);
}
void Log(string message)
{
Console.WriteLine($"[{DateTime.UtcNow:o}] {message}");
}
在应用运行数小时后,使用docker logs -t container_name 会显示带有未来日期的日志。
时间漂移的结果是TimeSensitiveTask 由于提前执行而失败。我确实有一个重试策略,所以在等待更多时间后它最终成功,应用程序运行的时间越长,执行发生的越早。
登录容器并打印当前时间也通过打印未来时间来显示时间漂移。
docker exec -t <container_name> date -u && date -u
Fri May 25 14:28:16 UTC 2018
Fri May 25 14:26:34 UTC 2018
据我了解,docker for mac 的原生版本不应该有这个问题。我能做些什么来解决这个问题?
我已经尝试过将 docker 恢复出厂设置并完全卸载/重新安装 docker。
【问题讨论】:
-
请包括您在使用 docker 时使用的操作系统(直接,docker-machine、docker-for-mac 等)。有例如github.com/docker/for-mac/issues/17
-
另请注意,如果你想要一个特定的时间间隔,task.Delay 不是一个合适的调度程序,它会给你一个
TimeSensitiveTask花费的时间间隔。 -
什么是
Log?你能展示一下它的实现吗? -
如果时间在不涉及您的代码的情况下漂移,那么这可能根本不是与 C# 相关的问题,而是一个仅限 docker 的问题。
-
你是说你明白docker mac的原生版本不应该有这个问题,你为什么/如何理解这个?你有关于这个的链接吗?我发现了这个:github.com/docker/for-mac/issues/2076 - 这是你看到的问题吗?