记录 docker 容器内更改时间的问题-20201028
遇到的问题
1. K8S管理docker容器的项目。
2. 测试需要更改docker容器的时间测试活动等等。
3. docker容器内更改时间会提示:cannot set date Operation not permitted
解决方案
1. 使用 faketime 的方式修改时间。失败!!! (貌似需要程序做一些改动才行,后来没有采用此种方案,但可以学习借鉴一下)
在github上有一个工具可以帮助我们修改容器内的时间: https://github.com/wolfcw/libfaketime
具体操作,以dockerfile为例
1 | vim Dockerfile # 准备一个dockerfile文件 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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 生成镜像
1 | docker build -t alpine_zuqiu:v1 . |
查看镜像
1 | docker images |
用该镜像启动容器
1 | docker run -it alpine_zuqiu:v1 /bin/sh |
验证
弊端:
1. 根据上述做的容器内修改时间,时间不会走,只是起到一个欺骗程序的作用,需要程序这边做一些机制才能达到程序识别欺骗时间的目的。
2. 退出当前容器,再进入容器时间还原了,连接docker容器是通过开一个线程去连接,当退出后线程关闭,就没了。
可以将制作好的镜像上传到私有仓库,大家都可以研究
1 2 3 | 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和阿里云时间同步服务器同步为当前时间。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了