解决方案
话不多说,先上答案:在运行容器的时候,使用参数--cap-add sys_ptrace
,比如:
docker run --cap-add sys_ptrace homqyy/example_http
问题原因
由于docker运行的容器默认是将“追踪”能力给关掉的,因此我们需要手动的打开。关于“追踪”能力的原文如下所示:
capabilities(7) — Linux manual page CAP_SYS_PTRACE * Trace arbitrary processes using ptrace(2); * apply get_robust_list(2) to arbitrary processes; * transfer data to or from the memory of arbitrary processes using process_vm_readv(2) and process_vm_writev(2); * inspect processes using kcmp(2).
触类旁通法
docker除了提供系力度的能力控制(--cap-add
和--cap-del
)外,还提供了一个能力全开放的选项“--privileged
”,因此我们可以如此排查:
- 如果后续我们有遇到在本地开发环境正常,但在docker中却无法使用的工具或运行的程序,比如tcpdump时,不妨直接打开它,以排查是否与能力相关。
- 如果打开全能力后就能正常使用或运行,则再根据“capabilities(7) — Linux manual page”去找对应的能力选项
- 最后通过
--cap-add
来开启必须的能力即可(不推荐大家直接使用--privileged
的原因是,不安全)。