InfoGrab Docs

Buildah를 사용하여 멀티 플랫폼 이미지 빌드

요약

Buildah를 사용하여 여러 CPU 아키텍처를 위한 이미지를 빌드합니다. Buildah로 멀티 플랫폼 이미지를 빌드하려면: 각 아키텍처에서 job을 실행하면 CPU 명령어 변환으로 인한 성능 문제를 피할 수 있습니다.

Buildah를 사용하여 여러 CPU 아키텍처를 위한 이미지를 빌드합니다. 멀티 플랫폼 빌드는 다양한 하드웨어 플랫폼에서 작동하는 이미지를 생성하고 Docker는 각 배포 대상에 적합한 이미지를 자동으로 선택합니다.

사전 요구 사항#

  • 이미지를 빌드하기 위한 Dockerfile
  • (선택 사항) 다양한 CPU 아키텍처에서 실행되는 GitLab 러너

멀티 플랫폼 이미지 빌드#

Buildah로 멀티 플랫폼 이미지를 빌드하려면:

  1. 각 대상 아키텍처에 대한 별도의 빌드 job을 구성합니다.
  2. 아키텍처별 이미지를 결합하는 매니페스트 job을 생성합니다.
  3. 결합된 매니페스트를 레지스트리에 푸시하도록 매니페스트 job을 구성합니다.

각 아키텍처에서 job을 실행하면 CPU 명령어 변환으로 인한 성능 문제를 피할 수 있습니다. 그러나 필요한 경우 단일 아키텍처에서 두 빌드를 모두 실행할 수 있습니다. 비네이티브 아키텍처를 위한 빌드는 더 느린 빌드 시간을 초래할 수 있습니다.

다음 예시는 두 개의 Linux에서 GitLab 호스팅 러너를 사용합니다:

  • saas-linux-small-arm64
  • saas-linux-small-amd64
stages:
  - build

variables:
  STORAGE_DRIVER: vfs
  BUILDAH_FORMAT: docker
  FQ_IMAGE_NAME: "$CI_REGISTRY_IMAGE:latest"

default:
  image: quay.io/buildah/stable
  before_script:
    - echo "$CI_REGISTRY_PASSWORD" | buildah login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY

build-amd64:
  stage: build
  tags:
    - saas-linux-small-amd64
  script:
    - buildah build --platform=linux/amd64 -t $CI_REGISTRY_IMAGE:amd64 .
    - buildah push $CI_REGISTRY_IMAGE:amd64

build-arm64:
  stage: build
  tags:
    - saas-linux-small-arm64
  script:
    - buildah build --platform=linux/arm64/v8 -t $CI_REGISTRY_IMAGE:arm64 .
    - buildah push $CI_REGISTRY_IMAGE:arm64

create_manifest:
  stage: build
  needs: ["build-arm64", "build-amd64"]
  tags:
    - saas-linux-small-amd64
  script:
    - buildah manifest create $FQ_IMAGE_NAME
    - buildah manifest add $FQ_IMAGE_NAME docker://$CI_REGISTRY_IMAGE:amd64
    - buildah manifest add $FQ_IMAGE_NAME docker://$CI_REGISTRY_IMAGE:arm64
    - buildah manifest push --all $FQ_IMAGE_NAME

이 파이프라인은 amd64arm64로 태그된 아키텍처별 이미지를 생성한 다음 latest 태그에서 사용 가능한 단일 매니페스트로 결합합니다.

문제 해결#

인증 오류로 빌드 실패#

레지스트리 인증 오류가 발생하는 경우:

  • CI_REGISTRY_USERCI_REGISTRY_PASSWORD 변수가 사용 가능한지 확인합니다.
  • 대상 레지스트리에 대한 푸시 권한이 있는지 확인합니다.
  • 외부 레지스트리의 경우 프로젝트의 CI/CD 변수에 인증 자격 증명이 올바르게 구성되어 있는지 확인합니다.

멀티 플랫폼 빌드 실패#

멀티 플랫폼 빌드 이슈의 경우:

  • Dockerfile의 베이스 이미지가 대상 아키텍처를 지원하는지 확인합니다.
  • 아키텍처별 의존성이 모든 대상 플랫폼에서 사용 가능한지 확인합니다.
  • 아키텍처별 로직을 위해 Dockerfile에서 조건부 문을 사용하는 것을 고려합니다.

오류: Error during unshare(CLONE_NEWUSER): Operation not permitted#

CI/CD job에서 루트리스 모드로 Buildah 또는 Docker BuildKit를 사용하여 Docker 이미지를 빌드할 때 Error during unshare(CLONE_NEWUSER): Operation not permitted가 발생할 수 있습니다.

이 오류는 루트리스 컨테이너 빌드에 필요한 보안 옵션이 설정되지 않은 경우 발생합니다.

이 문제를 해결하려면 러너의 config.toml 파일에서 [runners.docker] 섹션을 구성합니다:

[runners.docker]
  security_opt = ["seccomp:unconfined", "apparmor:unconfined"]

자세한 내용은 BuildKit 루트리스 Docker 빌드 및 보안 요구 사항을 참조하세요.

