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