首页/云/Docker 容器速查/docker run --cap-add 精细补能力
资源与安全50 条

docker run --cap-add 精细补能力

只补必要能力:先 --cap-drop=ALL 再按需 --cap-add(如 NET_BIND_SERVICE),比保留默认能力集再用特权收敛得多。

Docker 容器速查云更新于 2026-10-13

按需补最小能力

Linux 能力把 root 的特权拆成一批细粒度单元,容器默认保留其中一小组。当业务确实需要额外权限时,正确做法是先 --cap-drop=ALL 清空,再按需 --cap-add 补上必要的那一两项,比保留整套默认能力再想办法收紧可控得多。核对是否真的到位,看容器内 /proc/self/status 里的 CapEff 取值即可。

基本信息

语法--cap-drop=ALL --cap-add=能力名(可重复)
验证位置容器内 grep Cap /proc/self/status 的 CapEff
常见能力NET_BIND_SERVICE / CHOWN / SETUID / SETGID / SYS_TIME
默认能力集随容器运行时版本有差异,以实际取值为准

典型使用场景

  • 非 root 进程监听低端口:只补 NET_BIND_SERVICE,不用整块特权
  • 启动脚本调整数据目录属主:补 CHOWN 与 SETUID/SETGID
  • 时间敏感服务:需要设置系统时间时补 SYS_TIME
  • 网络诊断容器:需要改路由或抓包时补 NET_ADMIN
  • 安全基线落地:把能力集写进编排文件并纳入核对清单

补能力与核对

补能力与核对
# 清空默认能力,只补绑定低端口这一项
docker run --rm --cap-drop=ALL --cap-add=NET_BIND_SERVICE alpine sh -c 'grep CapEff /proc/self/status'

# 启动脚本需要改属主与降权的场景
docker run -d --name app --cap-drop=ALL --cap-add=CHOWN --cap-add=SETGID --cap-add=SETUID app/base:2.0

# 核对容器实际持有的能力
docker inspect -f '{{json .HostConfig.CapAdd}} {{json .HostConfig.CapDrop}}' app

常用能力与用途

能力允许的动作典型场景
NET_BIND_SERVICE绑定 1024 以下端口非 root 进程监听 80 与 443
CHOWN修改文件属主启动时调整数据目录权限
SETUID 与 SETGID切换进程身份以 root 启动后降权运行
SYS_TIME设置系统时间时间同步与对时工具
NET_ADMIN网络配置与抓包诊断容器与网络工具
能力在容器启动时确定,运行中修改需要重建容器;编排文件里改动后要确认实际创建出来的容器才带上新配置。
能力只覆盖内核权限面,服务自身的认证、注入与配置错误仍需按应用层方向治理。
运行日志里出现 operation not permitted 时,先看缺的是文件系统权限还是某项能力:前者的报错常指向具体路径,后者多发生在绑定低端口、改属主、设置时间这类动作上。

易错点

  • 保留默认能力集只用 --cap-add:默认集随版本变化且范围偏大,先清空再按需补更可控
  • 凭印象判断缺哪个能力:以 CapEff 实际取值为准,逐个验证关键路径
  • 给运维方便就补 NET_ADMIN:这等于开放网络配置能力,能不做就不做
  • 改完不同步编排文件:命令行临时验证通过的配置没有沉淀,重建后又回到旧状态
  • 能力名大小写或拼写写错:参数不生效但容器照常启动,核对时要以容器内 CapEff 为准而不是命令行回显

数据来源与参考

  • Docker 官方文档:Runtime privilege and Linux capabilities(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