是否可以在docker容器中更改日期?

Ale*_*ich 34 tomcat docker

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

但是当我尝试更改容器内的日期时,我收到错误:

sudo date 04101812
date: cannot set date: Operation not permitted
Fri Apr 10 18:12:00 UTC 2015
Run Code Online (Sandbox Code Playgroud)

Vin*_*oft 37

很有可能动态更改Docker容器中的时间,而不会影响主机操作系统.

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

实施很容易.根据需要向Dockerfile添加功能:

WORKDIR /
RUN git clone https://github.com/wolfcw/libfaketime.git
WORKDIR /libfaketime/src
RUN make install
Run Code Online (Sandbox Code Playgroud)

请记住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]
Run Code Online (Sandbox Code Playgroud)

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

例:

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())
Run Code Online (Sandbox Code Playgroud)

  • 对于 Debian 和 Ubuntu,存储库中还提供了 libfaketime 软件包。所以你不需要下载源代码并自己编译。对于 Debian Buster,例如,请参见此处:https://packages.debian.org/buster/libfaketime (4认同)
  • 这在 Docker 容器内工作。我使用 docker exec 来安装库并使用“export”设置变量。 (2认同)
  • 该解决方案对我也非常有效。我做了上面罗曼建议的操作,进入了容器,使用git签出了代码,运行了make install,然后将更改提交到映像,然后使用以下方法`docker run -it --rm [重启各种容器来重启容器。省略] spooforbrains / image1 / bin / bash -c“导出LD_PRELOAD = / usr / local / lib / faketime / libfaketime.so.1;导出FAKETIME_NO_CACHE = 1;导出FAKETIME = \” 2016-05-01 12:00:00 \“;节点nodeimage”` (2认同)
  • 这不适用于golang应用和其他静态链接的内容 (2认同)

Aar*_*lla 13

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

sudo,因为它只会让你失败root的虚拟环境的容器内.此用户与root主机系统的实际情况无关(除了名称和UID),它无法做真正的root事情.

在使用像Python或Java这样的高级语言时,您经常可以使用钩子来模拟测试的某个系统时间,或者编写包含"从系统获取当前时间"并返回测试所需内容的代码.

  • 请参阅 Vingtoft 的答案,了解 Docker 如何实现这一点 - /sf/answers/2908390411/ (3认同)

C4r*_*s96 8

这对我有用,也许你可以尝试一下:

dpkg-reconfigure tzdata

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

祝好运!

  • 这是配置时区,这不是回答问题 (10认同)
  • 怎么有 14 个人对一个没有回答问题的答案投了赞成票? (3认同)

Arc*_*ano 6

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

下面是一个使用 Java 的例子,以 Groovy 为例。但是Tomcat也可以使用。

FROM groovy:alpine
COPY --from=trajano/alpine-libfaketime  /faketime.so /lib/faketime.so
ENV LD_PRELOAD=/lib/faketime.so \
    DONT_FAKE_MONOTONIC=1
Run Code Online (Sandbox Code Playgroud)

然后FAKETIME在执行 docker run 时构建并传递环境变量

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

来源在trajano / alpine-libfaketime | Githubdocker镜像位于trajano/alpine-libfaketime | 码头枢纽

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