记录 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和阿里云时间同步服务器同步为当前时间。

 

posted @ 2020-10-27 17:45  江戸川のコナン  阅读(1658)  评论(0编辑  收藏  举报
……