Docker

如何在 Docker 容器中動態設置系統時間

  • September 8, 2021

有沒有辦法在不影響主機的情況下動態(在執行時)設置 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())

引用自:https://serverfault.com/questions/824631