Contents.

Docker build 에러 발생

docker를 사용하다보니 다음과 같은 에러를 겪었다. exec user process caused 'exec format error'

이 오류는 주로 운영체제 아키텍처 차이로 인해 발생한다. 예를 들어, M1 Mac에서 빌드한 이미지를 ARM 기반 서버에서 실행하려 할 때 이러한 문제가 발생할 수 있다.

**해결 방법: **Docker Buildx

Docker Buildx는 다양한 아키텍처에서 실행 가능한 이미지를 빌드할 수 있는 Docker CLI이다. 이를 활용하면 특정 아키텍쳐에서 지원하는 이미지로 빌드할 수 있다.

Buildx 사용 준비

  1. Docker 버전 확인: Buildx는 Docker 19.03 이상에서 사용 가능

  2. Docker Desktop 사용자: Buildx 기본 포함

  3. 일부 하위 버전: ~/.docker/config.json 파일에 "experimental": "enabled" 옵션 추가 필요

Buildx 사용법

빌더 생성

Docker Buildx를 사용하여 멀티 아키텍처 이미지를 빌드하기 위해서는 먼저 새로운 빌더 인스턴스 생성 필요

docker buildx create --name multiarch-builder --driver docker-container --use
  1. docker buildx create 새로운 빌더 인스턴스를 생성하는 기본 명령어

  2. --name multiarch-builder 생성할 빌더의 이름을 multiarch-builder로 지정하는 내용(다른 이름으로 변경 가능)

  3. --driver docker-container 빌더가 사용할 드라이버 지정. “docker-container” 드라이버는 새로운 Docker 컨테이너 내에서 빌드 프로세스를 실행. 이는 호스트 시스템과 격리된 환경에서 빌드를 수행할 수 있게 해준다

  4. --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

일반적인 결과 값 예시

  1. x86_64: 64비트 x86 아키텍처 (Intel 또는 AMD 프로세서)

  2. aarch64: 64비트 ARM 아키텍처 (예: Apple M1, Amazon Graviton)

  3. armv7l: 32비트 ARM 아키텍처

  4. i686: 32비트 x86 아키텍처

  5. ppc64le: 64비트 PowerPC 아키텍처 (리틀 엔디안)

  6. 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