Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Мультиплатформенная сборка
multi_platform

Мультиплатформенная сборка

Сборка образов для amd64, arm64 и других архитектур через Buildx.

Мультиплатформенная сборка

Современные приложения должны работать на разных архитектурах: x86-64 серверы, Apple Silicon (M1/M2), ARM-устройства. Изучите создание универсальных Docker-образов.

#Зачем нужна мультиплатформенная сборка?

Сценарии использования:

  • Apple Silicon — разработчики на M1/M2 Mac
  • ARM-серверы — AWS Graviton, Ampere Altra (дешевле и энергоэффективнее)
  • IoT и edge — Raspberry Pi, ARM-устройства
  • Мобильные — эмуляция на разных архитектурах
┌─────────────────────────────────────────────────────────────┐
│              Мультиплатформенный образ                      │
│                                                              │
│  manifest list: myapp:latest                                │
│  ├── linux/amd64  → для Intel/AMD серверов                 │
│  ├── linux/arm64  → для Apple Silicon, AWS Graviton        │
│  └── linux/arm/v7 → для Raspberry Pi                       │
│                                                              │
│  Docker автоматически выбирает нужную архитектуру          │
└─────────────────────────────────────────────────────────────┘

#Docker Buildx

#Что такое Buildx?

Buildx — CLI-плагин для Docker с расширенными возможностями:

  • Мультиплатформенная сборка
  • Улучшенное кэширование (BuildKit)
  • Параллельная сборка нескольких образов
  • Remote builders

#Проверка доступности

# Проверка версии Docker (Buildx встроен с 20.10) docker --version # Проверка доступности buildx docker buildx version # Список доступных builders docker buildx ls

#Создание builder

# Создание нового builder с поддержкой нескольких платформ docker buildx create --name multiarch-builder --use --bootstrap # Проверка статуса docker buildx inspect --bootstrap # Информация о поддерживаемых платформах docker buildx inspect --bootstrap | grep Platforms

Вывод:

Platforms: linux/amd64, linux/arm64, linux/arm/v7, linux/arm/v6

#Базовая мультиплатформенная сборка

#Простая сборка

# Сборка для нескольких платформ docker buildx build \ --platform linux/amd64,linux/arm64 \ -t myapp:latest \ --push \ .

Важно: Флаг --push обязателен для мультиплатформенной сборки, так как manifest list создаётся в реестре.

#Сборка с тегами

docker buildx build \ --platform linux/amd64,linux/arm64,linux/arm/v7 \ -t myapp:latest \ -t myapp:1.0.0 \ -t ghcr.io/user/myapp:latest \ --push \ .

#Проверка результата

# Просмотр manifest list docker manifest inspect myapp:latest # Вывод: { "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "digest": "sha256:abc123...", "platform": { "architecture": "amd64", "os": "linux" } }, { "digest": "sha256:def456...", "platform": { "architecture": "arm64", "os": "linux", "variant": "v8" } } ] }

#Поддерживаемые платформы

#Список платформ

ПлатформаОписаниеИспользование
linux/amd64x86-64Стандартные серверы, десктопы
linux/arm64ARM 64-bitApple Silicon, AWS Graviton, Raspberry Pi 4
linux/arm/v7ARM 32-bitRaspberry Pi 3, старые ARM-устройства
linux/arm/v6ARM v6Raspberry Pi Zero, старые устройства
linux/riscv64RISC-VЭкспериментальные устройства
windows/amd64Windows x86-64Windows-контейнеры

#Формат указания платформ

# Полная форма --platform linux/amd64 --platform linux/arm64/v8 --platform linux/arm/v7 # Сокращённая форма --platform amd64 --platform arm64 --platform arm/v7 # Несколько платформ (через запятую) --platform linux/amd64,linux/arm64

#Эмуляция QEMU

#Зачем нужна QEMU?

QEMU эмулирует другие архитектуры на хосте:

  • Сборка arm64-образа на amd64-машине
  • Тестирование без физического устройства
  • CI/CD без специализированных runners

#Настройка QEMU

# Установка qemu-user-static docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # Проверка доступных архитектур cat /proc/sys/fs/binfmt_misc/qemu-aarch64

#В GitHub Actions

- name: Set up QEMU uses: docker/setup-qemu-action@v3 with: platforms: all # Все доступные архитектуры

#Ограничения QEMU

  • Медленнее — в 5-10 раз медленнее нативной сборки
  • Не все syscall — некоторые системные вызовы не эмулируются
  • Проблемы с отладкой — сложнее диагностировать ошибки

Рекомендация: Используйте QEMU для CI, но для production собирайте на нативных runners.

#Сборка в GitHub Actions

#Базовый workflow

name: Multi-Platform Build on: push: branches: [main] tags: - 'v*' jobs: build: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout uses: actions/checkout@v4 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to GHCR uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push uses: docker/build-push-action@v5 with: context: . platforms: linux/amd64,linux/arm64 push: true tags: | ghcr.io/user/app:${{ github.sha }} ghcr.io/user/app:latest

#С кэшированием

- name: Build and push with cache uses: docker/build-push-action@v5 with: context: . platforms: linux/amd64,linux/arm64 push: true tags: ghcr.io/user/app:${{ github.sha }} cache-from: type=gha cache-to: type=gha,mode=max

#Matrix strategy для параллельной сборки

