为了运行一些仅与Ubuntu 14.04兼容的软件,我想将它部署在Docker容器中,以便它具有所有必需的依赖项。
当此软件尝试在可执行文件(cap_ipc_lock,cap_net_raw,cap_sys_nice,cap_net_admin)上设置功能时,会出现问题。执行后,我收到了Failed to set capabilities on file `path_to_file' (Operation not permitted)
消息(请参阅下面的代码)。
从Docker documentation我发现默认情况下容器运行的功能有限,但可以指定需要哪些容器。但即使我用--cap-add=ALL
运行它,我仍然得到错误。以下是设置功能的几行C代码,如果它有帮助:
// Create capability set
const char *cap_text = "cap_ipc_lock=ep cap_net_raw=ep cap_sys_nice=ep cap_net_admin=ep";
cap_t cap_d = cap_from_text(cap_text);
if (cap_d == NULL) {
perror("cap_from_text");
return -1;
}
// Set file capability
int retval = cap_set_file(EXECUTABLE, cap_d);
if (retval != 0) {
fprintf(stderr, "Failed to set capabilities on file `%s' (%s)\n", argv[1], strerror(errno));
return -1;
}
有关如何使这项工作的任何想法?感谢
编辑: 对于那些可能面临同样问题的人,我找到了解决方案。我没有工作,因为所有内容(源代码,可执行文件等)都安装在容器内的主机文件夹中(-v选项)。直接在容器内复制所有内容解决了这个问题。