Docker容器内修改系统时间方案总结

本文介绍了在无法修改宿主机时间的情况下,如何在Docker容器内部解决修改时间权限的问题。提供了两种方案:一是通过编辑sudoers文件赋予所有用户修改时间的权限;二是利用libfaketime库来模拟时间。详细步骤包括Dockerfile配置、容器内时间修改测试以及遇到的坑和解决方案。最终,将容器提交为新的镜像以便后续部署。
摘要由CSDN通过智能技术生成

背景:

        项目要使用docker部署到paas平台,但是由于项目本身原因,需要修改系统时间到2019-04-25才能启动。paas应该是使用k8s,我们只上传镜像,和拉起容器所需文件。而部署paas平台,只提供了平台界面给我们修改docker run语句等,并不能接触到系统层的东西。修改不了宿主机的时间,只能想办法解决在容器内修改时间权限问题。

方案一:

        Dockerfile使用的基础镜像是centos,我们可以拉个容器出来,修改/etc/sudoers给所有用户都有权限修改系统时间。进入容器后,直接执行 visudo 或者 vi /etc/sudoers,,如果出现如下图或者进入/etc目录为发现sudoers文件,则需要安装sudo

安装sudo:

yum install sudo 

安装完之后,/etc目录下就会有sudoers,然后编辑,找到 root  ALL=(ALL)  ALL 这行,在下面添加

ALL     ALL=(ALL)   NOPASSWD:/bin/date

 保存后,输入 sudo -l 查看是否ok:

 然后在容器内进行修改时间测试:

date -s "2019-04-25"

 测试ok没问题,这里注意docker run语句要加 --privileged

方案二:

        方案一折腾完后,paas平台告知是限制使用"--privileged"的,没办法,又找到使用libfaketime的方案。参考了 https://blog.csdn.net/cunxiedian8614/article/details/105694624/

 首先,从https://github.com/wolfcw/libfaketime/archive/master.zip将需要的源码zip包下载到本地,然后解压,再打包为tar,这样就不需要安装unzip工具。下面是我的测试Dockerfile,使用centos7作为基础镜像:

FROM centos:7

ADD libfaketime-master.tar /home

RUN yum -y install make

RUN yum -y install gcc gcc-c++

RUN cd /home/libfaketime-master && make ; make install
 
ENTRYPOINT /bin/bash

使用ADD命令,添加后会自动解压。

安装gcc gcc-c++是必需的。

创建目录 /home/libfaketime

将Dockerfile和libfaketime-master.tar上传到 /home/libfaketime

进入/home/libfaketime构建镜像:docker build  -t="centos-test2:v1" .

拉起容器:docker run --name mycentos -d -it centos-test2:v1 /bin/bash

进入容器:docker exec -it mycentos /bin/bash

测试修改时间:export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="2019-08-12 10:30:22" 

测试成功。

最后将该容器提交为镜像,做也业务基础镜像使用,就不需要重新安装make和gcc:

docker commit mycentos open-base:v2

另外记录下也踩了centos6.8 yum源不可用这个坑,找到可用源:

CentOS 6 2021 可用源
依次执行

sed -i "s|enabled=1|enabled=0|g" /etc/yum/pluginconf.d/fastestmirror.conf
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-6-Vault-Aliyun.repo
yum clean all
yum makecache

另外再记录下,export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="2019-08-12 10:30:22"  这样使用,时间会一直在2019-08-12 10:30:22不会变,需要变动的时间,"2019-08-12 10:30:22" 改为"@2019-08-12 10:30:22"。 参考 https://www.cnblogs.com/chengkanghua/p/11058660.html 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值