修改容器内时间
目的: 只修改容器内部的时间, 而不影响 os 上的时间
方法:通过 libfaketime 伪造时间
https://github.com/wolfcw/libfaketime
原理: libfaketime.so 拦截了获取时间的系统调用, 所以必须在加载库之后运行的程序才有效;
实践总结
- 最好是下载源码自己编译后单独挂载或打包的容器内
- 启动时 FAKETIME 变量的格式在不同平台上表现得不一样, rhel和ubuntu有区别
示例1
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y libfaketime
ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1
ENV FAKETIME="2025-01-01 12:00:00"
CMD ["/bin/bash"]示例2
FROM centos:7
RUN yum install make gcc gcc-c++ git -y && \
git clone https://github.com/wolfcw/libfaketime && \
cd libfaketime/src && \
make install
ENV LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 \
FAKETIME="2000-01-01 1:00:00"
ENTRYPOINT ["/usr/bin/python", "-m", "SimpleHTTPServer", "80"]
EXPOSE 80挂载库的方式
docker run -it \
-v /usr/lib/x86_64-linux-gnu/faketime:/usr/local/lib/faketime \
-e LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 \
-e FAKETIME="2025-01-01 12:00:00" \
ubuntu bash
docker run -it --rm \
-v /home/user1/code/tools/libfaketime/src:/usr/local/lib/faketime \
-e LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 \
-e FAKETIME_DONT_RESET=1 \
-e FAKETIME="@2020-12-24 20:30:00" \
ubuntu:24.04 bash环境变量配置
FAKETIME="2000-01-01 1:00:00" # 设置后时间会一直保持不变
FAKETIME="@2000-01-01 1:00:00" # 时间会从这个时间往后递增
FAKETIME="-15d" # 也可以用这个办法
# 如果启动的进程再启动其它的子进程, 则需要设置为1, 否则子进程获取的时间还是初始时间
FAKETIME_DONT_RESET=1其它方式
date -s "<time>"最后更新于