修改 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]