Buildah를 사용하여 멀티 플랫폼 이미지 빌드

Tier: Free, Premium, Ultimate
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
원문 보기
요약

Buildah를 사용하여 여러 CPU 아키텍처를 위한 이미지를 빌드합니다. Buildah로 멀티 플랫폼 이미지를 빌드하려면: 각 아키텍처에서 job을 실행하면 CPU 명령어 변환으로 인한 성능 문제를 피할 수 있습니다.

Buildah를 사용하여 여러 CPU 아키텍처를 위한 이미지를 빌드합니다. 멀티 플랫폼 빌드는 다양한 하드웨어 플랫폼에서 작동하는 이미지를 생성하고 Docker는 각 배포 대상에 적합한 이미지를 자동으로 선택합니다.

사전 요구 사항#

  • 이미지를 빌드하기 위한 Dockerfile
  • (선택 사항) 다양한 CPU 아키텍처에서 실행되는 GitLab 러너

멀티 플랫폼 이미지 빌드#

Buildah로 멀티 플랫폼 이미지를 빌드하려면:

  1. 각 대상 아키텍처에 대한 별도의 빌드 job을 구성합니다.
  2. 아키텍처별 이미지를 결합하는 매니페스트 job을 생성합니다.
  3. 결합된 매니페스트를 레지스트리에 푸시하도록 매니페스트 job을 구성합니다.

각 아키텍처에서 job을 실행하면 CPU 명령어 변환으로 인한 성능 문제를 피할 수 있습니다. 그러나 필요한 경우 단일 아키텍처에서 두 빌드를 모두 실행할 수 있습니다. 비네이티브 아키텍처를 위한 빌드는 더 느린 빌드 시간을 초래할 수 있습니다.

다음 예시는 두 개의 Linux에서 GitLab 호스팅 러너를 사용합니다:

  • saas-linux-small-arm64
  • saas-linux-small-amd64
stages:
  - build

variables:
  STORAGE_DRIVER: vfs
  BUILDAH_FORMAT: docker
  FQ_IMAGE_NAME: "$CI_REGISTRY_IMAGE:latest"

default:
  image: quay.io/buildah/stable
  before_script:
    - echo "$CI_REGISTRY_PASSWORD" | buildah login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY

build-amd64:
  stage: build
  tags:
    - saas-linux-small-amd64
  script:
    - buildah build --platform=linux/amd64 -t $CI_REGISTRY_IMAGE:amd64 .
    - buildah push $CI_REGISTRY_IMAGE:amd64

build-arm64:
  stage: build
  tags:
    - saas-linux-small-arm64
  script:
    - buildah build --platform=linux/arm64/v8 -t $CI_REGISTRY_IMAGE:arm64 .
    - buildah push $CI_REGISTRY_IMAGE:arm64

create_manifest:
  stage: build
  needs: ["build-arm64", "build-amd64"]
  tags:
    - saas-linux-small-amd64
  script:
    - buildah manifest create $FQ_IMAGE_NAME
    - buildah manifest add $FQ_IMAGE_NAME docker://$CI_REGISTRY_IMAGE:amd64
    - buildah manifest add $FQ_IMAGE_NAME docker://$CI_REGISTRY_IMAGE:arm64
    - buildah manifest push --all $FQ_IMAGE_NAME

이 파이프라인은 amd64arm64로 태그된 아키텍처별 이미지를 생성한 다음 latest 태그에서 사용 가능한 단일 매니페스트로 결합합니다.

문제 해결#

인증 오류로 빌드 실패#

레지스트리 인증 오류가 발생하는 경우:

  • CI_REGISTRY_USERCI_REGISTRY_PASSWORD 변수가 사용 가능한지 확인합니다.
  • 대상 레지스트리에 대한 푸시 권한이 있는지 확인합니다.
  • 외부 레지스트리의 경우 프로젝트의 CI/CD 변수에 인증 자격 증명이 올바르게 구성되어 있는지 확인합니다.

멀티 플랫폼 빌드 실패#

멀티 플랫폼 빌드 이슈의 경우:

  • Dockerfile의 베이스 이미지가 대상 아키텍처를 지원하는지 확인합니다.
  • 아키텍처별 의존성이 모든 대상 플랫폼에서 사용 가능한지 확인합니다.
  • 아키텍처별 로직을 위해 Dockerfile에서 조건부 문을 사용하는 것을 고려합니다.

오류: Error during unshare(CLONE_NEWUSER): Operation not permitted#

CI/CD job에서 루트리스 모드로 Buildah 또는 Docker BuildKit를 사용하여 Docker 이미지를 빌드할 때 Error during unshare(CLONE_NEWUSER): Operation not permitted가 발생할 수 있습니다.

이 오류는 루트리스 컨테이너 빌드에 필요한 보안 옵션이 설정되지 않은 경우 발생합니다.

이 문제를 해결하려면 러너의 config.toml 파일에서 [runners.docker] 섹션을 구성합니다:

[runners.docker]
  security_opt = ["seccomp:unconfined", "apparmor:unconfined"]

자세한 내용은 BuildKit 루트리스 Docker 빌드 및 보안 요구 사항을 참조하세요.