1

我正在运行这个

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

它应该作为 init 运行 systemd 并从中删除 SYS_BOOT 功能。这是彻底关闭容器所必需的。当如上运行时,它确实以 pid 1 运行 systemd init,但该功能不会被删除:

[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

任何想法为什么这不起作用?码头工人版本:

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

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

4

2 回答 2

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
    }
}
于 2017-09-26T18:01:09.380 回答
0

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

于 2017-11-01T12:50:56.680 回答