манифест докера создать аннотацию и вставить скрипт

У меня есть образы сборки DockerHub для x86_64для моих проектов. Изображения имеют такое название: myname/project:version_architecture; такие как foo/bar:1.0.0_x86_64.

Затем я строю aarch64 изображения на RPi4: foo/bar:1.0.0_aarch64, который я затем отправляю в DockerHub.

Теперь мне нужен манифест, содержащий их обоих, чтобы я мог использовать foo/bar:1.0.0 где угодно, и он будет работать.

AFAIK, следующие команды должны работать (для запуска на RPi):

docker build -t foo/bar:1.0.0_aarch64 .
docker push foo/bar:1.0.0_aarch64

docker manifest create foo/bar:1.0.0 foo/bar:1.0.0_aarch64
docker manifest annotate foo/bar:1.0.0 foo/bar:1.0.0_x86_64
docker manifest push foo/bar:1.0.0

Но по какой-то причине annotate шаг иногда не удается:

manifest for image foo/bar:1.0.0_x86_64 does not exist in foo/bar:1.0.0

И вместо этого работает следующий обходной путь (обычно):

docker build -t foo/bar:1.0.0_aarch64 .
docker push foo/bar:1.0.0_aarch64

docker manifest create foo/bar:1.0.0 foo/bar:1.0.0_aarch64
docker manifest annotate foo/bar:1.0.0 foo/bar:1.0.0_x86_64
docker manifest create foo/bar:1.0.0 foo/bar:1.0.0_x86_64 --amend
docker manifest annotate foo/bar:1.0.0 foo/bar:1.0.0_aarch64
docker manifest push foo/bar:1.0.0

Я что-то упускаю?

1 ответ

Чтобы создать мультиархивный манифест, вам нужно создать 2 образа с разными арками.

      export ARCH=i386
docker build -t foo/bar:1.0.0-${ARCH}" --build-arg ARCH=${ARCH} --network=host .
docker tag "foo/bar:1.0.0-${ARCH}" "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-${ARCH}"
docker push "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-${ARCH}"

После этого вы добавляете еще один образ (построенный из другой архитектуры):

      export ARCH=arm64v8
docker build -t foo/bar:1.0.0-${ARCH}" --build-arg ARCH=${ARCH} --network=host .
docker tag "foo/bar:1.0.0-${ARCH}" "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-${ARCH}"
docker push "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-${ARCH}"

Затем вы можете создать корневой манифест, добавить ссылки на реальные изображения и отредактировать его, если вам нужно:

      export DOCKER_CLI_EXPERIMENTAL=enabled
docker manifest create "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0" \
    --amend  "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-i386" \
    --amend "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-arm64v8"
docker manifest annotate --arch amd64 "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0" "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-i386"
docker manifest inspect "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0"
docker manifest push "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0"

Это позволяет вам иметь корневой манифест со ссылками на архивные манифесты. Я использовал аннотацию, чтобы обновить архитектуру изображения, чтобы она соответствовала точному типу узла.

Другие вопросы по тегам