使用faketime修改Docker容器时间,解决date:cannot set date operation not permitted问题

docker本质是个进程,有很多资源是使用宿主机的,比如系统时间。正常使用时是会觉得很方便,但涉及到对系统资源的修改时,就比较麻烦了。

场景

使用docker部署了一个后端服务,测试需要改系统时间,如果直接改宿主机时间则会影响到其他的docker(不管是在宿主机上改还是通过--cap-add SYS_TIME参数在docker中修改)。有没有什么既能满足测试要求又不影响其他docker的方法呢?答案就是通过faketime来欺骗docker,达到此目的。

faketime

github地址

https://github.com/wolfcw/libfaketime

安装

git clone https://github.com/wolfcw/libfaketime
cd libfaketime
make
make install

安装完成后,在/usr/local/lib/下有个kaketime的目录

使用

比如想修改时间为2019-08-12 10:30:22,执行如下命令

export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="2019-08-12 10:30:22" 

docker实践

dockerfile

先看一个使用Ubuntu基础镜像做的,可用于laravel的dockerfile

FROM ubuntu:16.04# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneCOPY php-7.3.0.tar.bz2 php-7.3.0.tar.bz2# 更新源,安装nginx
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list \&& sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list \&& apt-get clean \&& rm -fR /var/lib/apt/lists/* \&& mkdir /var/lib/apt/lists/partial \&& apt-get update  \&& apt-get upgrade -y \&& apt-get install -y wget autoconf make gcc nginx procps libfreetype6-dev libpng-dev libzip-dev libcurl3-openssl-dev libbz2-dev libjpeg-dev libxpm-dev libfreetype6-dev libmcrypt-dev libmysql++-dev libxslt1-dev  pkg-config libssl-dev libsslcommon2-dev zip unzip \&& tar xvf php-7.3.0.tar.bz2 \&& cd php-7.3.0/ \&& ./configure  --prefix=/usr/local/php --enable-fpm --enable-sockets --enable-mbstring=all  -enable-mysqlnd  --with-config-file-path=/usr/local/php/etc --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-curl --with-gd  --with-openssl \&& make \&& make install \&& cd ext/zip \&& /usr/local/php/bin/phpize \&& ./configure --with-php-config=/usr/local/php/bin/php-config \&& make ; make install \&& cd ../../ext/bcmath \&& /usr/local/php/bin/phpize \&& ./configure --with-php-config=/usr/local/php/bin/php-config \&& make ; make install \&& cd ../../.. ; rm -fr php-7.3.0 ; rm -fr php-7.3.0.tar.bz2 # 安装 Composer
ENV COMPOSER_HOME /root/composer
COPY composer /usr/bin/composer
COPY composer /usr/local/bin/composer
RUN cp /usr/local/php/bin/php /usr/bin && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/# 复制文件和代码
WORKDIR /data
COPY app/ /data/
COPY php.ini /usr/local/etc/php/php.ini
COPY libfaketime/ /data/
RUN echo 'extension=zip.so' >> /usr/local/php/etc/php.ini \&& echo 'extension=bcmath.so' >> /usr/local/php/etc/php.ini \&& cd /data/libfaketime && make ; make install \&& rm -fr /data/libfaketime
COPY php-fpm.conf /usr/local/php/etc/php-fpm.conf
COPY nginx.conf /etc/nginx/nginx.conf
COPY env-example /data/.env# Write Permission
RUN chmod -R 777 /data && usermod -u 1000 www-data
CMD ["nginx", "-g", "daemon off;"]

说明

  1. dockerfile的大概过程是:安装基本工具和依赖;编译安装php;复制composer,faketime到docker,编译安装faktime;复制项目代码,nginx配置,php配置到docker;使用nginx做前台进程启动docker。
  2. 用Ubuntu而不用PHP做docker基础镜像的原因是: 测试修改时间时要重启php-fpm,如果直接使用PHP的docker则重启php-fpm后docker会重启,faketime修改无效。
  3. 在docker里面下载php-7.3.0.tar.bz2,composer和faketime,如果网络不好则时间会比较长,这改成先下载好,然后拷贝到docker里打包,节省点时间。nginx,php-fpm的配置也要事先准备好。
  4. 由于是编译安装php,时间会长一点

使用

先使用该dockerfile打个包

docker build -t laravel:v1 .

打完之后运行起来

docker run -itd  -p 9091:80 laravel:v1docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
d5fcc8f42bd4        laravel:v1          "nginx -g 'daemon of…"   37 seconds ago      Up 35 seconds       0.0.0.0:9091->80/tcp   trusting_darwin

进入docker

docker exec -it d5fcc8f42bd4 /bin/bash
root@d5fcc8f42bd4:/data# 

修改时间下时间

root@d5fcc8f42bd4:/data# date
Sun Aug 25 15:24:40 Asia 2019
root@d5fcc8f42bd4:/data#
root@d5fcc8f42bd4:/data# export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="2019-08-12 10:30:22"
root@d5fcc8f42bd4:/data# date
Mon Aug 12 10:30:22 Asia 2019

可以看到当前终端的时间已经改了。
看看当前终端下php的时间是不是也改了:

root@d5fcc8f42bd4:/data# echo "<?php echo date('Y-m-d H:i:s'); " > time.php
root@d5fcc8f42bd4:/data# echo 'echo "\n";' >> time.php
root@d5fcc8f42bd4:/data# date
Mon Aug 12 10:30:22 Asia 2019
root@d5fcc8f42bd4:/data# php time.php
2019-08-12 10:30:22

可以看到也修改了。
再来改下php-fpm的时间

pkill php-fpm ; /usr/local/php/sbin/php-fpm 

访问http://127.0.0.1:9091/time.php ,可以看到当前的运行时间也改了。
不过目前测试php-fpm的生效时间比较短,只有10秒左右,之后会还原,后续在找下原因完善下。

使用faketime修改docker内的时间,解决date: cannot set date: Operation not permitted问题相关推荐

  1. Docker 内程序时间设置,很重要

    Docker 内程序时间设置,很重要 原文:Docker 内程序时间设置,很重要 重要!!!!! 创建容器时候需要修改一个参数,设置tomcat的时区 -e TZ="Asia/Shangha ...

  2. 修改docker内java内存_在docker中使用java的内存情况

    Java和Docker不是天然的朋友. Docker可以设置内存和CPU限制,而Java不能自动检测到.使用Java的Xmx标识(繁琐/重复)或新的实验性JVM标识,我们可以解决这个问题. 虚拟化中的 ...

  3. 修改docker内kafka的topic日志路径,修改server.properties的log.dirs参数

    docker下的kafka一般都是使用 wurstmeister/kafka, 安装过程参考:https://blog.csdn.net/boling_cavalry/article/details/ ...

  4. 修改centos7容器的时间和宿主机时间一致

    一.问题 centos7系统容器时间与宿主机系统时间不一致,就进去查看一番,发现时区和宿主机上的时间不一致,下面就来解决一下 二.现象 1.查看centos宿主机的时间 输入如下命令查看 # date ...

  5. Docker内时区查询和修改方法

    首先,在宿主机上执行[date]命令,查看宿主机的时间. 利用[docker exec -u 0 -it 容器ID /bin/bash]命令进入Docker容器内,执行[date]命令查看Docker ...

  6. docker mysql 报错 “Too many connections 1040“ 修改最大连接数 未生效 解决方法

    目录 一.背景 二.原因分析 三.解决方案 设置连接超时时间 一.背景 前几天在测试线上环境的过程中,需要一直关注数据库的数据变化.由于线上的MySQL是用Docker搭建的,在本地连接时经常出现 & ...

  7. 【云原生】解决在Windows上在docker内启动docker报Operation not permitted

    问题场景: 环境: Windows 10 Docker Desktop 4.16 项目需要构建一个all-in-one容器,在容器内将项目所有其他容器启动. 例如postgresql,redis 等组 ...

  8. linux 时间 环境变量,Linux环境变量的修改(永久,暂时)以及修改ls显示的时间格式...

    本文转自:http://blog.sina.com.cn/s/blog_8e21864f01014u9h.html Linux修改环境变量,很简单但很重要 一.Linux的变量种类 按变量的生存周期来 ...

  9. 镜像上传到linux失败,Docker push镜像失败解决方法

    Docker push镜像失败解决方法 发布时间:2017-03-09 12:07 来源:互联网 当前栏目:web技术类 Docker push镜像失败的问题. 以下是输入push自己的tomcat后 ...

最新文章

  1. lfu算法实现c语言_分治算法解决最大子段和问题。c语言实现
  2. 8.2 css3 新增标签 盒子模型 长度单位 颜色 渐变 径像渐变
  3. 常见特征检测算法介绍
  4. poi,HSSFWorkbook,Excel导出,代码示例
  5. php-fpm性能优化
  6. Android中的数据编码,Android与服务端数据传输的编码处理
  7. pc 浏览器最小字体12px
  8. X-Scan介绍和使用方法
  9. 局域网搭建git服务器
  10. 视觉目标跟踪算法收集-实时更新
  11. [Multisim][模电实验]简易函数信号发生器的设计与实现_北京邮电大学2019级信通院电子电路实验下
  12. 如何查看已删除的微信聊天记录?教你两招,找到答案
  13. linux添加core文件位置,Linux生成core文件、core文件路径设置
  14. 爬取贝壳网的40000条基本数据
  15. FastReport_V6.X for Delphi 10.4 ,最快的报表控件上市了!
  16. 仙童半导体拒绝华润等收购 担忧难获监管批准
  17. 解决coursera可以登录但无法播放视频
  18. 使用GitBook编写文档书籍
  19. 问答搜索 整合全网问答平台
  20. # CentOS7系统操作命令(纯属个人常用)

热门文章

  1. net框架通用对象操作
  2. AngularJS jQuery 共存法则
  3. Swift中文教程(二十二) 泛型
  4. self-trainning, co-trainning
  5. Nginx开启stub_status模块配置方法_nginx
  6. 机器学习速成课程 | 练习 | Google Development——编程练习:特征组合
  7. LeetCode 606. Construct String from Binary Tree
  8. 【AI视野·今日NLP 自然语言处理论文速览 第七期】Tue, 15 Jun 2021
  9. Ubuntu 16.04 开机自动锁定数字键盘
  10. 【C++ STL学习之三】容器deque深入学习