Изображение Docker BuildX не отображается в docker image ls

#docker #docker-buildkit #docker-cli

#docker #docker-buildkit #docker-cli

Вопрос:

В настоящее время я пытаюсь создать многоплатформенный образ (x86_64, arm64, armv7, armv6) с помощью BuildKit / BuildX, и, похоже, он успешно собран, но, похоже, я не могу найти, где находится изображение. Оно не отображается измененным по сравнению с моей предыдущей сборкой для x86_64, и при попытке docker отправить его в мой репозиторий, он говорит, что все слои уже существуют, и присутствует только одна платформа. Команда, которую я использовал для создания образа:

 docker buildx build 
--platform linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6 -m 5120M 
--no-cache 
--progress auto 
--pull -t frostedflakez/php-mysql-webserver:php-latest-7.4 
--push ./
  

Последние строки, которые я получаю от терминала после сборки:

  => exporting to image                                                                                                                                                     264.6s
 => => exporting layers                                                                                                                                                     46.1s
 => => exporting manifest sha256:585ca6c82887a6f0178007c905f11c7fbde5e6220b9c451892c40d2844b43403                                                                            0.0s
 => => exporting config sha256:0923c92918eb6fad44396000250f11946f38f6e1eb0d78ec916a794f395f526a                                                                              0.0s
 => => exporting manifest sha256:0b9fceb5f74bca71942ce3e1aa5fdf5ed0453e16aff53bec5d22a9c15233fbc2                                                                            0.0s
 => => exporting config sha256:ba19e5dab51b74549775cfbc1b0ce3961342a2c859050d98e68b6130ee276e91                                                                              0.0s
 => => exporting manifest sha256:540ef45e6b3cfec74af6a4c641b70009587b19b1fe5702338a9b93b409136b28                                                                            0.0s
 => => exporting config sha256:7be378e1831fa4bd00f1595bf4d511286c600d21ee245db567115fb85fdd24cc                                                                              0.0s
 => => exporting manifest sha256:9a339a6283db4ffe56c735d85306e87261aebe8a7f696984da67720f24d4ab73                                                                            0.0s
 => => exporting config sha256:e54fc6d23c38d1a119ba6781b868643d2ede87a8f5fe0e55a5874b140fbe235e                                                                              0.0s
 => => exporting manifest list sha256:d4ec48c69d17df29e5f8521a2ede6dd83cadc8868d2829621fd15dc0582916c2                                                                       0.0s
 => => pushing layers                                                                                                                                                      206.3s
 => => pushing manifest for docker.io/frostedflakez/php-mysql-webserver:php-latest-7.4                                                                                      12.0s
  

Ответ №1:

Изображение передается непосредственно в реестр:

  => => pushing manifest for docker.io/frostedflakez/php-mysql-webserver:php-latest-7.4       12.0s
  

Невозможно отправить многоплатформенный образ в движок docker. Вместо этого все изображения в движке являются одноплатформенными, и вы помещаете многоплатформенный образ непосредственно в выбранный реестр. Вы можете извлечь изображение, чтобы получить версию для вашей платформы:

 docker image pull frostedflakez/php-mysql-webserver:php-latest-7.4
  

Само изображение находится в кэше builder, но оно недоступно из движка. Вы можете просмотреть этот размер кэша с помощью:

 docker system df
  

И вы можете очистить этот кеш с помощью:

 docker builder prune
  

Комментарии:

1. Означает ли это, что изображение в docker hub будет работать с другими выбранными мной платформами, но они будут отображаться как одноплатформенные? Для меня нет кэша сборки.

2. @NotAnerd Если вы создали конструктор контейнеров, вы можете не видеть кеш. Глядя на ваш репозиторий прямо сейчас, я не вижу списка манифеста, а само изображение, похоже, не создано с помощью buildkit, поэтому вы, возможно, перезаписали его или не выполнили push.

3. Я использовал docker buildx build для создания изображения. Я пытаюсь перестроить его снова, но, похоже, он каким-то образом находит другое изображение, которое уже было создано с его помощью, даже когда я его обрезал. Я использую --no-cache опцию для его сборки, повлияет ли это на манифесты? Построение примера с несколькими арками, похоже, отлично работает в отношении многоплатформенных манифестов.

4. @NotAnerd Вы бы создали новое изображение с новым манифестом, если вы создаете без кэша. Если вы запускаете это, и изображение не передается в Docker Hub, то в выполняемой вами команде могут быть другие ошибки, которые мы не видим в вашем вопросе.

5. оно передается в docker hub, но по-прежнему остается как linux / amd64

Ответ №2:

Если вы хотите поместить его в свой локальный docker images , добавьте --output type=docker , как описано в документах, например:

docker buildx build --output type=docker ...