Docker-Compose:cap_drop 和 cap_add 的顺序?

Docker-Compose: order of cap_drop and cap_add?

docker compose file reference 以相当简洁的方式描述了 cap_addcap_drop 元素:

Add or drop container capabilities. See man 7 capabilities for a full list.

这些元素有没有顺序,先加后减?还是顺序很重要(YAML 完全支持字典吗?)?

cap_addcap_drop 之一包含 ALL 时会发生什么?

我知道 Docker Linux 默认功能集,在 https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L4 中定义。

仔细研究了 moby 源代码后,我终于找到了 TweakCapabilities():它需要两组能力来添加和删除,执行下面的方案;因此在 docker-compose.yaml 中工作,其中 YAML 没有定义 cap_addcap_drop 键的顺序。下面的第一个匹配项将终止列表。

  • 容器是 privileged: true:完全忽略 cap_addcap_drop,return 所有可用功能
  • cap_addcap_drop 都是 : return 默认的 Docker 功能集。
  • cap_add 包含 ALL: return 所有功能 减去 cap_drop 中列出的功能(忽略 ALL 在后者中)。
  • cap_drop 包含 ALL: return 仅来自 cap_add 的功能,忽略任何 Docker 默认功能。
  • 默认:首先从 cap_drop 中列出的默认设置中删除所有功能,然后添加 cap_add 中的功能,最后 return 结果。

如果我没记错的话,这也可以用更易于理解的方式表示如下...

privileged: true
ALL capabilities: ignores cap_add and cap_drop (boss mode)
no cap_add cap_add: ['CAP_A'] cap_add: ['ALL']
no cap_drop default capabilities default + CAP_A ALL capabilities
cap_drop: ['CAP_Z'] default -CAP_Z default -CAP_Z +CAP_A ALL -CAP_Z
cap_drop: ['ALL'] NO capabilities CAP_A ALL capabilities

最后,只有以下两个“确定性”组合始终包含 cap_drop: ALL 并且遵循最小特权行:

no cap_add cap_add: ['CAP_A']
 
 
cap_drop: ['ALL'] NO capabilities CAP_A