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

Docker 启动时需要在非根容器的/dev路径中创建文件,docker,Docker,我正在尝试创建一个容器,该容器将在/dev分区中创建一个套接字文件(在启动期间,任何入口点都无法正常工作) 现在我了解到容器中的/dev目录是在tmpfs挂载上挂载的,并且是动态创建的。因此,我无法创建此套接字文件作为构建的一部分。(即使我在构建中创建了它,在构建之后目录也会被删除) 我带来的容器(run)具有非root用户(testrun),并且在run中没有传递新的特权选项,如下所示 docker运行\ --rm\ -it-d\ --名称cont_testdev_1\ --安全选项没有新的特

我正在尝试创建一个容器,该容器将在/dev分区中创建一个套接字文件(在启动期间,任何入口点都无法正常工作)

现在我了解到容器中的/dev目录是在tmpfs挂载上挂载的,并且是动态创建的。因此,我无法创建此套接字文件作为构建的一部分。(即使我在构建中创建了它,在构建之后目录也会被删除)

我带来的容器(run)具有非root用户(testrun),并且在run中没有传递新的特权选项,如下所示

docker运行\
--rm\
-it-d\
--名称cont_testdev_1\
--安全选项没有新的特权\
--全部取消\
--用户testrun:test\
testdev

我曾尝试或考虑过以下选择:

1) 在我的入口点脚本中创建此套接字文件。在我的情况下,这是不可能的,因为/dev默认情况下只有非root用户的读取权限,并且我的容器以用户“testrun”启动。此外,我不能执行sudo,因为没有提供新的特权

有没有办法在容器中创建具有777权限的/dev

2) 尝试在运行期间使用--tmpfs选项手动创建具有足够权限的/dev分区,如下所示

--装载类型=tmpfs,目的地=/dev,tmpfs模式=0777

但这会导致容器init中出现以下故障

docker:daemon的错误响应:OCI运行时创建失败:container\u linux.go:344:启动容器进程导致“进程\u linux.go:424:容器初始化导致\”rootfs\u linux.go:114:在容器内重新打开/dev/null导致\\\\\\\\\\\\\\\\\\\\\:未知。

不知道如何克服这个问题

3) 在主机中创建此套接字文件,并在运行期间将其装载到容器中。但是我需要这个套接字文件作为tmpfs挂载,因为容器会有多个实例,我不想在主机的文件系统中创建多个套接字文件

4) 在映像生成期间,使用ACL并为/dev文件夹分配对testrun的访问权限。但是,随着/dev文件夹在生成后被删除,ACL也会消失

5) Linux内核模块和udev规则被排除在外,因为容器中没有内核,并且使用的是主机的内核

许多人会问的一个明显的问题是,为什么不在任何其他路径中创建套接字文件呢?这是我剩下的最后一个选项,因为这意味着要从我这边处理很多更改。我只是想在做这个选择之前听听专家的意见

因此,我要向这里的专家提出的问题是,当容器出现时,是否有任何选项可以使用足够的权限(主要是在动态创建的文件夹中,如/dev)创建此类自定义文件


我非常感谢您的帮助或建议。

请看docker副本似乎不符合我的socket文件要求。获取错误:
ERRO[0000]无法将文件/tmp/mylog添加到tar:archive/tar:sockets不受支持。
即使这样做有效,也意味着在主机中手动创建文件并复制到容器的所有实例。我希望尽可能避免此类手动干预。发布复制命令我正在创建一个套接字文件,如下所示:
python-c“将套接字作为s导入;sock=s.socket(s.AF_UNIX);sock.bind('/tmp/mylog')”
。像这样复制:
docker cp/tmp/mylog 0a09e4709dca:/dev/log
,这是行不通的,我想你不能用sockets实现这一点