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 證書
- 正在執行的軟體在某個時間範圍之外停止執行
- 確定性的建構過程。
有可能的
解決方案是在容器中偽造它。這個庫攔截所有用於檢索目前時間和日期的系統呼叫程序。
實施很容易。根據需要向 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())