一、設置時間
date --set '2015-11-23 0:10:40' # 方法一,通用
timedatectl set-time '2015-11-23 08:10:40' # 容器內可能不支持
二、設置時區
# 方法一,通用
# 對容器而言,也可以直接將宿主機的下面倆文件映射到容器內
# 或者有的容器支持使用環境變量
/bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone
# 方法二,容器內可能不支持
timedatectl set-timezone UTC
三、同步時間(一次性)
Alpine Linux: ntpd -d -q -n -p ntp3.aliyun.com
,立即同步時間,不限制同步間隔
CentOS/Ubuntu:
sudo apt-get install ntpdate # 或者 yum
ntpdate ntp3.aliyun.com
國內公共 ntp 服務器:
- 國家授時中心:ntp.ntsc.ac.cn
- 阿里雲:ntp3.aliyun.com
四、時間同步服務(常駐后台)
建議用 chronyd,有 docker 的可以跑容器版本的 chronyd
五、只修改應用本身的時間:libfaketime
這種需求常見於時光旅行測試(Time-Travel Testing),需要修改應用的時間,以確認與時間相關的邏輯是否正確(比如訂單是否過期之類的)。
為了不影響系統上別的軟件,最好是只修改應用本身的時間,不會影響操作系統全局。比如對運行在 kubernetes 集群上的一套微服務進行時光旅行 API 測試,修改(節點)操作系統的時間很可能會導致集群節點故障。
libfaketime 可以通過環境變量 FAKETIME
很方便的設置 fake 的 time,而不影響系統上其他環境的應用。這可以保證別的程序不受系統時間躍遷的影響。
我實際測試這個庫后發現:
- libfaketime 設置時間默認有 10s 的緩存,可通過設置環境變量 `FAKETIME_CACHE_DURATION 進行修改。參見 Time modification does not take effect immediately
- Python 能直接通過修改環境變量
FAKETIME
達到修改時間的目的。 - Dotnet 設置的環境變量
FAKETIME
對 libfaketime 無效,這可能和 dotnet 自身的環境變量模型有關。- dotnet 需要通過將參數寫入
/etc/faketimerc
或$HOME/.faketimerc
修改時間。
- dotnet 需要通過將參數寫入
- docker+dotnet+libfaketime 測試,發現性能問題比較嚴重。
修改環境變量的方法很方便,但不適合用於進程間相互修改時間(比如我 ssh 進容器改容器時間),有時可能會失效。而寫入配置文件的方法可以跨進程通信,更可靠。