Docker Linux如何检测目录(或文件)变化来执行给定命令
在此以PHP容器为例,当网站上传文件时,同步文件到云存储。
同步的方法很多,直接写在PHP网站代码中,或者用本章所讲的内容,利用Linux来侦测目录及目录下文件的变化,来异步实现文件同步。
首先,在Dockerfile或者容器中安装inotify:
apt-getinstallinotify-tools
然后,编写Bash脚本,并运行:
#############################################
#在使用本脚本之前,请在环境变量中设置有事件发生
#时执行的PHP脚本,如:
#exportINOTIFY_PHP_FILES=/var/www/html/awaimai.com/utils/oss.php
#然后再执行本脚本:
#/bin/bashinotify.sh
#一旦配置的DIR目录发生变化,便会执行该PHP脚本,同时也传送信息到PHP脚本
#############################################
DIR="/var/www/html"#检测该目录下的文件动态,多个以空格隔开
EVENTS="create,close_write"#仅目录和文件创建
FORMAT="%e%w%f"#输出内容格式为:事件完整目录
OPTIONS="--recursive--monitor--excludei.*/tmp/.*"#递归侦测子目录,循环侦测,忽略包含/tmp/的路径
echo"=================="
echo"Inotifydirectory:$DIR"
echo"Inotifyevents:$EVENTS"
echo"Inotifyformat:$FORMAT"
echo"Inotifyoptions:$OPTIONS"
echo"Inotifyphpfile(s):$INOTIFY_PHP_FILES"
inotifywait${OPTIONS}--format"${FORMAT}"-e"${EVENTS}""${DIR}"|\
whileread-rnotifies;#侦测结果放入notifies变量
do
echo"$notifies";
FILES=(${INOTIFY_PHP_FILES//,/})#将PHP文件集以逗号分隔成数组
forFILEin${FILES[@]}
do
echo"=====Executefile${FILE}=====\n"
php${FILE}$notifies;#调用PHP文件
done
done
实列oss.php文件:
echo'=====WeareinthePHPfile====='.PHP_EOL;
$newFile=getFilePath();
echo"Detectingnewfile$newFile".PHP_EOL;
functiongetFilePath()
{
global$argv;
if(!$argv||count($argv)<3){
print_r($argv);
exit('Paramsfromcommandlineisinvalid.');
}
$action=$argv[1];
$path=$argv[2];
if($action!=='CLOSE_WRITE,CLOSE'){
exit('Ignorethisaction,wejustmonitornewfile.');
}
return$path;
}
参考资料:
- inotify手册:https://linux.die.net/man/1/inotifywait