记录 docker 容器内更改时间的问题-20201028
遇到的问题
1. K8S管理docker容器的项目。
2. 测试需要更改docker容器的时间测试活动等等。
3. docker容器内更改时间会提示:cannot set date Operation not permitted
解决方案
1. 使用 faketime 的方式修改时间。失败!!! (貌似需要程序做一些改动才行,后来没有采用此种方案,但可以学习借鉴一下)
在github上有一个工具可以帮助我们修改容器内的时间: https://github.com/wolfcw/libfaketime
具体操作,以dockerfile为例
vim Dockerfile # 准备一个dockerfile文件
FROM alpine:latest # 此dockerfile文件基于alpine镜像生成docker镜像 # 修改软件镜像源为阿里镜像 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories # 修改时区为上海 RUN apk add -U tzdata RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo 'Asia/Shanghai' >/etc/timezone # 安装一些必要的软件 RUN apk add gcc RUN apk add g++ RUN apk add make RUN apk add wget RUN apk add busybox-extras # 安装telnet工具 RUN apk add curl RUN apk add vim RUN apk add git # 安装容器内更改时间的软件libfaketime RUN git clone https://github.com/wolfcw/libfaketime RUN cd libfaketime/src/ && make && make install
build 生成镜像
docker build -t alpine_zuqiu:v1 .
查看镜像
docker images
用该镜像启动容器
docker run -it alpine_zuqiu:v1 /bin/sh
验证
弊端:
1. 根据上述做的容器内修改时间,时间不会走,只是起到一个欺骗程序的作用,需要程序这边做一些机制才能达到程序识别欺骗时间的目的。
2. 退出当前容器,再进入容器时间还原了,连接docker容器是通过开一个线程去连接,当退出后线程关闭,就没了。
可以将制作好的镜像上传到私有仓库,大家都可以研究
docker tag alpine_jietouzuqiu:v1 192.168.1.231:80/jtzq/alpine_zuqiu:latest docker push 192.168.1.231:80/jtzq/alpine_zuqiu:latest
综上所述:后来我们没有采用这种方法更改docker容器内的时间。
最终采用方法:
1. 准备一台或者两台K8S的node节点,作为测试的专门测试node
2. 将测试需要更改时间验证的pod,通过K8S标签的方式和测试服务器绑定在一起。
3. 直接shell连接测试的服务器,使用linux系统命令 date -s “年-月-日 时:分:秒” 的方式更改时间,主机时间更改了,容器内时间自动就会变化。
4. 当测试完毕需要调回东八区的时间,在ntpdate ntp1.aliyun.com和阿里云时间同步服务器同步为当前时间。