在测试执行作业的 docker 映像的范围内,我需要在执行期间模拟容器日期,以便进行一些涉及时间的准确测试。
查遍互联网,我还没有找到任何解决方案,只是一些可以遵循的路径。
我需要的是一种更改系统日期的方法,而无需手动连接到 shell,我计划使用 docker-compose 设置测试,并且我想将日期配置为配置参数。
你有过类似的经历吗?你是怎么解决的?
第一个问题是更改日期,我只找到了
date
命令来执行此操作。
我正在寻找两种方法:
date
之前执行entrypoint
。
我不觉得为每个容器重新创建图像有问题,但我不喜欢这样的事实:我无法“代理”入口点,这是我发现执行 date
命令的唯一方法是用执行它的sh
重新定义入口点,然后调用旧的入口点,但它必须“知道”它是什么,我没有找到一种方法来执行基本图像是什么。目前我被困住了,还有一个“你不能使用NTP服务器,因为blablabla...”会有所帮助,或者如果你有办法做到这一点也会更好!
我实际上无法更改 docker 容器内的日期。 docker时钟与系统时钟同步。
还有其他解决方案:是否可以更改 docker 容器中的日期?
根据我对 ntp 的了解,ntp 客户端会尝试更新系统时钟。因此,您可能无法使用 NTP,因为简单的安装会尝试更改系统时钟,然后无法在 docker 内执行此操作。也许有一个 ntp 客户端可以进行模拟,但我认为您又回到了同样的问题,并且您最好使用该链接中的模拟库。
测试时钟偏差很重要(https://aphyr.com/posts/299-the-trouble-with-timestamps),我也很惊讶互联网上没有更多关于此的信息。
我发现 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