如何将设备添加到所有docker集装箱

要使用SGX飞地,应用程序必须与通过主机上的/dev/isgx公开的SGX驱动程序/dev/isgx 。 我们使用--device命令行选项在Docker容器映射/dev/isgx里面执行这样的应用程序。

是否有一个选项可以添加一个设备(在这种情况下是/dev/isgx )到一个docker引擎启动的任何容器?

编辑:

我到目前为止的进展情况:

Docker使用containerdrunc在启动之前创build一个容器configuration。 Docker的configuration文件 /etc/docker/daemon.json有一个字段runtimes可以提供任意参数给runc

 [...] "runtimes": { "runc": { "path": "runc" }, "custom": { "path": "/usr/local/bin/my-runc-replacement", "runtimeArgs": [ "--debug" ] } }, [...] 

不幸的是,它接缝runc不消耗许多有用的参数( runc --helprunc spec --help < – 创buildconfiguration)。

我在runc的代码库中find了有关DefaultSimpleDevicesDefaultAllowedDevices有趣源代码 。 最后一个提交到这个文件说'不要创build/ dev / fuse默认'这是有希望的,但会涉及build立我自己的runc 。 我希望通过一个configuration选项的通用解决scheme。

UPDATE

这不是正确的答案 。 原来,docker的默认父cgroup已经有开放的devices权限:

 /# cat /sys/fs/cgroup/devices/docker/devices.list a *:* rwm 

在创build容器时,将为该容器创build一个新的cgroup,并使用更多受限的devices规则。


原来的答案

我想你可以使用cgroups来实现你想要的。 你可以在你的主机上创build一个新的cgroup,它允许访问/dev/isgx并用--cgroup-parent=<my-cgroup-name>启动你的--cgroup-parent=<my-cgroup-name>守护进程。 你也可以在/etc/docker/daemon.json设置cgroup-parent选项。

如果你以前从来没有使用cgroups,那么它可能不是微不足道的。 如何创build新的cgroup取决于您的主机系统,但是您必须使用devices控制器将cgroup的特定设备列入白名单。

例如,一种方法是使用libcgroup/etc/cgconfig.conf并通过以下方式对cgroup dockerdaemon的块设备进行读/写访问:

 group dockerdaemon { devices { devices.allow = b <device-major>:<device-minor> rw } } 

这里是一个如何找出你的块设备的主要/次要的例子:

 sudo udevadm info -n /dev/isgx 

以下是一些更深入的链接,可以让您更深入地了解整个cgroup主题:

  • CentOS6中的cgroups

  • 在redhat的cgroups

  • Ubuntu中的cgroups