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

Средний уровень Docker

Mike Metzger

Data Engineering Consultant

Мультиплатформенность?

  • Что означает мультиплатформенность?
    • Различные типы ОС
      • linux
      • windows
      • macos
    • Различные типы процессоров
      • x64_64 или amd64
      • arm64
      • arm7
  • Обычно обозначается как os/cpu, например linux/amd64

Логотип Linux Tux

Логотип AMD64

Логотип ARM

Средний уровень Docker

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

  • Основана на принципе многоэтапной сборки
  • Начальный этап (сборка) использует кросс-компиляторы и опирается на архитектуру хост-системы
  • Финальный этап использует архитектуру и ОС целевой платформы
Средний уровень Docker

Параметры мультиплатформенного Dockerfile

  • На этапе сборки используется флаг --platform=$BUILDPLATFORM
    • $BUILDPLATFORM — платформа хоста, выполняющего сборку
  • Иногда применяется директива ARG
    • Передаёт локальные переменные окружения в систему сборки Docker
    • В данном случае — TARGETOS и TARGETARCH
    • ARG TARGETOS TARGETARCH
    • Переменные окружения на уровне хоста могут быть заданы заранее или с помощью команды env.
Средний уровень Docker

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

# Initial stage, using local platform
FROM --platform=$BUILDPLATFORM golang:1.21 AS build

# Copy source into place WORKDIR /src COPY . .
# Pull the environment variables from the host ARG TARGETOS TARGETARCH
# Compile code using the ARG variables RUN env GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o /final/app .
# Create container and load the cross-compiled code FROM alpine COPY --from=build /final/app /bin
Средний уровень Docker

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

  • Для создания мультиплатформенной сборки вместо docker build необходимо использовать docker buildx с соответствующими параметрами
  • docker buildx расширяет возможности docker build: в частности, позволяет задать целевую платформу

docker buildx build --platform linux/amd64,linux/arm64 -t multi-platform-app .

  • Перед запуском сборки необходимо создать новый контейнер builder. Это выполняется командой docker buildx create --bootstrap --use.
Средний уровень Docker

Давайте потренируемся!

Средний уровень Docker

Preparing Video For Download...