DEV/Infrastructure

[트러블슈팅] 도커 프로젝트 빌드 시 error code 137 해결 방법

Bi3a 2023. 12. 26. 18:39

728x90

이게.. 왜 (안)돼?


[빌드 환경은 아래와 같습니다.]

언어 : java

Back : spring boot
View : Thymeleaf
Build : gradlew
Container : Docker

Server : NCP(메모리 : 2GB)

포스팅 조회에 참고하시기 바랍니다.

 

1. 에러 발생 원인

도커 환경에서 프로젝트 git clone 후 chmod +x로 권한 부여, ./gradlew clean build로 빌드 실행을 했을 때 에러가 발생했다.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':test'.
> Process 'Gradle Test Executor 1' finished with non-zero exit value 137
에러 코드 137 : 도커에서 이미지 빌드, 실행 파일 빌드 등 발생하는 해당 코드는 OOM 문제로(Out Of Memory) 무조건 메모리 이슈이다.
즉, 답은 서버 메모리를 증설하면 된다.

해당 포스팅에서는 서버의 2GB 메모리를 활용해 서버 메모리를 증설하지는 않고 편법으로 해결하는 방법을 설명한다.
장기적으로 보았을 때는 개인 프로젝트 기준으로 서버 메모리는 4~5GB 정도로 구비해놓는 것이 안정적이다.

 

2. 시도한 절차

1) test 주석 처리 : 실패

기본적으로 실패할 만한 test는 없었기에 혹시나 주석처리했으나, 역시나 동일한 에러 코드를 반환한다. 

 

2) build.gradle maxHeapSize 제한 : 실패

[build.gradle]

tasks.named('test') {
    // 빌드 테스트 시 메모리 제한 (1GB)
    maxHeapSize = "1024m"
    useJUnitPlatform()
}

gradle 파일에서 test 실행 시 maxHeapSize를 1024m, 1GB로 제한하였다.

그러나, 빌드는 동일한 에러코드를 뱉었다.

 

3) ./gradlew build 시 no daemon으로 빌드 설정 : 성공

./gradlew clean build --no-daemon

gradle 빌드 시 데몬 없이 빌드를 실행하니 해결되었다. 

 

--no-daemon을 통해 데몬을 미실행하며 빌드함으로써 해결할 수 있었던 이유

1. 메모리 문제 해결 : 데몬 모드는 많은 메모리를 필요로 하기 때문에 --no-daemon을 사용하면 메모리 소비를 줄일 수 있다.
2. 데몬 자체의 문제 해결 : Gradle이 데몬 모드를 사용하지 않고 매번 빌드마다 새로운 JVM 프로세스를 시작하게 됨으로써 관련 문제를 우회할 수 있다. (메모리 누수 문제, 다중 프로젝트 빌드 시 충돌 문제) 

* --no-daemon을 사용해 137 에러를 해결한 경우 데몬과 관련된 문제일 가능성이 높으며, 이 경우 근본적인 해결책은 Gradle 버전을 업데이트 해야 한다.

 

4) 다른 해결책 (maybe?)

docker run -m 4g your-image

메모리가 부족할 시 컨테이너에 할당된 메모리 옵션을 설정함으로써 더 많은 메모리를 할당할 수 있다.

이 또한 임시책이므로 결과적으로는 서버 메모리를 증설하는 것이 좋다.

 


틀린 부분이 있으면 댓글로 알려주세요!