调用的容器如下运行我的应用程序:如何授予m锁系统调用通过“命令RKT运行”上CoreOs
sudo rkt run --insecure-options=image --interactive --net=host ./myapp.aci
我得到的消息:
失败锁定内存:不能分配内存
经过一些挖掘后,似乎表明该容器没有CAP_IPC_LOCK
能力传递给它。我已经挖掘了一些文档,但无法找到我需要添加配置或任何选项来启用它。我该怎么做呢?
调用的容器如下运行我的应用程序:如何授予m锁系统调用通过“命令RKT运行”上CoreOs
sudo rkt run --insecure-options=image --interactive --net=host ./myapp.aci
我得到的消息:
失败锁定内存:不能分配内存
经过一些挖掘后,似乎表明该容器没有CAP_IPC_LOCK
能力传递给它。我已经挖掘了一些文档,但无法找到我需要添加配置或任何选项来启用它。我该怎么做呢?
ACI可以使用isolator of type os/linux/capabilities-retain-set指定他们在清单中需要使用哪些上限。
要检查清单包含这样的隔离器,你可以使用actool:
$ actool cat-manifest --pretty-print ./myapp.aci
您可能会看到以下内容:
"isolators": [
{
"name": "os/linux/capabilities-retain-set",
"value": {
"set": [
"CAP_IPC_LOCK"
]
}
}
]
要添加CAP_IPC_LOCK
,你可以使用:
$ actool patch-manifest --capability=CAP_IPC_LOCK --replace ./myapp.aci
目前无法直接在上添加功能命令行。我在GitHub上针对此功能请求提出了一个问题:coreos/rkt#2371
您可以使用acbuild为您的容器提供正确的功能。
如果您已经使用acbuild,让您的ACI,只是这一行添加到构建脚本:
echo '{ "set": ["CAP_IPC_LOCK"] }' | acbuild isolator add "os/linux/capabilities-retain-set" -
或者,如果你还没有使用acbuild,让您的ACI,可以使用--modify
标志修改现有的ACI。因此,命令是:
echo '{ "set": ["CAP_IPC_LOCK"] }' | acbuild --modify path/to/your/app.aci isolator add "os/linux/capabilities-retain-set" -
有用的知道,我也可以使用acbuild来做到这一点。有关档案中可执行文件的“setcap cap_ipc_lock = + ep”状态的更多信息,除了通过bsdtar的解包/设置功能/重新包装按照我对其他答案的评论以外的其他方式保留? – Benjamin
如果在ACI中有一个'setcap'二进制文件,你可以用'acbuild run'运行它,但是如果没有的话,我认为唯一的方法就是用bsdtar的方式。 –
谢谢,将看看是否有问题反对acbuild保留'复制'帽标志,如果不是,打开一个。我将把答案授予@Alban,因为答案首先在隔离器设置上得到了答案。 – Benjamin
谢谢,我已经到了接近这个结论,但认为我给别人一个机会来回答。我之前并不知道修补程序清单功能,我已经设置了我的ACI构建过程以使用jq修改它,谢谢!我也发现它的工作,我也不得不解压ACI,在可执行文件上使用“setcap cap_ipc_lock = + ep”,然后使用bsdtar重新创建ACI,以便保留可执行文件的功能,因为acbuild文件没有保留这些属性在最初的ACI中。将此添加到完整性的答案中,或者提供一个替代方案,我会接受它。 – Benjamin