Contents.
Docker build 에러 발생
docker를 사용하다보니 다음과 같은 에러를 겪었다.
exec user process caused 'exec format error'
이 오류는 주로 운영체제 아키텍처 차이로 인해 발생한다. 예를 들어, M1 Mac에서 빌드한 이미지를 ARM 기반 서버에서 실행하려 할 때 이러한 문제가 발생할 수 있다.
**해결 방법: **Docker Buildx
Docker Buildx는 다양한 아키텍처에서 실행 가능한 이미지를 빌드할 수 있는 Docker CLI이다. 이를 활용하면 특정 아키텍쳐에서 지원하는 이미지로 빌드할 수 있다.
Buildx 사용 준비
Docker 버전 확인: Buildx는 Docker 19.03 이상에서 사용 가능
Docker Desktop 사용자: Buildx 기본 포함
일부 하위 버전:
~/.docker/config.json파일에"experimental": "enabled"옵션 추가 필요
Buildx 사용법
빌더 생성
Docker Buildx를 사용하여 멀티 아키텍처 이미지를 빌드하기 위해서는 먼저 새로운 빌더 인스턴스 생성 필요
docker buildx create --name multiarch-builder --driver docker-container --use
docker buildx create새로운 빌더 인스턴스를 생성하는 기본 명령어--name multiarch-builder생성할 빌더의 이름을 multiarch-builder로 지정하는 내용(다른 이름으로 변경 가능)--driver docker-container빌더가 사용할 드라이버 지정. “docker-container” 드라이버는 새로운 Docker 컨테이너 내에서 빌드 프로세스를 실행. 이는 호스트 시스템과 격리된 환경에서 빌드를 수행할 수 있게 해준다--use이 옵션은 새로 생성된 빌더를 즉시 현재 활성 빌더로 설정합니다. 이렇게 하면 추가 명령 없이 바로 새 빌더를 사용할 수 있다
멀티 아키텍처 이미지 빌드
docker buildx build --platform=linux/amd64,linux/arm64 -t your-image:tag --push .
주요 옵션 설명
--platform: 빌드하려는 이미지가 지원해야 할 아키텍처 명시 (예: linux/amd64, linux/arm64)--push: 이미지 빌드 후 설정되어있는 Docker 레지스트리로 push
빌드 결과 확인
빌드된 이미지의 아키텍처는 다음 명령어로 확인할 수 있다
docker exec -it container-name dpkg -s libc6 | grep Arch
이 방법을 통해 다양한 아키텍처에서 실행 가능한 Docker 이미지를 생성할 수 있으며, “exec format error” 문제를 해결할 수 있습니다.
컨테이너의 아키텍쳐 확인
docker exec [container-name] uname -m
일반적인 결과 값 예시
x86_64: 64비트 x86 아키텍처 (Intel 또는 AMD 프로세서)aarch64: 64비트 ARM 아키텍처 (예: Apple M1, Amazon Graviton)armv7l: 32비트 ARM 아키텍처i686: 32비트 x86 아키텍처ppc64le: 64비트 PowerPC 아키텍처 (리틀 엔디안)s390x: IBM System z 아키텍처
📌 나의 실무 적용 사례
나는 로컬에서 buildx를 통해 특정 아키텍처로 image 빌드 및 push를 진행 하기도 했지만, 이보다 더 중요한 것은 이를 활용하여 Github Actions에 적용 후 가상머신이 스스로 buildx를 사용하여 Build & Push 되도록 하는 것이었다.
이를 활용하여 실제로 내가 실무에 적용했던 워크플로우 구성파일 일부는 다음과 같다.
..(생략)..
docker:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Download artifact
uses: actions/download-artifact@v4
with:
name: ${{env.APP_NAME}}-application-jar
path: target/
# OIDC 인증
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@v3
with:
role-to-assume: ${{secrets.AWS_OIDC_ROLE}}
role-session-name: ecrRoleSession
aws-region: ${{secrets.AWS_REGION}}
# ECR 로그인
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
# Docker 이미지 빌드 & ECR에 Push
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Build and push Docker image
uses: docker/build-push-action@v3
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ secrets.AWS_ECR_URL }}/${{ env.APP_NAME }}:${{ env.BRANCH_NAME }}-${{ github.sha }}
platforms: linux/amd64
update-deployment:
needs: docker
runs-on: ubuntu-latest
..(생략)..
.github/workflows/application-aws.yml