Сборка образов для amd64, arm64 и других архитектур через Buildx.
Современные приложения должны работать на разных архитектурах: x86-64 серверы, Apple Silicon (M1/M2), ARM-устройства. Изучите создание универсальных Docker-образов.
Сценарии использования:
┌─────────────────────────────────────────────────────────────┐
│ Мультиплатформенный образ │
│ │
│ manifest list: myapp:latest │
│ ├── linux/amd64 → для Intel/AMD серверов │
│ ├── linux/arm64 → для Apple Silicon, AWS Graviton │
│ └── linux/arm/v7 → для Raspberry Pi │
│ │
│ Docker автоматически выбирает нужную архитектуру │
└─────────────────────────────────────────────────────────────┘
Buildx — CLI-плагин для Docker с расширенными возможностями:
# Проверка версии Docker (Buildx встроен с 20.10)
docker --version
# Проверка доступности buildx
docker buildx version
# Список доступных builders
docker buildx ls# Создание нового 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/amd64 | x86-64 | Стандартные серверы, десктопы |
linux/arm64 | ARM 64-bit | Apple Silicon, AWS Graviton, Raspberry Pi 4 |
linux/arm/v7 | ARM 32-bit | Raspberry Pi 3, старые ARM-устройства |
linux/arm/v6 | ARM v6 | Raspberry Pi Zero, старые устройства |
linux/riscv64 | RISC-V | Экспериментальные устройства |
windows/amd64 | Windows x86-64 | Windows-контейнеры |
# Полная форма
--platform linux/amd64
--platform linux/arm64/v8
--platform linux/arm/v7
# Сокращённая форма
--platform amd64
--platform arm64
--platform arm/v7
# Несколько платформ (через запятую)
--platform linux/amd64,linux/arm64QEMU эмулирует другие архитектуры на хосте:
# Установка qemu-user-static
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
# Проверка доступных архитектур
cat /proc/sys/fs/binfmt_misc/qemu-aarch64- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: all # Все доступные архитектурыРекомендация: Используйте QEMU для CI, но для production собирайте на нативных runners.
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=maxname: 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.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
.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
.# 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 /app/main /app/main
CMD ["/app/main"]Важно: TARGETOS и TARGETARCH — автоматические build-arg от Buildx.
# syntax=docker/dockerfile:1
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
ARG TARGETARCH
RUN \
npm ci --arch=$TARGETARCH
COPY . .
RUN npm run build
FROM node:18-alpine
WORKDIR /app
COPY /app/dist ./dist
COPY /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]# 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 \
pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt
FROM python:3.11-slim
WORKDIR /app
COPY /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 .# Сначала только amd64
platforms: linux/amd64
# Затем добавьте arm64
platforms: linux/amd64,linux/arm64
# Полный набор для production
platforms: linux/amd64,linux/arm64,linux/arm/v7cache-from: type=gha
cache-to: type=gha,mode=max- 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# Для arm64 используйте ARM-runner
build-arm64:
runs-on: [self-hosted, arm64]
steps:
- # Нативная сборка без эмуляции## Supported Platforms
- `linux/amd64` — Intel/AMD 64-bit
- `linux/arm64` — Apple Silicon, AWS Graviton
- `linux/arm/v7` — Raspberry Pi 3+Ключевые моменты:
Минимальный workflow:
- uses: docker/setup-buildx-action@v3
- uses: docker/build-push-action@v5
with:
platforms: linux/amd64,linux/arm64
push: trueЭто завершает блок Docker в CI/CD. Вы изучили основы сборки, работу с реестрами, оптимизацию и мультиплатформенные сборки.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.