Мультиплатформенный образы docker - это дичь, ад и Израиль.

Завтра составлю тред, как тяжело их на самом деле собирать, и почему `docker buildx` не столь простое решение, как может показаться в первую секунду.
Итак, предположим, что абстрактные "вы" выросли, и хочется, как большим, иметь что-то типа вот такого образа hub.docker.com/layers/nfpm/go…

Как он сделан? Если кратко, то есть hub.docker.com/layers/nfpm/go… и hub.docker.com/layers/nfpm/go…

И я на 99% уверен, что первый приготовлен `docker manifest`
Альтернативой является `docker buildx imagetools`.

Но оба инструмента обладают фатальным недостатком.. о котором позже.

А сейчас то, на что вы натыкаетесь, когда только-только начинаете копать в сторону multiarch: docker buildkit, aka buildx. Включен в docker по умолчанию.
Итак, всюду советуют поставить QEMU и не дуть в ус.

А ля `docker buildx build --platform=linux/arm64,linux/amd64` и сразу оба образа будут собраны!

Но если по какой-либо причине так получается, что в процессе сборки используется хоть что-то тяжелее `echo`, то хочется нативности
Эмуляция архитектуры через QEMU снижает производительность в разы или даже на порядок.

Иногда этим можно пожертвовать. Например, apt-get замедляется незаметно. Но наши билды используют разные --build-arg, то есть buildx опять надо запускать отдельно для разных архитектур. Иии...
И мы возвращаемся к manifest/imagetools. Обе тулзовины умеют разное, но нас интересует слияние нескольких образов в один, как в hub.docker.com/layers/nfpm/go…

Проблема: они обе работают только с образами, которые уже в registry. Надо пушить все образы, и только потом собирать общий.
Вот issue github.com/docker/cli/iss…. Говорится, что без пуша нету digest, но у меня тут подозрения относительно третьей черепашки.

У нас есть таски, собирающие служебные образы, где это не проблема github.com/ClickHouse/Cli…

Но сейчас работаю над образами для clickhouse-server.
То есть, если я запушил образ для amd64, а потом сфейлился arm64 или merge, то мусор остаётся видимый человеческому глазу. Отвратительно, неоптимально, должно быть лучше!

И поиск этого "лучше" отнял несколько.. наверное, недель, учитывая работу над github.com/ClickHouse/Cli… осенью
Тут стоит упомянуть качество документации для `docker buildx`. Что б им её так читать, как они её пишут, как говорится.

Интересующий нас кусок вообще непонятно, как гуглить github.com/moby/buildkit#…

Я нашёл в github.com/docker/buildx/…, и не помню, как попал туда.
Наш спаситель: `--output=type=image,push-by-digest=true --tag clickhouse/clickhouse-server --push`

Нелья указывать тэг для репозитория! Будет ругаться.

Эта штука запушит в репу clickhouse/clickhouse-server безымянный образ, который можно будет взять по digest.
Всё прост!.. А где взять digest? Ну, удачи в поиске этой информации. (качество документации)

У buildx build есть параметр `--iidfile string`. Но это не digest, это image ID. Я не понимаю, зачем образам over 8000 идентификаторов.

В этот момент на часах было 23:00, хотелось орать
Я не помню как, но в `buildx build --help` я увидел `--metadata-file`. И в этом файлике, пожалуйста, в двух экземплярах есть `containerimage.descriptor.digest` и `containerimage.digest`

И они есть даже без опции push. Поэтому я считаю, что github.com/docker/cli/iss… - 3-я черепашка
Да, образы всё равно оказываются пушнутыми. Но при этом не засоряют видимую пользователям область.

А собирать конечный образ можно командой
`docker buildx imagetools create --tag clickhouse/clickhouse-server:head sha256:7ba... sha256:ddbe...`
Вот такая получилась компиляция нескольких недель работы с технологией, написанной хищниками для чужих.

Ничего простого в docker нет. Человеческого тоже.

Теперь, развернём

@threadreaderapp unroll
@threadreaderapp Я только что провёл кое какой эксперимент, и теперь на 100% уверен, что `docker buildx imagetools create` можно сделать по-человечески, нужно только желание github.com/docker/cli/iss…

digest сумма имеется на локальной машине сразу

#docker #buildkit #manifests #digest #multiarch

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with ClickHouse SRE

ClickHouse SRE Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us on Twitter!

:(