在Docker(Compose)中模拟时间

3
为了测试执行作业的docker镜像范围,我需要在其执行期间模拟容器日期,以便进行涉及时间的准确测试。在网上找了一圈,但还没有找到解决方案,只有一些可以遵循的路径。我需要一种改变系统日期的方法,而不必手动连接到shell,我计划使用docker-compose设置测试,并希望将日期配置为配置参数。
您是否有过类似的经历?你是怎么解决的?
首先问题是更改日期,我只发现了使用date命令的方法。
我正在寻找2种方法:
1.扩展基本镜像并在entrypoint之前执行日期。对于每个容器重新创建一个镜像并不是问题,但我不喜欢无法“代理”entrypoint的事实。我发现执行date命令的唯一方法是使用sh重新定义entrypoint,然后调用旧entrypoint,但它必须“知道”它是什么,我没有找到任何方法来做到这一点。
2.使用NTP服务器。我在这个问题上不是专家,但我想注入一个ntp服务器到docker创建的网络中,告诉其他容器网络中的模拟日期。但我没有找到一种配置模拟ntp服务器的方法,其中包含虚假的时间。
目前我被卡住了,如果您能提供一些帮助或某种方法来解决它,那将更好!
2个回答

3

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

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

据我所知,关于ntp的一些信息,ntp客户端会尝试更新系统时钟。因此,你不能使用NTP,因为一个天真的安装将尝试更改系统时钟,然后将无法在docker内部进行更改。也许有一个模拟的ntp客户端,但我认为你会遇到相同的问题,最好使用链接中的模拟库。

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


0
我发现libfaketime对此非常有用。它安装了一个名为faketime(1)的包装器,用于此目的。根据man页面的描述:

给定的命令将被欺骗,认为当前系统时间是指定的时间戳。文件系统的时间戳也将相对于此时间戳进行报告。除非另有指定(参见高级选项),壁钟将继续从此日期和时间运行。

在您的容器中,只需安装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版本,该软件包在稳定仓库中不可用,但在edge-community仓库中可用。
echo 'https://dl-cdn.alpinelinux.org/alpine/edge/community' >>/etc/apk/repositories
apk update && apk install libfaketime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接