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