Сравнение локального и удаленного образа, встроенного в Docker

Я пытаюсь написать скрипт для простой маркировки изображений Docker, основанный на содержимом Dockerfile, в основном что-то вроде "автоматического контроля версий".

Текущий процесс:

  1. Проверьте последнюю версию в репозитории Docker (я использую AWS ECR)
  2. Получить дайджест для этого изображения
  3. Создание образа из Dockerfile локально
  4. Сравните дайджесты с удаленного изображения и локального изображения

Теперь вот проблема. Локально построенное изображение не имеет RepoDigest что я хочу сравнить, потому что это еще не было в хранилище.

Вот ошибка:

Template parsing error: template: :1:2: executing "" at <index .RepoDigests 0>: error calling index: index out of range: 0

Другой подход, который я мог бы придумать, - это вытянуть удаленное изображение, построить локальное и сравнить слои, если слои идентичны, бездействовать, если они отличаются = новая версия, и я могу выпустить новый тег и нажать на изображение. Я не уверен, что слои надежны для этого.

Другим возможным подходом будет создание изображения с использованием некоторого временного тега, например pointer, нажимая в любом случае и в случае, если тег совпадает с последней версией, не выпускает новую версию и не останавливается там. Это будет означать, что всегда будет pointer тег где-то в хранилище. (Я также думаю, что это может быть определением latest тег?)

Это скрипт, который я использую для построения изображений:

#!/usr/bin/env bash

repository=myrepo
path=mypath.dkr.ecr.ohio-1.amazonaws.com/${repository}/

set -e
set -o pipefail

if [[ $# -gt 0 ]]; then
    if [[ -d "$1" ]]; then
        latest=$(aws ecr describe-images --repository-name ${repository}/$1 --output text --query 'sort_by(imageDetails,& imagePushedAt)[*].imageTags[*]' | tr '\t' '\n' | grep -e '^[0-9]$' | tail -1 )  || true
        if [[ -z "$latest" ]]; then
            latest=0
        fi
    else
        echo "$1 is not a directory"
        exit 1
    fi
else
   echo "Provide build directory"
   exit 1
fi

image="$path$1"
temporaryImage="$image:build"

echo "Building $image..."
docker build -t ${temporaryImage} $1

if [[ ${latest} -gt 0 ]]; then
    latestDigest=$(aws ecr describe-images --repository-name ${repository}/$1 --image-ids "imageTag=${latest}" | jq -r '.imageDetails[0].imageDigest')
    buildDigest=$(docker inspect --format='{{index .RepoDigests 0}}' ${temporaryImage})
    if [[ "$image@$latestDigest" == "$buildDigest" ]]; then
        echo "The desired version of the image is already present in the remote repository"
        exit 1
    fi
    version=$((latest+1))
else
    version=1
fi

versionedImage="$image:$version"
latestImage="$image:latest"
devImage="$image:dev"
devVersion="$image:$version-dev"

docker tag ${temporaryImage} ${versionedImage}
docker tag ${versionedImage} ${latestImage}
docker push ${versionedImage}
docker push ${latestImage}
echo "Image '$versionedImage' pushed successfully!"

docker build -t ${devImage} $1/dev/
docker tag ${devImage} ${devVersion}
docker push ${devImage}
docker push ${devVersion}
echo "Development image '$devImage' pushed successfully!"

0 ответов

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