昨天在用selenium docker时,遇到一个莫名其妙的问题,火狐浏览器61.0.1被打开后,过2s左右就闪退,看日志报下面的问题:
A content process crashed and MOZ_CRASHREPORTER_SHUTDOWN is set, shutting down
网上各种搜答案,发现这是火狐的一个bug,目前貌似还是没有解决掉。有人在https://github.com/mozilla/geckodriver/issues/1068里提出如下方法可以解决浏览器闪退的问题:
我试了下,还是解决不了。然后再搜,在https://github.com/mozilla/geckodriver/issues/1193中发现了解决方法:
看到他在启动容器的时候,设置了shm的大小,再进入下面火狐浏览器bug的链接:
看到说这个问题已经解决,并且在selenium docs中已经说明了。这时候我再去docker selenium的github上看,果然readme中已经写了shm的设置问题:
官网建议启动chrome和firefox镜像的时候,将宿主机的shm挂在到容器里,或者设置容器的shm大小为2g,这里容器的shm实际上是使用宿主机的shm。下面官网也说了,2g的大小只是经验值,设定这个值的时候,浏览器不会出现问题,也可以自定义该值。
那shm是啥?https://www.cyberciti.biz/tips/what-is-devshm-and-its-practical-usage.html 里对shm做了介绍,概括的讲,/dev/shm属于共享内存的概念,属于tmpfs类型,tmpfs是一个内存系统,所以,所有在/dev/shm中的文件都是存储在内存中,而不是在硬盘上。使用/dev/shm的好处就是提升运行速度。
那为啥设置了shm,容器中的浏览器才不崩溃呢?
点进官方给出的chrome和firefox的bug链接,发现大家也是猜测,因为docker容器默认的shm是64m,可能是浏览器需求的shm比64m大,导致没有足够的内存空间给浏览器新建文件了,所以浏览器会闪退。