如何将设备添加到所有docker集装箱
要使用SGX飞地,应用程序必须与通过主机上的/dev/isgx
公开的SGX驱动程序/dev/isgx
。 我们使用--device
命令行选项在Docker容器映射/dev/isgx
里面执行这样的应用程序。
是否有一个选项可以添加一个设备(在这种情况下是/dev/isgx
)到一个docker引擎启动的任何容器?
编辑:
我到目前为止的进展情况:
Docker使用containerd
& runc
在启动之前创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 --help
和runc spec --help
< – 创buildconfiguration)。
我在runc
的代码库中find了有关DefaultSimpleDevices
和DefaultAllowedDevices
有趣源代码 。 最后一个提交到这个文件说'不要创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