背景:
项目要使用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.youkuaiyun.com/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