在启动时需要在非root容器中的/ dev路径中创建文件

时间:2019-10-28 03:00:58

标签: docker

我正在尝试调出一个容器,该容器将在/ 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)中)创建此类自定义文件?

如果有任何帮助或建议,我将非常感谢。

0 个答案:

没有答案