GitHub Actions에서 멀티 플랫폼 이미지 빌드하기

2023년 03월 16일

멀티 플랫폼 이미지를 빌드한다는 것은 하나의 Dockerfile로 여러 플랫폼에서 실행 가능한 Docker 이미지를 생성하는 것을 의미합니다. 빌드된 이미지는 arm64, armv7, amd64, ppc64le, s390x 등의 여러 플랫폼에서 실행 가능하며, 이를 통해 다양한 플랫폼에서 동일한 이미지를 실행할 수 있습니다.

GitHub Actions에서는 Docker에서 제공하는 여러 Action을 활용하여 멀티 플랫폼 이미지를 간단하게 빌드할 수 있습니다. 이번 글에서는 GitHub Actions에서 멀티 플랫폼 이미지를 빌드하는 방법을 소개합니다.

TL;DR

Docker에서 제공하는 여러 Action을 활용하여 멀티 플랫폼 이미지를 빌드할 수 있습니다.

GitHub Actions에서 멀티 플랫폼 이미지 빌드하기

GitHub Actions에서 멀티 플랫폼 이미지를 빌드하기 위해서는 아래의 Action을 사용합니다.

setup-qemu-action

setup-qemu-action은 멀티 플랫폼 이미지를 빌드하기 위해 필요한 QEMU를 설치합니다. QEMU는 오픈소스 하이퍼 바이저로, 다른 플랫폼에서 동작하는 애플리케이션을 실행하기 위한 에뮬레이터로 사용됩니다.

- name: Set up QEMU
  uses: docker/setup-qemu-action@v2

setup-buildx-action

setup-buildx-action은 멀티 플랫폼 이미지를 빌드하기 위해 필요한 Buildx를 설치합니다. Buildx는 Docker 19.03 버전부터 기본으로 제공되는 Docker CLI 확장 플러그인으로, 여러 다른 플랫폼용으로 빌드할 수 있는 기능을 포함합니다.

- name: Set up Docker Buildx
  uses: docker/setup-buildx-action@v2

build-push-action

build-push-action을 사용하면 Docker 이미지를 빌드하고 Container Registry에 푸시할 수 있습니다. 이때, platform 옵션에 플랫폼을 명시하여 해당하는 플랫폼에서 실행 가능한 이미지를 빌드할 수 있습니다.

아래의 예시에서는 linux/amd64, linux/arm64, linux/arm/v7 플랫폼을 지원하는 이미지를 빌드합니다. 이때, Dockerfile의 FROM 명령어에 지정한 Base 이미지는 각각의 플랫폼에서 실행 가능한 이미지여야 합니다.

- name: Build and push
  uses: docker/build-push-action@v4
  with:
    context: .
    push: true
    tags: user/repo:latest
    platforms: |
      linux/amd64
      linux/arm64
      linux/arm/v7

전체적인 예시는 아래와 같습니다.

name: Build a multi-platform image and push to Docker Hub

on:
  release:
    types: [published]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to Docker hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build and push
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          tags: user/repo:latest
          platforms: |
            linux/amd64
            linux/arm64
            linux/arm/v7

마치며

기술이 발전하면서 다양한 플랫폼을 지원하는 것은 더욱 중요해지고 있습니다. 여러 플랫폼에서 동일한 애플리케이션을 실행할 수 있도록 도와주는 멀티 플랫폼 이미지는 이러한 필요성을 충족시키는 좋은 방법입니다.

하지만 멀티 플랫폼 이미지를 빌드하기 위해서는 여러 플랫폼에서 실행 가능한 Base 이미지를 선택해야 한다는 점을 유의해야 합니다. 다시 말해, 어떤 플랫폼을 지원해야 하는가에 대한 충분한 고민이 필요합니다.

참고 링크


한종우

꾸준히 고민하고 해결해나가는 엔지니어 한종우입니다.

이전 글

Docker로 간단하게 LDAP 서버 구성하기

다음 글

EC2 Instance Connect 사용하기