首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >码头集装箱中可能有变更日期吗?

码头集装箱中可能有变更日期吗?
EN

Stack Overflow用户
提问于 2015-04-10 16:35:43
回答 4查看 77.8K关注 0票数 63

我有一个容器,在tomcat里面有一个正在运行的程序。我只需要在这个容器中更改日期,并测试我的程序行为。我有时间敏感的逻辑,有时需要看看几天或几个月后会发生什么。在码头可以吗?我读到,如果我在容器中更改日期,那么主机系统上的日期也会更改。但这对我来说不是个好主意。我需要在一个服务器上有这个应用程序的几个实例,并有可能为每个实例设置不同的时间。

但是,当我尝试更改容器中的日期时,我得到了错误:

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

回答 4

Stack Overflow用户

发布于 2017-01-09 20:47:37

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

解决方法就是伪造它。This lib拦截用于检索当前时间和日期的所有系统调用程序。

实现起来很简单。根据需要向Dockerfile添加功能:

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

请记住,在运行要应用伪造时间的应用程序之前,要设置环境变量LD_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]

现在,您可以动态更改服务器时间:

示例:

def set_time(request):
    import os
    import datetime
    print(datetime.datetime.today())
    os.environ["FAKETIME"] = "2020-01-01"  #  string must be "YYYY-MM-DD hh:mm:ss" or "+15d"
    print(datetime.today())
票数 55
EN

Stack Overflow用户

发布于 2015-04-10 20:35:02

这在Docker中是不可能的。Docker使用与外部内核相同的时钟。您需要的是完全虚拟化,它模拟一台完整的PC。

sudo失败是因为它只会让您对容器内的虚拟环境执行root操作。该用户与主机系统的真实root无关(除了通过名称和UID),并且它不能执行真实root可以执行的操作。

如果您使用Python或Java这样的高级语言,您通常会有一些钩子,您可以在其中模拟测试的特定系统时间,或者编写代码,包装“从系统获取当前时间”并返回测试所需的内容。

特别针对Java,使用joda-time。在那里你可以使用DateTimeUtils.setCurrentMillis*()注入你自己的时间源。

票数 19
EN

Stack Overflow用户

发布于 2018-10-15 16:24:49

我创建了一个包含libfaketime的Docker镜像,用于Alpine,但该过程可以在其他发行版中完成。

下面是一个使用Groovy的Java使用它的示例。但是Tomcat也可以使用。

FROM groovy:alpine
COPY --from=trajano/alpine-libfaketime  /faketime.so /lib/faketime.so
ENV LD_PRELOAD=/lib/faketime.so \
    DONT_FAKE_MONOTONIC=1

然后在执行docker运行时构建并传递FAKETIME环境变量,例如

docker build -f fakedemo-java.Dockerfile . -t fakedemo
docker run --rm -e FAKETIME=+15d fakedemo groovy -e "print new Date();"

源文件在trajano / alpine-libfaketime | Github中,docker镜像文件在trajano/alpine-libfaketime | dockerhub

我还创建了一个基于Ubuntu的变体:trajano / ubuntu-faketime | Github

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29556879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档