docker集装箱中可以更改date吗?

我有一个在tomcat中运行程序的容器。 我只需在此容器中更改date并testing我的程序行为。 我有时间敏感的逻辑,有时需要看看在几天或几个月后发生的事情。 docker工人可能吗? 我读过,如果我在容器中更改date,date将在主机系统上发生变化。 但对我来说这是一个坏主意。 我需要在一台服务器上有这个应用程序的几个实例,并有可能为每个实例设置不同的时间。

但是当我尝试更改容器内的date时,我得到错误:

sudo date 04101812 date: cannot set date: Operation not permitted Fri Apr 10 18:12:00 UTC 2015 

dynamic更改Docker容器中的时间非常有可能,而不影响主机操作系统。

解决办法是伪造它。 这个lib拦截所有的系统调用程序用来检索当前的时间和date。

实施很简单。 根据需要向Dockerfile添加function:

 WORKDIR / RUN git clone https://github.com/wolfcw/libfaketime.git WORKDIR /libfaketime/src RUN make install 

请记住在运行要应用伪装时间的应用程序之前设置环境variablesLD_PRELOAD

例:

 CMD ["/bin/sh", "-c", "LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME_NO_CACHE=1 python /srv/intercept/manage.py runserver 0.0.0.0:3000] 

您现在可以dynamic更改服务器时间:

例:

 def set_time(request): import os print(datetime.today()) os.environ["FAKETIME"] = "2020-01-01" # Note: time of type string must be in the format "YYYY-MM-DD hh:mm:ss" or "+15d" print(datetime.today()) 

这对于Docker来说是不可能的。 Docker使用与外部内核相同的时钟。 你需要的是完全虚拟化,模拟一个完整的PC。

sudo失败,因为它只会让您成为容器内虚拟环境的root 。 这个用户与主机系统的真实root (除了名称和UID)没有关系,它不能做真正的root可以做的事情。

在使用像Python或Java这样的高级语言的时候,你经常会有一些钩子,你可以在其中模拟一定的系统时间进行testing,或者你可以编写包含“从系统获取当前时间”的代码并返回你的testing需要的代码。

这工作对我来说,也许你可以试试看:

dpkg-reconfigure tzdata

编辑:在你有问题的容器内执行它。 将出现一个界面。 在那里,你可以编辑时区和本地时间,例如,并正确设置,这解决了我的问题,这是一样的你的问题。

祝你好运!

是的,我testing了它,它工作!

当你运行你的图像时使用--privileged

例:

 docker run -i -t --rm --privileged my_image /bin/bash