【解决】修改 docker 容器时间与宿主机不同
修改 docker 容器时间
需求:
这几天,开发提了个需求 “测试需要模拟未来某天的业务,发现容器里面没有修改时间的权限”,想在我们 k8s 集群上,调整容器时间
解决方案:
使用 --cap-add SYS_TIME
由于在容器中执行指令date +%T -s "18:00:00"
会给出date: cannot set date: Operation not permitted
的错误。
可以通过添加 --cap-add SYS_TIME
来实现,但是 --cap-add SYS_TIME
是为了将宿主机的内核时间挂载进来与容器共享,因此容器时间更改了,宿主机时间也会跟着更改,可能会带来更多的麻烦。所以这个办法不是最优解
使用 libfaketime
libfaketime
该库拦截所有用于检索当前时间和日期的系统调用程序,通过为程序伪造时间和日期,让程序可以看到我修改过的系统时间,而不需要更改真的系统时间
git clone https://github.com/wolfcw/libfaketime.git
cd libfaketime && make install
编译之后装在/usr/local/lib/faketime/libfaketime.so.1
启动时候通过加载环境变量即可
在 docker 中如何使用
FROM registry.cn-beijing.aliyuncs.com/liyongjian5179/centos:jdk8_zh
COPY ./libfaketime.so.1 /usr/local/lib/libfaketime.so.1
ENV LD_PRELOAD=/usr/local/lib/libfaketime.so.1
ENV FAKETIME="+50d"
编译后启动就可以看到时间的变化。
或者还可以容器中编译使用
WORKDIR /
RUN git clone https://github.com/wolfcw/libfaketime.git
WORKDIR /libfaketime/src
RUN make install
启动进程时候设置环境变量
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]