[Spring] bootBuildImage와 "No compatible attachment provider is available"

이멀젼씨

·

2021. 12. 1. 18:46

목적

bootBuildImage로 만든 스프링부트 이미지 실행 시 No compatible attachment provider is available 에러가 발생하는 것을 해결하기 위함

목차

  1. bootBuildImage로 이미지 빌드
  2. 에러 해결하기

1. bootBuildImage로 이미지 빌드

bootBuildImage를 사용하여 빌드한 이미지를 쿠버네티스에서 Pod의 형태로 만들어 실행하였다.

하지만 No compatible attachment provider is available 라는 에러와 함께 Pod가 실행되지 않았다.

상태가 CrashLoopBackOff로 초기화 컨테이너가 반복적으로 실행에 실패하였다.

2. 에러 해결하기

https://github.com/alibaba/arthas/issues/1676
https://github.com/spring-projects/spring-boot/issues/23121

찾아본 내용을 종합해보면서 아래와 같은 결론을 내렸다.

bootBuildImage를 실행하면 JDK 대신 JRE를 사용하여 이미지를 생성한다.

JRE 대신 JDK를 실행할 수 있도록 해야한다.

bootBuildImage 사용 시 따로 JDK를 사용할 수 있도록 설정하는 부분이 없는 것 같다.

따라서 JNA-PLATFORM의존성을 통해 JDK가 필요한 모듈들을 실행할 수 있도록 한다.

JNA-PLATFORM을 사용해야 한다는 결론이 나왔다.

JNA-PLATFORM에 대해 찾아보니 아래와 같이 적혀 있었다.

JNA provides Java programs easy access to native shared libraries without writing anything but Java code - no JNI or native code is required

JNA allows you to call directly into native functions using natural Java method invocation. The Java call looks just like the call does in native code. Most calls require no special handling or configuration; no boilerplate or generated code is required.

JNA는 Java 코드만 작성하지 않고도 기본 공유 라이브러리에 쉽게 액세스할 수 있는 Java 프로그램을 제공합니다. JNI 또는 기본 코드가 필요하지 않습니다.

JNA를 사용하면 자연스러운 Java 메서드 호출을 사용하여 네이티브 함수를 직접 호출할 수 있습니다. Java 호출은 호출이 네이티브 코드에서 수행하는 것처럼 보입니다. 대부분의 호출에는 특별한 처리나 구성이 필요하지 않습니다. 상용구 또는 생성된 코드가 필요하지 않습니다.

한마디로 별다른 의존성이나 구성 없이 Java가 사용할 수 있는 라이브러리에서 네이티브 함수를 직접 호출하여 실행시켜준다는 것이다.

이를 통해 JDK가 없는 환경에서도 JNA-PLATFORM 의존성을 추가하여 JDK가 사용하는 네이티브 라이브러리들을 사용하여 해결해주는 것 같았다.

의존성에 JNA-PLATFORM을 추가해주니 bootBuildImage로 만들어진 이미지 실행이 오류없이 잘 되었다.