特权docker容器无法删除功能?

时间:2017-01-12 20:19:40

标签: docker systemd linux-capabilities

我正在运行

docker run --rm --name mydocker --privileged \
    -v /sys:/sys:ro \
    -v /dev:/dev \
    --stop-signal=SIGRTMIN+3 \
    -p 8080:8080 \
    -p 5005:5005 \
    -p 8443:8443 \
    --net=host \
    --cap-drop=SYS_BOOT \
    /usr/sbin/init

应该将systemd作为init运行并从中删除SYS_BOOT功能。这是清洁关闭容器所必需的。如上所述运行时,它会将systemd init作为pid 1运行,但不会删除该功能:

[root@FK8CDFA9A82A9E7-A /]# cat /proc/1/status  | grep Cap  
CapInh: 0000003fffffffff
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000

删除SYS_BOOT功能时,它应如下所示:

CapInh: 0000003fffbfffff
CapPrm: 0000003fffbfffff
CapEff: 0000003fffbfffff
CapBnd: 0000003fffbfffff
CapAmb: 0000000000000000

为什么这不起作用的任何想法? Docker版本:

客户端:
 版本:1.12.3
 API版本:1.24
 转版:go1.6.3
 Git commit:34a2ead
 内置:
 OS / Arch:linux / amd64

服务器:
 版本:1.12.3
 API版本:1.24
 转版:go1.6.3
 Git commit:34a2ead
 内置:
 OS / Arch:linux / amd64

2 个答案:

答案 0 :(得分:2)

指定--privileged时,无法删除功能。这似乎是一个弱点。以下是相关代码:Docker CE Linux OCI

if c.HostConfig.Privileged {
    caplist = caps.GetAllCapabilities()
} else {
    caplist, err = caps.TweakCapabilities(s.Process.Capabilities.Effective, c.HostConfig.CapAdd, c.HostConfig.CapDrop)
    if err != nil {
        return err
    }
}

答案 1 :(得分:0)

为什么要在容器内运行docker-daemon?如果它只是用于控制其他服务,那么docker-systemctl-replacement script将是一个更容易的选择。