Docker-Compose:cap_drop 和 cap_add 的顺序?
Docker-Compose: order of cap_drop and cap_add?
docker compose file reference 以相当简洁的方式描述了 cap_add
和 cap_drop
元素:
Add or drop container capabilities. See man 7 capabilities for a full list.
这些元素有没有顺序,先加后减?还是顺序很重要(YAML 完全支持字典吗?)?
当 cap_add
或 cap_drop
之一包含 ALL
时会发生什么?
我知道 Docker Linux 默认功能集,在 https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L4 中定义。
仔细研究了 moby 源代码后,我终于找到了 TweakCapabilities():它需要两组能力来添加和删除,执行下面的方案;因此在 docker-compose.yaml 中工作,其中 YAML 没有定义 cap_add
和 cap_drop
键的顺序。下面的第一个匹配项将终止列表。
- 容器是
privileged: true
:完全忽略 cap_add
和 cap_drop
,return 所有可用功能。
cap_add
和 cap_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
docker compose file reference 以相当简洁的方式描述了 cap_add
和 cap_drop
元素:
Add or drop container capabilities. See man 7 capabilities for a full list.
这些元素有没有顺序,先加后减?还是顺序很重要(YAML 完全支持字典吗?)?
当 cap_add
或 cap_drop
之一包含 ALL
时会发生什么?
我知道 Docker Linux 默认功能集,在 https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L4 中定义。
仔细研究了 moby 源代码后,我终于找到了 TweakCapabilities():它需要两组能力来添加和删除,执行下面的方案;因此在 docker-compose.yaml 中工作,其中 YAML 没有定义 cap_add
和 cap_drop
键的顺序。下面的第一个匹配项将终止列表。
- 容器是
privileged: true
:完全忽略cap_add
和cap_drop
,return 所有可用功能。 cap_add
和cap_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 |