Docker 는 openjdk 용기 에서 JDK 를 사용 할 수 없 는 jmap 등 명령 문 제 를 해결 합 니 다.

5819 단어 DockeropenjdkJDKjmap
제로,문제 설명
프로젝트:Java Spring Boot 프로젝트
Docker 환경:Docker Toolbox.Windows 10 이 아니 라 Docker for Windows 를 사용 할 수 없습니다.이것 만 사용 할 수 있 습 니 다.
Docker Compose 편성 서 비 스 를 사용 하고 Mysql 과 Spring Boot 프로젝트 를 시작 합 니 다.
docker-compose.yml 파일 내용:

version: '2'

services:
 mysql:
 build: ./docker/builds/mysql
 ports:
  - "3386:3306"
 volumes:
  - "./docker/data/mysql/data:/var/lib/mysql"
  - "./docker/data/mysql/conf:/etc/mysql/conf.d"
 restart: always
 environment:
  MYSQL_DATABASE: testdb
  MYSQL_USER: kinginblue
  MYSQL_PASSWORD: kinginblue
  MYSQL_ROOT_PASSWORD: kinginblue
 api:
 depends_on:
  - mysql
 build: ./docker/builds/api
 ports:
  - "8088:8080"
 volumes:
  - "./api/target/api-0.0.1-SNAPSHOT.jar:/app/api.jar"
 entrypoint:
  - "java"
  - "-jar"
  - "/app/api.jar"
 restart: always
./docker/builds/api 디 렉 터 리 의 DockerFile 내용:
FROM openjdk:8
ENV LANG C.UTF-8
openjdk 8 을 사 용 했 습 니 다.
프로젝트 는 CentOS 서버 에 배 치 됩 니 다.프로젝트 에 가끔 응답 이 없 는 경우 가 있 으 니 당연히 올 라 가서 JDK 관련 명령 으로 스 택 과 GC 등 정 보 를 봐 야 합 니 다.
자바 프로그램 이 있 는 용기 에 들 어 갑 니 다:docekr-compose exec api bash,api 용기 의 bash 터미널 에 들 어 갑 니 다.
jps 인쇄 자바 프로 세 스:
1 api.jar
74 Jps
네,jps 명령 은 정상적으로 사용 할 수 있 습 니 다.api.jar 프로그램의 프로 세 스 번 호 는 1 입 니 다.
jmap 명령 인쇄 스 택 요약 정보:jmap-heap 1,그러나 잘못 보 고 했 습 니 다!

Attaching to process ID 1, please wait...
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 1: Operation not permitted
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 1: Operation not permitted
  at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.execute(LinuxDebuggerLocal.java:163)
  at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach(LinuxDebuggerLocal.java:278)
  at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:671)
  at sun.jvm.hotspot.HotSpotAgent.setupDebuggerLinux(HotSpotAgent.java:611)
  at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:337)
  at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
  at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
  at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
  at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
  at sun.jvm.hotspot.tools.JInfo.main(JInfo.java:138)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at sun.tools.jinfo.JInfo.runTool(JInfo.java:108)
  at sun.tools.jinfo.JInfo.main(JInfo.java:76)
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 1: Operation not permitted
  at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach0(Native Method)
  at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.access$100(LinuxDebuggerLocal.java:62)
  at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$1AttachTask.doit(LinuxDebuggerLocal.java:269)
  at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)

이상 의 관건 적 인 정 보 는 Can't attach to the process:ptrace(PTRACEATTACH,...)failed for 1:Operation not permission,조작 이 허용 되 지 않 습 니 다.
해결 방안
이 는 버그 가 아 닌 Docker 가 1.10 버 전부터 추가 한 보안 특성 이다.
jmap 와 같은 JDK 도 구 는 Linux 에 의존 하 는 PTRACEATTACH 가 아 닌 Docker 는 1.10 에서 기본 seccomp 설정 파일 에서 ptrace 를 사용 하지 않 습 니 다.
이 글 은 전체 원인 과 대응 방법 을 소개 했다.JVM in Docker and PTRACE_ATTACH
주로 세 가지 언급:
1.1 Csecurity-opt seccomp=unconfined
간단 한 폭력(추천 하지 않 음),seccomp 설정 을 직접 닫 습 니 다.사용법:
docker run --security-opt seccomp:unconfined ...
1.2 Ccap-add=SYS_PTRACE
사용--cap-add 지정 기능 추가:
docker run --cap-add=SYS_PTRACE ...
1.3 Docker Compose 의 지원
Docker Composeversion 1.1.0 (2015-02-25)부터 cap 지원add。공식 문서:cap_add, cap_drop.사용법:
앞의 docker-compose.yml 을 고 친 후 파일 내용 은 다음 과 같 습 니 다(같은 내용 부분 은 중복 붙 이지 않 습 니 다).

version: '2'

services:
 mysql:
 ...
 api:
 ...
 cap_add:
  - SYS_PTRACE
추가 지식:docker 용기 에서 jmap 등 도 구 를 사용 하여 오류 해결
먼저 오류 캡 처 를 붙 입 니 다:

오류 가 발생 한 이 유 는 docker 1.10 버 전 이후 기본적으로 ptrace 를 사용 하지 않 았 기 때 문 입 니 다.
해결 방법 은 우리 가 용 기 를 실행 하여 ptrace 를 여 는 것 이다.
docker-compose.yml 에 다음 코드 를 추가 하면 해결 할 수 있 습 니 다.

저장 후 docker-compose up-d 를 실행 하고 용기 에 들 어 갑 니 다.docker exec-it<용기 이름>/bin/bash
jmap 등 도 구 를 다시 사용 하면 잘못 보고 하지 않 습 니 다.
이상 의 Docker 는 openjdk 용기 에서 JDK 를 사용 할 수 없 는 jmap 등 명령 문 제 를 해결 하 는 것 이 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.여러분 의 많은 응원 바 랍 니 다.

좋은 웹페이지 즐겨찾기