Docker 는 openjdk 용기 에서 JDK 를 사용 할 수 없 는 jmap 등 명령 문 제 를 해결 합 니 다.
프로젝트: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 등 명령 문 제 를 해결 하 는 것 이 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.여러분 의 많은 응원 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
첫 번째 Docker for Mac참고 , 나는 옆에 있는 Mac에 Docker를 설치하고 컨테이너를 세워 보고 싶다. Docker Hub를 처음 사용할 때는 계정을 만들어야 합니다. Docker.dmg을 실행하면 Docker가 설치됩니다. Dock...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.