2016-03-31 22 views
0

调用的容器如下运行我的应用程序:如何授予m锁系统调用通过“命令RKT运行”上CoreOs

sudo rkt run --insecure-options=image --interactive --net=host ./myapp.aci

我得到的消息:

失败锁定内存:不能分配内存

经过一些挖掘后,似乎表明该容器没有CAP_IPC_LOCK能力传递给它。我已经挖掘了一些文档,但无法找到我需要添加配置或任何选项来启用它。我该怎么做呢?

回答

2

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

+0

谢谢,我已经到了接近这个结论,但认为我给别人一个机会来回答。我之前并不知道修补程序清单功能,我已经设置了我的ACI构建过程以使用jq修改它,谢谢!我也发现它的工作,我也不得不解压ACI,在可执行文件上使用“setcap cap_ipc_lock = + ep”,然后使用bsdtar重新创建ACI,以便保留可执行文件的功能,因为acbuild文件没有保留这些属性在最初的ACI中。将此添加到完整性的答案中,或者提供一个替代方案,我会接受它。 – Benjamin

2

您可以使用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" -

+0

有用的知道,我也可以使用acbuild来做到这一点。有关档案中可执行文件的“setcap cap_ipc_lock = + ep”状态的更多信息,除了通过bsdtar的解包/设置功能/重新包装按照我对其他答案的评论以外的其他方式保留? – Benjamin

+1

如果在ACI中有一个'setcap'二进制文件,你可以用'acbuild run'运行它,但是如果没有的话,我认为唯一的方法就是用bsdtar的方式。 –

+0

谢谢,将看看是否有问题反对acbuild保留'复制'帽标志,如果不是,打开一个。我将把答案授予@Alban,因为答案首先在隔离器设置上得到了答案。 – Benjamin

相关问题