docker检查已挂载文件系统上的更改

时间:2018-07-10 12:31:22

标签: docker inotify

我想在docker容器中创建一个ruby构建环境。 Ruby安装在容器中,我可以在win10主机上进行开发。我将主机工作目录安装到容器上并构建项目。但是现在我想到了生活质量的提高:如果容器仅侦听已挂载的文件系统,并在我更改项目中的内容时进行构建,那不是很好吗?

经过5分钟的google搜索,我发现inotifywait乍一看看上去很棒,所以我首先尝试了 而没有安装文件系统:

[root@a3193720c4f1 testfolder]# inotifywait -m /tmp/testfolder/ -e modify -e create -e open |
>     while read path action file; do
>         echo "The file '$file' appeared in directory '$path' via '$action'"
>     done
Setting up watches.
Watches established.
The file '' appeared in directory '/tmp/testfolder/' via 'OPEN,ISDIR'
The file 'newfile' appeared in directory '/tmp/testfolder/' via 'OPEN'

解决了这个问题,但是/tmp/testfolder不是挂载的目录,它只是我在容器中创建的用于习惯inotifywait命令的测试目录。因此,这次我启动了容器并挂载了目录:

docker run -it --rm -v "D:\LokaleDaten\ELK_Docker\Docker\RVM\testfolder":"/tmp/testfolder" -w "/tmp/testfolder" myrvm

然后,我再次启动了inotifywait,更改了一个文件(在已安装到容器的主机系统上),但是inotify没有捕获更改的文件。我还检查了容器中的文件是否已更改,是的,已进行了更改。 所以我很好奇我是否错过了某些东西,或者是不是为它准备了合适的工具?

亲切的问候,曼努埃尔

1 个答案:

答案 0 :(得分:0)

由于列出的here解决方法要求您安装python,因此我一直在搜索。然后,我发现一个solution,您无需安装python,但是需要在主机上安装其他工具。

因此,我最终得到的基本上是一个自制脚本,该脚本每隔几秒钟轮询一次文件系统,并检查目录的md5sum进行更改。这是有人需要的脚本(请注意:这是我编写的第一个bash脚本,因此,如果某些操作不起作用或不正确,请随时发表评论!):

#!/bin/sh
# script that gets a hash of a directory and checks every few seconds if the hash has changed
# if it has changed, it executes a command

if [ -d $1 ] || [ -f $1 ]; then
 f="$1"
else
 echo $(date +"%d.%m.%Y %T %:::z") ERROR: arg1 is neither a directory nor a file
 exit 1
fi

shift

if [ -z "$*" ]; then
 echo $(date +"%d.%m.%Y %T %:::z") ERROR: arg2 is required otherwise no command is executed
 exit 1
fi
cmd=$*

readonly getmd5sum="tar -cP $f | md5sum"
md5val="`eval ${getmd5sum}`"

while : ; do
 if [[ $md5val != `eval ${getmd5sum}` ]]; then
  md5val="`eval ${getmd5sum}`"
  $cmd
 fi
 sleep 2
done