如何将设备添加到所有docker容器

时间:2017-02-07 09:57:10

标签: docker sgx

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

是否可以选择将设备(在这种情况下为/dev/isgx)添加到由docker引擎启动的任何容器中?

修改

到目前为止我的进步:

Docker使用containerd& runc在启动容器配置之前创建容器配置。 Docker's configuration file /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< - 创建配置。)

我在DefaultSimpleDevices的代码库中找到了有关DefaultAllowedDevicesrunc的有趣source code。对该文件的最后一次提交说“不要默认创建/ dev / fuse”这很有希望,但是会涉及构建我自己的runc。我希望通过配置选项获得通用解决方案。

2 个答案:

答案 0 :(得分:2)

<强>更新

这不是正确答案。事实证明,该docker的默认父cgroup已经具有开放devices权限:

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

创建容器后,将使用更严格的devices规则创建该容器的新cgroup。

原始回答

我认为您可以使用cgroup来实现您想要的效果。 您可以在主机上创建一个新的cgroup,允许访问/dev/isgx并使用--cgroup-parent=<my-cgroup-name>启动docker守护程序。 您还可以在cgroup-parent中设置/etc/docker/daemon.json选项。

如果您以前从未使用过cgroup,那么设置它可能并不简单。 如何创建新的cgroup取决于您的主机系统,但您必须使用devices控制器将cgroup的特定设备列入白名单。

例如,一种方法是使用libcgroup's /etc/cgconfig.conf并以下列方式为cgroup dockerdaemon提供对块设备的读/写访问权限:

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

以下是有关如何找出块设备的主要/次要的一个示例:

sudo udevadm info -n /dev/isgx

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

答案 1 :(得分:0)

您的import json with open("file.json") as f: z = json.load(f) print(z) 文件中需要类似的内容(或与其他基于Docker的技术类似的东西:

docker-compose.yaml