容器的时间问题:
如果想要直接进入容器,使用date -s修改日期,则会出现一个date: cannot set date: Operation not permitted的错误,而且也不会成功。
这是由于docker容器的隔离是基于Linux的Capability机制实现的, Linux的Capability机制允许你将超级用户相关的高级权限划分成为不同的小单元。目前Docker容器默认只用到了以下的Capability
而要修改系统时间需要有SYS_TIME权限。使用 --cap-add, --cap-drop 可以添加或禁用特定的权限。--privileged参数也可以达到开放权限的作用, 与--cap-add的区别就是, --privileged是将所有权限给容器
docker使用--privileged, --cap-add, --cap-drop 来对容器本身的能力进行开放或限制。
那么使用如下命令就可以直接改变时间了:
docker run -it --cap-add SYS_TIME --name centos centos /bin/bash
接着进入容器实行date命令修改时间,如果没有修改成功,,那么可能就是因为宿主机做了共享主机的localtime(比如laradock就做了):
docker run --name <name> -v /etc/localtime:/etc/localtime:ro ....
docker cp /etc/localtime:【容器ID或者NAME】/etc/localtime
如果修改成功一会就又恢复了,那么就可能要查看一下宿主机是否做了定时校准的任务。
但是如此执行之后,那就是容器时间变更为5月28日之后,宿主机的时间也跟着变更了, 因为上边操作的 --cap-add SYS_TIME是为了将宿主机的内核时间挂载进来与容器共享,因此容器时间更改了,宿主机时间也会跟着更改。
1、场景
使用docker部署了一个后端服务,测试需要改系统时间,如果直接改宿主机时间则会影响到其他的docker(不管是在宿主机上改还是通过–cap-add SYS_TIME参数在docker中修改)。有没有什么既能满足测试要求又不影响其他docker的方法呢?答案就是通过faketime来欺骗docker,达到此目的。
2、安装faketime
github地址:https://github.com/wolfcw/libfaketime
# 安装git
yum -y install git
# 下载faketime源码
git clone https://github.com/wolfcw/libfaketime
# 进入libfaketime文件夹下
cd libfaketime
# 编译源码
make
make install
安装完成后,在/usr/local/lib/下有个kaketime的目录
3、使用
3.1 比如想修改时间为2020-05-01 00:01:00,执行如下命令
export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="2020-05-01 00:01:00";
注意:
- 1、如果想要修改docker容器内服务的时间,执行此命令后,将需要重启服务才能生效时间
- 2、时间格式需要正确,否则无法生效
- 3、docker容器重启后,faketime修改无效
- 4、此方法修改后的时间将持续保持,即容器时间一致都是设置的时间
3.2 比如想修改时间为5天后,执行如下命令
export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="-5d"
注意:
- 1、如果想要修改docker容器内服务的时间,执行此命令后,将需要重启服务才能生效时间
- 2、5天前(-5d) 5天后(+5d)
- 3、此方法修改后的时间可变化
3.3 若想要恢复,直接把环境变量修改为空即可
export LD_PRELOAD=