单个docker容器修改时间,不影响宿主主机及其他容器

背景需求:

整个集群基于K8S,对于某一个应用有临时修改系统时间的需求,并且要求宿主主机的时间不能被改变,也不能够影响到其他容器。

解决办法

date是系统kernel的函数,而容器间是共享kernel的,所以默认情况下对于系统时间的修改虽然可以在容器内部进行修改,但其实本质上是修改整个系统宿主主机整体时间为代价,会影响到其他应用的运行。

这里我们采用开源工具libfaketime,github主页: https://github.com/wolfcw/libfaketime

libfaketime会拦截程序用于检索的各种系统调用当前日期和时间。然后将修改(伪造)的日期和时间(由您用户指定的)返回到这些程序。这意味着您可以修改系统时间一个程序不需要改变系统范围内的时间。 libfaketime 允许您指定绝对日期(例如,01/01/2020)和相对日期(如10天前)。

实现方式

首先编写我们的dockerfile 文件,下面是一个基于java8的基础镜像进行构建tomcat的dockerfile文件,大家可以根据需求更改。

我们提前将libfaketime、tomcat下载下来,准备好,然后构建dockerfile脚本。

FROM www.jiucool.org:5000/java:8-centos8

ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
RUN mkdir -p "$CATALINA_HOME/libfaketime"
WORKDIR $CATALINA_HOME

COPY libfaketime  ${CATALINA_HOME}/libfaketime/
COPY tomcat ./
## 以下设置libfaketime 速度有点慢,直接下载下来
RUN cd $CATALINA_HOME  \
    && yum install gcc gcc-c++ libstdc++-devel  automake autoconf libtool make -y \
    && yum clean all \
    && cd libfaketime/src \
    && make install

EXPOSE 8080
CMD ["catalina.sh", "run"]

构建成功后,若我们需要修改docker的系统时间,则我们仅将系统环境变量 faketime=”-10d”, 或者faketime=”@2020-12-24 20:30:00″ 更新即可,方便快捷。

Leave a Reply


正在读取数据……