манифест докера создать аннотацию и вставить скрипт
У меня есть образы сборки 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"
Это позволяет вам иметь корневой манифест со ссылками на архивные манифесты. Я использовал аннотацию, чтобы обновить архитектуру изображения, чтобы она соответствовала точному типу узла.