SpringBoot Container가 계속 죽어서 컨테이너 로그를 찍어보려고 하는데 다음과 같은 오류가 발생했다.
exec /usr/java/openjdk-21/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의 내부 동작과정을 조금 더 공부할 수 있는 신박한? 오류였다.
'트러블 슈팅' 카테고리의 다른 글
| SSE 연결 끊김 트러블슈팅: HttpLoggingFilter와 Content-Length 충돌 (0) | 2025.12.07 |
|---|---|
| CORS Policy 에러 (3) | 2025.07.27 |
| 자동 배포 workflow 외부 IP 접근 불가 (feat. self-hosted) (1) | 2025.07.17 |
| github actions 배포 스크립트 no such file or directory 에러 (1) | 2025.07.13 |