У меня есть частный репозиторий докера, и я хочу проверить, доступна ли более новая версия изображения докера или нет. Я попробовал:
curl -kvu "myuser:mypasswd" -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X HEAD https://myrepo:5000/v2/myimage/manifests/i386
Я получил ответ как это:
< HTTP/1.1 200 OK
< Content-Length: 9080
< Content-Type: application/vnd.docker.distribution.manifest.v2+json
< Docker-Content-Digest: sha256:5891d3d01fcdb5ec7dc8a27f25360b132510c7b92369ad50926c27ca7d7cfacf
< Docker-Distribution-Api-Version: registry/2.0
< Etag: "sha256:5891d3d01fcdb5ec7dc8a27f25360b132510c7b92369ad50926c27ca7d7cfacf"
< X-Content-Type-Options: nosniff
Которым поле в заголовке ответа должно быть по сравнению с локальными метаданными изображения?
curl -kvu "myuser:mypasswd" -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X HEAD https://myrepo:5000/v2/myimage/manifests/<tag>
возвратит ответ как это:
< HTTP/1.1 200 OK
< Content-Length: 9080
< Content-Type: application/vnd.docker.distribution.manifest.v2+json
< Docker-Content-Digest: sha256:5891d3d01fcdb5ec7dc8a27f25360b132510c7b92369ad50926c27ca7d7cfacf
< Docker-Distribution-Api-Version: registry/2.0
< Etag: "sha256:5891d3d01fcdb5ec7dc8a27f25360b132510c7b92369ad50926c27ca7d7cfacf"
< X-Content-Type-Options: nosniff
Docker-Content-Digest:
поле должно быть проверено по digest
из локального изображения
docker images --digests myrepo:5000/myimage
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
myrepo:5000/myimage i386 sha256:5891d3d01fcdb5ec7dc8a27f25360b132510c7b92369ad50926c27ca7d7cfacf b9e9c7f4a462 6 days ago 491 MB
docker images --digests myrepo:5000/myimage
, Должен быть выполнен без тега (i386 в этом случае)
Если несоответствия обзоров, то существует более новая версия доступного изображения. Так в основном, Вы проверяете обзор удаленного и локальное изображение. Если они не сочетаются, более новая версия доступна.
Вот готовый к использованию сценарий оболочки для проверки его по Реестру Докера GitLab.
set -e
GITLAB_SERVER="xxx.example.com"
REGISTRY_SERVER="$GITLAB_SERVER:5001"
IMAGE="group/subgroup1/subgroup2/project/image"
AUTH=$(jq -r ".auths.\"$REGISTRY_SERVER\".auth" ~/.docker/config.json | base64 -d) # WARN: on OSX base64 -D not -d
TOKEN=$(curl -u "$AUTH" "https://$GITLAB_SERVER/jwt/auth?client_id=docker&offline_token=true&service=container_registry&scope=repository:$IMAGE:push,pull" | jq -r .token)
REMOTE_SHA=$(curl -fH "Authorization: Bearer $TOKEN" -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -I https://$REGISTRY_SERVER/v2/$IMAGE/manifests/latest | grep Docker-Content-Digest | awk '{print $2}')
LOCAL_SHA=$(docker inspect "$REGISTRY_SERVER/${IMAGE}:latest" -f '{{index .Id}}')
echo "Local: $LOCAL_SHA"
echo "Remote: $REMOTE_SHA"
if [[ "$LOCAL_SHA" == "$REMOTE_SHA" ]]; then
echo "$IMAGE up-to-date"
else
echo "$IMAGE outdated"
fi