ECR Docker 이미지 Push 오류: M1 아키텍처와 exec format 문제

2023. 10. 28. 13:14·DevOps
반응형

M1에서는 ECR에 AWS의 푸시명령어를 입력하면 오류가 발생한다.

 

이 글을 작성하게 된 이유는 Local환경에서 이미지를 빌드해서 ECR로 넣은 다음 ECS에서 배포를 했는데 계속해서 오류가 발생했다. 이에 해결방법을 찾은 것을 기록한다. 제목에 대해 바로 확인하고 싶은 분들은 목차 1은 건너뛰면 된다.

 


 

1. 이미지 배포 오류 발생


1-1. AWS에서 ECS에 서비스 생성을 완료해서 배포를 했다.

ECS 배포
ECS 배포

 

1-2. ECS로 배포하던 도중 계속해서 배포가 실패했다.

ECS 배포오류
ECS 배포오류

 


 

2. AWS CloudWatch에서 에러로그 확인


2-1. 계속 배포도중 발생하는 오류가 뭔지 확인하기 위해 CloudWatch로 이동했다.

CloudWatch 로그확인
CloudWatch 로그확인

 

2-2. 오류로그 확인

  • 아래와 같은 오류였다.
exec /usr/bin/java: exec format error

 

2-3. 원인 파악

  • 계속 검색하고 알아본 결과 원인은 운영체제의 문제였다. 지금 로컬 PC에서 ECR에 도커 이미지를 빌드할 때 사용한 게 애플 실리콘의 m2 max 사양의 맥북이었는데 이것은 ARM 아키텍처이고 EC2의 아키텍처는 x86이었기 때문이다.
  • “Mac M1에서 빌드한 Docker 이미지는 ARM 아키텍처를 사용하므로, Ubuntu 서버에서 이것을 실행하기 위해서는 AMD64 아키텍처에 호환되는 이미지를 빌드해야 한다.라고 다른 글에 적혀있었다.

 


 

3. M1 아키텍처에서 docker buildx를 사용해서 이미지 push하기


이 내용은 로컬환경(M1시리즈 맥북)을 기준으로 설명하며 만약 CodeBuild를 사용해서 BuildSpec.yml로 이미지 빌드를 진행한다면 지금 알려주는 방식대로 하지 않아도 된다(CodeBuild는 로컬이 아니고 CodeBuild 내부의 Docker 환경에서 이미지를 빌드하기 때문이다). 그때는 기존에 주어진 푸시 명령어를 약간 변형해서 BuildSpec에 넣어주면 된다.

 

3-1. 기존의 푸시 명령어

  • 아래의 명령어를 조금 변경해서 사용해야 한다.

docker build
docker build

 

 

3-2. ECR에 로그인하기

  • 이미지를 빌드하기 위해서 먼저 아래의 명령어로 ECR에 로그인한다. (푸시 명령에 본인의 로그인 명령어가 적혀있을 것이다.)
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-{본인 Ecr 내용}.dkr.ecr.ap-northeast-2.amazonaws.com

ECR 로그인
ECR 로그인

 

주의사항

  • 만약 위의 로그인 과정을 거치지 않고 바로 아래의 이미지 빌드 명령어를 입력하면 아래와 같은 403 Forbidden에러가 나올 것이다.

login error
login error

 

3-3. 이미지 빌드 및 푸시 (한 번에 하기)

  • 이제 아래 명령어로 한번에 빌드하고 푸시까지 한다.
docker buildx build --no-cache --platform=linux/amd64 -t {나의 aws 13자리 계정정보 적기}.dkr.ecr.ap-northeast-2.amazonaws.com/{ecr 리포지토리 이름 적기}:{내가 원하는 tag 이름 적기} . --push

buildx 명령어 입력
buildx 명령어 입력

 

3-4. 푸시된 이미지 확인하기

  • ECR에 들어가서 방금 푸시한 이미지가 잘 들어왔는지 확인한다.

ECR 확인하기
ECR 확인하기

 

 

여기까지가 로컬 PC에서 M1(ARM) 아키텍처에서 이미지를 빌드했을 때 다른 아키텍처(X86)를 가진 서버에서 이 이미지를 받아서 배포하면 생기는 오류에 대한 해결방법이다. 결론은 Builx를 사용해서 빌드하는 것이다. 

 


 

 

 

2023.10.28 - [AWS] - AWS ALB를 적용시킨 ECS 세팅: 실전 가이드

 

AWS ALB를 적용시킨 ECS 세팅: 실전 가이드

이번 포스트에서는 저번에 만든 ALB과 더 이전에 만들어놓은 ECR을 적용시켜서 ECS를 세팅하여 배포를 해보도록 하자 세팅 순서는 ECS 클러스터 -> 태스크 정의 -> 서비스 생성이다. 중간중간 따라오

curiousjinan.tistory.com

2023.10.29 - [AWS] - AWS CI/CD: CodePipeline 기본 설정 (1편)

 

AWS CI/CD: CodePipeline 기본 설정 (1편)

CodePipeline 시리즈는 지금까지 열심히 만든 ECR, ECS를 활용하여 CI/CD를 구현해 보는 시리즈이다. CodePipeline으로 CI/CD를 구축하는 과정에서 많은 우여곡절이 있었지만 이를 모두 순서대로 기록하기에

curiousjinan.tistory.com

 

반응형

'DevOps' 카테고리의 다른 글

단일 장애 지점(SPOF)이란?  (0) 2023.11.21
Pipeline 방식으로 Jenkins구축 - SpringBoot CI/CD 구축  (0) 2023.10.27
Jenkins로 시작하는 CI: Freestyle 프로젝트 구축 가이드  (2) 2023.10.26
AWS EC2에서 Docker와 Jenkins로 CI/CD 환경 구축하기  (0) 2023.10.25
'DevOps' 카테고리의 다른 글
  • 단일 장애 지점(SPOF)이란?
  • Pipeline 방식으로 Jenkins구축 - SpringBoot CI/CD 구축
  • Jenkins로 시작하는 CI: Freestyle 프로젝트 구축 가이드
  • AWS EC2에서 Docker와 Jenkins로 CI/CD 환경 구축하기
Stark97
Stark97
dig04059@gmail.com 링크드인 소통도 환영합니다!
  • Stark97
    오늘도 개발중입니다
    Stark97
  • 전체
    오늘
    어제
    • 분류 전체보기 (257)
      • 개발지식 (20)
        • 스레드(Thread) (8)
        • WEB, DB, GIT (3)
        • 디자인패턴 (8)
      • AI (7)
      • JAVA (21)
      • Spring (88)
        • Spring 기초 지식 (35)
        • Spring 설정 (6)
        • JPA (7)
        • Spring Security (17)
        • Spring에서 Java 활용하기 (8)
        • 테스트 코드 (15)
      • 아키텍처 (6)
      • MSA (15)
      • DDD (13)
      • gRPC (9)
      • Apache Kafka (19)
      • DevOps (23)
        • nGrinder (4)
        • Docker (1)
        • k8s (1)
        • 테라폼(Terraform) (12)
      • AWS (32)
        • ECS, ECR (14)
        • EC2 (2)
        • CodePipeline, CICD (8)
        • SNS, SQS (5)
        • RDS (2)
      • notion&obsidian (3)
      • 채팅 서비스 (1)
      • 팀 Pulse (0)
  • 링크

    • notion기록
    • 깃허브
    • 링크드인
  • hELLO· Designed By정상우.v4.10.0
Stark97
ECR Docker 이미지 Push 오류: M1 아키텍처와 exec format 문제
상단으로

티스토리툴바