Study

[Docker] 이미지 load 시 invalid tar header 오류 해결

hyoby 2024. 12. 10. 14:13

문제 상황

로컬(Mac M1)에서 Docker로 만든 이미지는 정상 실행됐음.
하지만 docker save로 저장 후 다른 서버에 옮겨서 docker load를 하자 다음과 같은 오류 발생:


해결과정

1. tar 파일 깨짐 의심

에러메시지를 구글링 해봤을 때, 가장 많이 나오는 원인은 ASCII 모드 전송으로 파일이 깨지는 경우이고, 추천 해결 방법은 아래와 같음.

https://stackoverflow.com/questions/40622162/docker-load-and-save-archive-tar-invalid-tar-header

 

하지만 나는 -o, -i 옵션 사용했고, binary 모드 전송도 확인했기 때문에 해당 문제 아니었음

 

2. 런타임 환경변수 주입 실패

Dockerfile의 FROM 절에 들어가는 기본 이미지 변경

  • FROM openjdk:17 로 수정
  • 그랬더니 아래와 같은 에러 발생

 

위 에러 발생 원인이 도커를 빌드할 때, application.yml 파일을 읽지 못해 ${session.count}와 같은 값을 읽지 못하여 형변환 불가능하다고 생각했음.

 

3. 아키텍처 불일치 의심

에러 메시지에 OS 관련 내용 포함돼 있었고, 로컬(M1, arm64)과 서버(x86_64)의 아키텍처가 달랐음.
M1에서 빌드한 이미지를 그대로 서버에서 실행하려다 호환성 이슈가 발생한 것으로 판단.


해결 방법: 플랫폼 지정해서 빌드

다음과 같이 --platform linux/amd64 옵션 붙여서 이미지 재빌드함:

docker build --platform linux/amd64 -t simulator:v1.0.4 .
docker save -o simulator.tar simulator

이후 해당 simulator.tar 파일을 ftp 로 옮김

옮긴 서버에서,
docker load -i simulator.tar

로 이미지 푼 후,

docker images
에서 해당 이미지 존재하는지 확인

docker run
을 통해 정상 동작 확인
 

 

이번 문제는 단순 파일 손상 문제가 아니었고, M1 맥에서 빌드한 이미지의 아키텍처 차이로 인한 실행 오류였음.
특히 Java 기반 앱에서 환경변수가 주입되지 않으면서 생기는 런타임 에러도 알게 되었음.

 

앞으로 체크할 것들:

  • M1에서 Docker 빌드 시, --platform linux/amd64 명시
  • 환경변수 주입 확인 (-e, application.yml, @Value)
반응형