修改容器内时间

修改容器内时间

目的: 只修改容器内部的时间, 而不影响 os 上的时间

方法:通过 libfaketime 伪造时间

https://github.com/wolfcw/libfaketime

原理: libfaketime.so 拦截了获取时间的系统调用, 所以必须在加载库之后运行的程序才有效;

实践总结

  1. 最好是下载源码自己编译后单独挂载或打包的容器内
  2. 启动时 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>"
最后更新于