线上java程序出现异常,需要打印内存信息进行debug,发现没有 jmap,jstack等工具。
发现容器基础镜像选择的是FROM java:8-jre,jre环境是不包含这类工具的,遂将换成FROM java:8,这类工具便包含在内了。
使用时发现还是不能使用,出现错误 “Can’t attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 1: Operation not permitted docker”
查询资料后发现:
这其实不是什么 Bug,而是 Docker 自 1.10 版本开始加入的安全特性。
类似于 jmap 这些 JDK 工具依赖于 Linux 的 PTRACE_ATTACH,而是 Docker 自 1.10 在默认的 seccomp 配置文件中禁用了 ptrace。
相关资料
主要方法2个:
1.使用 –cap-add 明确添加指定功能:
docker run –cap-add=SYS_PTRACE …
2.Docker Compose 自 version 1.1.0 (2015-02-25) 起支持 cap_add。
version: '2'
services:
mysql:
...
api:
...
cap_add:
- SYS_PTRACE