如何在 Docker 容器中动态设置系统时间

如何在 Docker 容器中动态设置系统时间

有没有办法可以动态设置 Docker 容器的系统时间(在运行时)而不影响主机?

使用

hwclock --set --date "Sat Aug 17 08:31:24 PDT 2016"

出现以下错误:

hwclock: Cannot access the Hardware Clock via any known method.
hwclock: Use the --debug option to see the details of our search for an access method.

使用

date -s "2 OCT 2006 18:00:00"

出现以下错误:

date: cannot set date: Operation not permitted

用例:

我需要测试时间敏感的软件(行为取决于日期)。

其他常见用例:

  • 运行存在 y2k 漏洞的旧版软件
  • 测试软件是否符合 2038 年标准
  • 调试与时间相关的问题,例如 SSL 证书过期
  • 正在运行的软件在特定时间段之外停止运行
  • 确定性的构建过程。

答案1

有可能的

解决方案是在容器中进行伪造。这个库拦截所有用于检索当前时间和日期的系统调用程序。

实现起来很简单。根据需要将功能添加到 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]

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

例子:

import os
def set_time(request):
    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())

答案2

解决方案如下docker-compose

添加/etc/localtime:/etc/localtime:rovolumes属性。

检查一下关联以获取一个例子。

答案3

使用附加环境变量启动容器:

docker run -e "SET_CONTAINER_TIMEZONE=true" \
           -e "CONTAINER_TIMEZONE=US/Arizona" [docker image name]

相关内容