因为开发需要,需要临时修改容器内时间测试,且不影响宿主机的原始时间。调研了下相关方法,现做记录如下.
LIBFAKETIME
libfaketime 可以安装在linux和macOS系统。它使用操作系统的预加载library机制,因此对于静态链接或setuid程序是不适用的。libfaketime在系统中使用信号量和共享内存,以便在父子进程中同步faketime设置。
github地址
https://github.com/wolfcw/libfaketime
安装
git clone https://github.com/wolfcw/libfaketime
cd libfaketime
make make install
可以直接安装也可以打包到容器内,为了方便,我直接打包到基础镜像容器内
基于之前的基础镜像做修改
基于tini的openjdk8镜像_tini java-CSDN博客
FROM openjdk:8-jdk-alpine
#jdk采用openjdk8,操作系统采用alpine,减小体积
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
#修改镜像源为阿里源
ENV LANG=en_US.UTF-8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
#修改时区及默认字符集
# 安装容器内更改时间的软件libfaketime
RUN apk add build-base git
RUN git clone https://github.com/wolfcw/libfaketime /usr/local/src/libfaketime
WORKDIR /usr/local/src/libfaketime
RUN make && make install
RUN apk add --update --no-cache ttf-dejavu fontconfig busybox-extras iproute2 curl net-tools tcpdump wget&& \
apk --update --no-cache add tini && \
rm -rf /var/cache/apk/*
#添加常用工具及字符集字体等
#采用tini运行java,提高运行可靠性,防止僵尸进程,并且方便适应jdk自带命令
#***.jar 替换为需要运行的jar
ENTRYPOINT tini java $JAVA_OPTS -jar /***.jar
打包完基础镜像后,启动时需要指定环境变量
-e LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1
-e FAKETIME="2000-01-01 10:30:00"
注:FAKETIME="2000-01-01 10:30:00" 该变量设置后时间会一直保持不变,而 FAKETIME="@2000-01-01 10:30:00" 变量设置后时间会从这个时间往后递增。
例如
docker run --name test01 -e LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 -e FAKETIME="2000-01-01 10:30:00" -d node-socket-faketime:12.14 bash -c "while true;do sleep 2;done"
测试成功