有没有办法可以动态设置 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
答案3
使用附加环境变量启动容器:
docker run -e "SET_CONTAINER_TIMEZONE=true" \
-e "CONTAINER_TIMEZONE=US/Arizona" [docker image name]