打算在Docker内编译Linux内核,直接用volume参数把磁盘挂载进容器内,编译时发现cpu被占用达80%。搜索后知道是volume方式由osxfs组件来服务container和host之前的文件共享,但osxfs对fsevent处理不够好,出现了IO占用CPU资源问题。目前,可以使用的方法是NFS, unison, rsync。NFS不被推荐的原因是对权限管理不好,rsync又是单向的。所以这里使用unison,第一次同步要很长时间后,后续更新都很快,重要的是可以双向功能,container的修改也可以同步到host上。
unison方式的大概原理是,把需要同步的文件或磁盘以socks协议方式同步到container1内,container1把这个目录以volume方式共享出来,这样其它container直接用共享的volume就可以了。socks是在本机上传输所以速度还是比较快的,也绕开了osxfs组件。
同步目录至unison的docker内
docker pull onnimoni/unison
docker run -d -p 5000:5000 --name unison-sync -e UNISON_DIR=/data -v /data onnimonni/unison
pip install MacFSEvents
curl -o /usr/local/bin/unison-fsmonitor -L https://raw.githubusercontent.com/hnsl/unox/master/unox.py
chmod a+x /usr/local/bin/unison-fsmonitor
unison /Volumes/data socket://127.0.0.1:5000/ -auto -batch -repeat watch
在目标container中使用共享的volume,这样在新开的container内的/data目录就能看到host上的/Volumes/data目录下的文件了
docker run -it --volumes-from unison-sync debian /bin/bash