docker 中的模拟时间(-compose)

问题描述 投票:0回答:2

在测试执行作业的 docker 映像的范围内,我需要在执行期间模拟容器日期,以便进行一些涉及时间的准确测试。

查遍互联网,我还没有找到任何解决方案,只是一些可以遵循的路径。
我需要的是一种更改系统日期的方法,而无需手动连接到 shell,我计划使用 docker-compose 设置测试,并且我想将日期配置为配置参数。

你有过类似的经历吗?你是怎么解决的?

第一个问题是更改日期,我只找到了

date
命令来执行此操作。

我正在寻找两种方法:

  1. 扩展基础镜像并在
    date
    之前执行
    entrypoint
    。 我不觉得为每个容器重新创建图像有问题,但我不喜欢这样的事实:我无法“代理”入口点,这是我发现执行
    date
    命令的唯一方法是用执行它的
    sh
    重新定义入口点,然后调用旧的入口点,但它必须“知道”它是什么,我没有找到一种方法来执行基本图像是什么。
  2. 使用 NTP 服务器。在这件事上我还不是个新手,但我正在考虑在 docker 创建的网络中注入一个 ntp 服务器,该服务器将我的模拟日期告诉其网络中的其他容器。但我没有找到在 docker 中使用假时间配置模拟 ntp 服务器的方法。

目前我被困住了,还有一个“你不能使用NTP服务器,因为blablabla...”会有所帮助,或者如果你有办法做到这一点也会更好!

docker date time docker-compose mocking
2个回答
3
投票

我实际上无法更改 docker 容器内的日期。 docker时钟与系统时钟同步。

还有其他解决方案:是否可以更改 docker 容器中的日期?

根据我对 ntp 的了解,ntp 客户端会尝试更新系统时钟。因此,您可能无法使用 NTP,因为简单的安装会尝试更改系统时钟,然后无法在 docker 内执行此操作。也许有一个 ntp 客户端可以进行模拟,但我认为您又回到了同样的问题,并且您最好使用该链接中的模拟库。

测试时钟偏差很重要(https://aphyr.com/posts/299-the-trouble-with-timestamps),我也很惊讶互联网上没有更多关于此的信息。


0
投票

我发现 libfaketime 对此很有用。为此,它安装了一个名为

faketime(1)
的包装器。根据手册页:

给定的命令将被欺骗相信当前系统时间是时间戳中指定的时间。还将报告与此时间戳相关的文件系统时间戳。除非另有说明,挂钟将从该日期和时间继续运行(请参阅高级选项)。

在您的容器中,只需安装

libfaketime
并使用
faketime(1)
包装器,如下所示:

faketime "2019-09-18 19:46:00" my-script

该库似乎在许多发行版的存储库中都可用;例如适用于基于 RHEL 的系统的 EPEL:

dnf install -y epel-release && dnf install -y libfaketime

在 Debian/Ubuntu 上:

apt update -y && apt install -y libfaketime

对于 Alpine Linux 3.18,该软件包在稳定存储库中不可用,但在边缘社区存储库中:

echo 'https://dl-cdn.alpinelinux.org/alpine/edge/community' >>/etc/apk/repositories
apk update && apk install libfaketime
© www.soinside.com 2019 - 2024. All rights reserved.