我正在运行
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
答案 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将是一个更容易的选择。