본문 바로가기
트러블 슈팅

exec /usr/java/openjdk-21/bin/java: exec format error

by CodingMasterLSW 2025. 7. 17.

SpringBoot Container가 계속 죽어서 컨테이너 로그를 찍어보려고 하는데 다음과 같은 오류가 발생했다.

exec /usr/java/openjdk-21/bin/java: exec format error

 

https://stackoverflow.com/questions/75089403/docker-exec-usr-local-openjdk-11-bin-java-exec-format-error

 

stackoverflow에서 오류가 나는 이유를 찾을 수 있었다.

docker buildx build --platform linux/amd64,linux/arm64 -t madenmustafa/postmage --push .

 

도커 이미지와 내 EC2 인스턴스가 서로 호환이 안 되는 문제였다.

 

도커 이미지는 AMD64 환경의 이미지를 생성하고 있고, 내 EC2 Instance는 t4g.micro이기 때문에 ARM64 환경이다. 즉 지원하지 않는 환경에서 이미지를 띄우려고 하니까 발생한 오류였다.


왜 이런 오류가 발생했을까?

 

기존 cicd workflow file

      - name: 이미지 빌드 및 푸시
        uses: docker/build-push-action@v5
        with:
          context: ./backend
          push: true
          tags: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY }}:latest
          build-args: |
            SPRING_ACTIVE_PROFILE=dev

 

해당 코드를 살펴보면 docker image를 어떤 환경에서 작동시킬건지에 대한 설명이 없다.

 

Github Action 공식 문서를 살펴보면 다음과 같은 설명이 적혀있다.

 

x64 환경은 amd64를 의미한다.

 

즉 github action workflow 파일에 따로 운영체제 명시를 해주지 않으면 amd64 환경으로 이미지가 생성된다.

 

해결방법

      - name: 이미지 빌드 및 푸시
        uses: docker/build-push-action@v5
        with:
          context: ./backend
          platforms: linux/arm64
          push: true
          tags: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY }}:latest
          build-args: |
            SPRING_ACTIVE_PROFILE=dev

 

platforms를 따로 명시를 해준다!


원래 arm 기반의 인스턴스 사용을 안 해서 만난 문제였다. 

 

github action의 내부 동작과정을 조금 더 공부할 수 있는 신박한? 오류였다.