Я делаю следующее:
сборка докеров -t gcr.io/projid/imgname:333 -t gcr.io/projid/imgname:latest.
докер логин -u _json_key -p "$ (cat /secrets/service-account.json)" https://gcr.io
докер толчок gcr.io/projid/imgname:333
докер толчок gcr.io/projid/imgname:latest
Вывод команды 1-го нажатия:
Pushing to google container registry ...
The push refers to a repository [gcr.io/projid/imgname]
24af4f7c7118: Preparing
17b0972980d8: Preparing
6d6a6425aacb: Preparing
809c8c0dd73c: Preparing
e8d45b8ab3ca: Preparing
e8fa134cb7b8: Preparing
7cbcbac42c44: Preparing
e8fa134cb7b8: Waiting
7cbcbac42c44: Waiting
809c8c0dd73c: Layer already exists
e8d45b8ab3ca: Layer already exists
7cbcbac42c44: Layer already exists
e8fa134cb7b8: Layer already exists
17b0972980d8: Pushed
24af4f7c7118: Pushed
6d6a6425aacb: Pushed
333: digest: sha256:dae8cf914ba49928e6f0a34f6740802403813e6d10aa1c1d448a62ce9bb69066 size: 1779
Вывод команды 2-го нажатия:
Pushing to google container registry ...
The push refers to a repository [gcr.io/projid/imgname]
24af4f7c7118: Preparing
17b0972980d8: Preparing
6d6a6425aacb: Preparing
809c8c0dd73c: Preparing
e8d45b8ab3ca: Preparing
e8fa134cb7b8: Preparing
7cbcbac42c44: Preparing
e8fa134cb7b8: Waiting
7cbcbac42c44: Waiting
e8d45b8ab3ca: Layer already exists
809c8c0dd73c: Layer already exists
24af4f7c7118: Layer already exists
17b0972980d8: Layer already exists
6d6a6425aacb: Layer already exists
7cbcbac42c44: Layer already exists
e8fa134cb7b8: Layer already exists
latest: digest: sha256:4f57375919829982741d095f8917306fe0c1410e115d030179bae4b8e4299c30 size: 1742
Вопрос: Почему одно и то же изображение с двумя тегами приводит к созданию двух разных изображений в реестре контейнеров Google?
Вы определенно нажимаете два тега изображения. Я предлагаю создать с одним тегом, а затем добавить второй и вставлять теги изображений один за другим. Если второй добавляет новый дайджест - это ошибка GCR. Я столкнулся с этой ошибкой и решил, удалив репозиторий, чтобы он был воссоздан при следующем нажатии. В моей конфигурации версия Docker также была фактором. Версия 17.04.0-ce, сборка 4845c56 вызовет дополнительный дайджест, а версия 17.03.1-ce, сборка c6d412e будет работать нормально.
Говоря два разных изображения, вы имеете в виду два разных значения дайджеста?
SHA расшифровывается как Secure Hash Algorithm и представляет собой семейство криптографических хеш-функций, а алгоритм SHA-256 генерирует почти уникальный 256-битный (32-байтовый) хэш фиксированного размера. Поскольку тег изображения также используется для вычисления дайджеста, значение дайджеста будет значительно изменено, даже если изменится только один бит тега. В криптографии это называется лавинным эффектом, и вы можете прочитать о нем подробнее. здесь.
Одна вещь, которую нужно проверить, - это сравнить манифесты двух изображений. Например:
docker manifest inspect <image>
или
skopeo inspect --raw docker://image
Если вы различаете вывод JSON этих команд между двумя изображениями, которые должны быть одинаковыми, но не являются, это может дать вам некоторое представление о основной проблеме.
Например, в моем случае оказалось, что это был ошибка в моем инструменте построения изображения (buildah, через podman), в котором два слоя изображения имели неправильный тип носителя application/vnd.docker.image.rootfs.diff.tar.gzip
, когда на самом деле правильный тип носителя application/vnd.docker.image.rootfs.diff.tar
.
Более того, podman (полезно?) Исправлял тип мультимедиа, когда помещал одно и то же изображение с другим тегом, поэтому реестр контейнеров фактически заканчивался тегами на двух разных «изображениях».