Багатоплатформені збірки

Середній рівень Docker

Mike Metzger

Data Engineering Consultant

Багатоплатформеність?

  • Що означає багатоплатформеність?
    • Різні типи ОС
      • linux
      • windows
      • macos
    • Різні типи CPU
      • 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

Багатоплатформений приклад

# Початковий етап, використовує локальну платформу
FROM --platform=$BUILDPLATFORM golang:1.21 AS build

# Копіюємо джерельний код у директорію WORKDIR /src COPY . .
# Отримуємо змінні середовища з хоста ARG TARGETOS TARGETARCH
# Компілюємо код із використанням змінних ARG RUN env GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o /final/app .
# Створюємо контейнер і додаємо крос-зібраний код FROM alpine COPY --from=build /final/app /bin
Середній рівень Docker

Збирання багатоплатформеної збірки

  • Щоб створити багатоплатформенну збірку, замість docker build слід використовувати docker buildx із потрібними опціями
  • docker buildx надає більше команд і можливостей, зокрема вибір платформи

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

  • Перш ніж запускати збірку, потрібно створити новий контейнер builder. Це робиться командою docker buildx create --bootstrap --use.
Середній рівень Docker

Давайте потренуємось!

Середній рівень Docker

Preparing Video For Download...