我正在尝试调出一个容器,该容器将在/ dev分区中创建一个套接字文件(在启动期间,任何入口点都不能起作用)
现在,我了解到容器中的/ dev目录已挂载到tmpfs挂载上并已动态创建。因此,我无法在创建过程中创建此套接字文件。 (即使我在构建中创建此目录,构建后仍会删除该目录)。
我启动(运行)的容器与非root用户(testrun)一起使用,并且还具有在运行时传递的no-new-privileges选项,如下所示。
docker run \
--rm \
-it -d \
--name cont_testdev_1 \
--security-opt no-new-privileges \
--cap-drop all \
--user testrun:test \
testdev
我尝试或考虑了以下选项:
1)在我的入口点脚本中创建此套接字文件。在我的情况下,这是不可能的,因为默认情况下/ dev仅对非root用户具有读取权限,并且我的容器以用户'testrun'的身份启动。另外,由于没有提供no-new-priveleges,因此我无法执行sudo。
在容器中创建具有777权限的/ dev的任何方法吗?
2)尝试在运行期间使用--tmpfs选项手动创建具有足够权限的/ dev分区,如下所示。
--mount type=tmpfs,destination=/dev,tmpfs-mode=0777
但这会导致容器初始化失败。
docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "process_linux.go:424: container init caused \"rootfs_linux.go:114: reopening /dev/null inside container caused \\\"Failed to open /dev/null - open /dev/null: permission denied\\\"\"": unknown.
不确定如何克服这个问题。
3)在主机中创建此套接字文件,并在运行期间将其安装到容器中。但是我需要这个套接字文件作为tmpfs挂载,因为会有多个容器实例,并且我不想在主机的文件系统中创建多个套接字文件。
4)使用ACL并在映像构建过程中为/ dev文件夹分配对testrun的访问权限。但是随着/ dev文件夹在构建后被删除,ACL也随之消失。
5)排除Linux内核模块和udev规则,因为容器中没有内核,并且使用了主机的内核。
许多人会问的一个显而易见的问题是:为什么不在任何其他路径上创建套接字文件-这是我剩下的最后一个选项,因为这意味着我要进行很多处理更改。我只想在选择此选项之前先听取专家的意见。
所以我在这里向专家提出的问题是,是否有任何选择可以在容器出现时以足够的权限(主要是在动态创建的文件夹(例如/ dev)中)创建此类自定义文件?
如果有任何帮助或建议,我将非常感谢。