Docker版本1.9.1
我们正在尝试使用Docker来验证我们公司的应用程序,但面临一个问题。
应用程序在启动时设置共享内存和messgae队列的块,然后生成其他几个共享它们的进程。
通常在“AppStop”上,生成的进程被关闭,ipc资源(shm和msgq)被清除。但是在Docker容器中,不会进行清理。我们看到的错误如“msgctl中的UNIX errno 1”,“不允许操作”。虽然进程消失了,但ipcs仍然显示共享内存段和留下的msg队列。结果,同一容器中的后续“Appstart”无法启动新的进程集。方法是退出容器,停止并重新开始。
我们在Docker镜像中创建了一个新用户“appuser”,该应用程序以该用户身份运行。启动和清理二进制文件设置了setuid位,以便它们以root身份运行。 Docker命令行是
docker run -d -u appuser -w /home/appuser/node -e TERM=vt100 -p 9876:6666 --name "demo" <IMAGE_ID> bash -c '. ./setup; Appstart $APPSYS; tail -f $APPSYS/Appmain.log'
在上面的命令中添加'--privilaged'选项后,问题(留下的ipc资源)就消失了。我可以在同一容器中停止并启动应用程序。
我无法理解为什么。
任何人都可以对此有更多的了解吗?感谢。