name: Parallel Multi-Platform Build on: [push] jobs: build: runs-on: ubuntu-latest strategy: matrix: platform: - linux/amd64 - linux/arm64 - linux/arm/v7 steps: - uses: actions/checkout@v4 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to GHCR uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push single platform uses: docker/build-push-action@v5 with: context: . platforms: ${{ matrix.platform }} push: true tags: ghcr.io/user/app:${{ github.sha }}-${{ matrix.platform }} cache-from: type=gha cache-to: type=gha,mode=max merge: needs: build runs-on: ubuntu-latest steps: - name: Create manifest list run: | docker buildx imagetools create \ -t ghcr.io/user/app:${{ github.sha }} \ ghcr.io/user/app:${{ github.sha }}-linux/amd64 \ ghcr.io/user/app:${{ github.sha }}-linux/arm64 \ ghcr.io/user/app:${{ github.sha }}-linux/arm/v7

#Сборка в GitLab CI

#Базовая конфигурация

# .gitlab-ci.yml stages: - build variables: IMAGE_NAME: $CI_REGISTRY_IMAGE build: stage: build image: docker:24-dind services: - docker:24-dind variables: DOCKER_TLS_CERTDIR: "" before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - docker buildx create --name builder --use script: - > docker buildx build --platform linux/amd64,linux/arm64 -t $IMAGE_NAME:$CI_COMMIT_SHA -t $IMAGE_NAME:latest --push .

#С кэшированием в GitLab Registry

build: script: - > docker buildx build --platform linux/amd64,linux/arm64 -t $IMAGE_NAME:$CI_COMMIT_SHA --cache-from type=registry,ref=$IMAGE_NAME:buildcache --cache-to type=registry,ref=$IMAGE_NAME:buildcache,mode=max --push .

#Специфика языков программирования

#Go

# syntax=docker/dockerfile:1 FROM golang:1.21 AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . # Кросс-компиляция для нескольких архитектур ARG TARGETOS TARGETARCH RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH \ go build -ldflags="-s -w" -o /app/main . FROM alpine:3.18 COPY --from=builder /app/main /app/main CMD ["/app/main"]

Важно: TARGETOS и TARGETARCH — автоматические build-arg от Buildx.

#Node.js

# syntax=docker/dockerfile:1 FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ ARG TARGETARCH RUN --mount=type=cache,target=/root/.npm \ npm ci --arch=$TARGETARCH COPY . . RUN npm run build FROM node:18-alpine WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules CMD ["node", "dist/index.js"]

#Python

# syntax=docker/dockerfile:1 FROM python:3.11-slim AS builder WORKDIR /app # Устанавливаем зависимости для компиляции RUN apt-get update && apt-get install -y --no-install-recommends \ gcc \ libffi-dev \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt . ARG TARGETPLATFORM RUN --mount=type=cache,target=/root/.cache/pip \ pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt FROM python:3.11-slim WORKDIR /app COPY --from=builder /wheels /wheels RUN pip install --no-cache-dir /wheels/* COPY . . CMD ["python", "app.py"]

#Отладка мультиплатформенных сборок

#Локальная сборка для одной платформы

# Быстрая сборка только для текущей архитектуры docker buildx build --platform linux/amd64 -t myapp:test . # Запуск и тестирование docker run --rm myapp:test

#Эмуляция другой архитектуры

# Сборка и загрузка в локальный Docker (только одна платформа) docker buildx build \ --platform linux/arm64 \ -t myapp:arm64 \ --load \ . # Запуск через эмуляцию docker run --rm myapp:arm64

Важно: --load работает только с одной платформой.

#Просмотр логов сборки

# Вербозная сборка docker buildx build --progress=plain --platform linux/amd64,linux/arm64 --push -t myapp:latest .

#Best Practices

#1. Начинайте с одной платформы

# Сначала только amd64 platforms: linux/amd64 # Затем добавьте arm64 platforms: linux/amd64,linux/arm64 # Полный набор для production platforms: linux/amd64,linux/arm64,linux/arm/v7

#2. Используйте кэширование

cache-from: type=gha cache-to: type=gha,mode=max

#3. Тестируйте на каждой платформе

- name: Test on each platform run: | docker run --rm --platform linux/amd64 myapp:test npm test docker run --rm --platform linux/arm64 myapp:test npm test

#4. Используйте нативные runners для production

# Для arm64 используйте ARM-runner build-arm64: runs-on: [self-hosted, arm64] steps: - # Нативная сборка без эмуляции

#5. Документируйте поддерживаемые платформы

## Supported Platforms - `linux/amd64` — Intel/AMD 64-bit - `linux/arm64` — Apple Silicon, AWS Graviton - `linux/arm/v7` — Raspberry Pi 3+

#Резюме

Ключевые моменты:

  1. Buildx — основной инструмент для мультиплатформенной сборки
  2. QEMU — эмуляция для CI, но медленнее нативной сборки
  3. Manifest list — единый тег для всех архитектур
  4. Кэширование — критично для скорости CI
  5. TARGETOS/TARGETARCH — автоматические build-arg для кросс-компиляции
  6. Тестирование — проверяйте образы на каждой платформе

Минимальный workflow:

- uses: docker/setup-buildx-action@v3 - uses: docker/build-push-action@v5 with: platforms: linux/amd64,linux/arm64 push: true

Это завершает блок Docker в CI/CD. Вы изучили основы сборки, работу с реестрами, оптимизацию и мультиплатформенные сборки.

Далее: Окружения: staging и production