Buildah를 사용하여 멀티 플랫폼 이미지 빌드
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
Buildah를 사용하여 여러 CPU 아키텍처를 위한 이미지를 빌드합니다. Buildah로 멀티 플랫폼 이미지를 빌드하려면: 각 아키텍처에서 job을 실행하면 CPU 명령어 변환으로 인한 성능 문제를 피할 수 있습니다.
Buildah를 사용하여 여러 CPU 아키텍처를 위한 이미지를 빌드합니다. 멀티 플랫폼 빌드는 다양한 하드웨어 플랫폼에서 작동하는 이미지를 생성하고 Docker는 각 배포 대상에 적합한 이미지를 자동으로 선택합니다.
사전 요구 사항#
- 이미지를 빌드하기 위한 Dockerfile
- (선택 사항) 다양한 CPU 아키텍처에서 실행되는 GitLab 러너
멀티 플랫폼 이미지 빌드#
Buildah로 멀티 플랫폼 이미지를 빌드하려면:
- 각 대상 아키텍처에 대한 별도의 빌드 job을 구성합니다.
- 아키텍처별 이미지를 결합하는 매니페스트 job을 생성합니다.
- 결합된 매니페스트를 레지스트리에 푸시하도록 매니페스트 job을 구성합니다.
각 아키텍처에서 job을 실행하면 CPU 명령어 변환으로 인한 성능 문제를 피할 수 있습니다. 그러나 필요한 경우 단일 아키텍처에서 두 빌드를 모두 실행할 수 있습니다. 비네이티브 아키텍처를 위한 빌드는 더 느린 빌드 시간을 초래할 수 있습니다.
다음 예시는 두 개의 Linux에서 GitLab 호스팅 러너를 사용합니다:
saas-linux-small-arm64saas-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
이 파이프라인은 amd64 및 arm64로 태그된 아키텍처별 이미지를 생성한 다음 latest 태그에서 사용 가능한 단일 매니페스트로 결합합니다.
문제 해결#
인증 오류로 빌드 실패#
레지스트리 인증 오류가 발생하는 경우:
CI_REGISTRY_USER및CI_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 빌드 및 보안 요구 사항을 참조하세요.
