Docker - проверить личную версию образа реестра

Какие команды CLI мне нужно использовать, чтобы проверить, является ли изображение в моем частном реестре докеров более новой версией, чем версия, которая сейчас работает на моем сервере?

например. У меня есть контейнер, который я использовал с помощью docker run -d my.domain.com:5000/project1

и я хотел бы знать, устарел ли он.

Ответ 1

Брауни указывает на @mbarthelemy и @amuino, которые поставили меня на путь. Из этого я смог придумать следующий bash script, который другие могут найти полезными. Он просто проверяет, отличается ли тег в реестре от текущего исполняемого контейнера.

#!/bin/bash
# ensure running bash
if ! [ -n "$BASH_VERSION" ];then
    echo "this is not bash, calling self with bash....";
    SCRIPT=$(readlink -f "$0")
    /bin/bash $SCRIPT
    exit;
fi


REGISTRY="my.registry.com:5000"
REPOSITORY="awesome-project-of-awesomeness"


LATEST="`wget -qO- http://$REGISTRY/v1/repositories/$REPOSITORY/tags`"
LATEST=`echo $LATEST | sed "s/{//g" | sed "s/}//g" | sed "s/\"//g" | cut -d ' ' -f2`

RUNNING=`docker inspect "$REGISTRY/$REPOSITORY" | grep Id | sed "s/\"//g" | sed "s/,//g" |  tr -s ' ' | cut -d ' ' -f3`

if [ "$RUNNING" == "$LATEST" ];then
    echo "same, do nothing"
else
    echo "update!"
    echo "$RUNNING != $LATEST"
fi

Ответ 2

Даже если команды нет, вы можете использовать API для проверки тегов в реестре и сравнения с тем, что вы используете.

$ curl --silent my.domain.com:5000/v1/repositories//project1/tags | grep latest
{"latest": "116f283e4f19716a07bbf48a562588d58ec107fe6e9af979a5b1ceac299c4370"}

$ docker images --no-trunc my.domain.com:5000/project1
REPOSITORY           TAG                 IMAGE ID                                                           CREATED             VIRTUAL SIZE
my.domain.com:5000   latest              64d935ffade6ed1cca3de1b484549d4d278a5ca62b31165e36e72c3e6ab8a30f   4 days ago          583.2 MB

Сравнивая идентификаторы, вы можете знать, что вы не используете последнюю версию.

Ответ 3

Не уверен в version, но если вы имеете в виду tag изображения, его можно легко проверить через registry v2 api. Обратите внимание, что в контексте изображений докеров изображение не имеет ничего общего с версией программного обеспечения.

Использовать команду curl в CLI

 curl <docker_host_ip>:<docker_host_port>/v2/<repository_name>/tags/list

Чтобы получить список репозиториев, находящихся в частном реестре, используйте

curl <docker_host_ip>:<docker_host_port>/v2/_catalog

Ответ 4

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

#!/bin/bash

container=$1
imageid=$(docker inspect --format '{{.Config.Image}}' ${container})

echo "Running version from: $(docker inspect --format '{{.Created}}' ${container})"
echo "Image version from: $(docker inspect --format '{{.Created}}' ${imageid})"

Пример вывода:

[[email protected] ~]# sh version_check.sh 9e500019b9d4
Running version from: 2014-05-30T08:24:08.761178656Z
Image version from: 2014-05-01T16:48:24.163628504Z

Ответ 5

AFAIK, это невозможно сейчас.

Единственное, что я вижу, это вывести реестр, чтобы проверить, есть ли новая версия вашего изображения (тогда будет другой идентификатор, чем ваш локально сохраненный образ):

docker pull your/image:tag

Но да, это означало бы получение новых изображений (если они есть).

Если вы посмотрите документацию по API-интерфейсу реестра, вы увидите, что если вы не против создания скриптов, вы можете получить эту информацию без фактической загрузки изображения, извлекая теги изображений и проверить, соответствует ли возвращенный идентификатор тегу идентификатору локального изображения с тем же тегом.

Говоря, что есть что-то, что нужно "проверять на наличие обновлений", интегрированное в CLI docker, было бы приятным дополнением.

Ответ 6

Вы можете использовать bash script в задаче cron:

#!/bin/bash

docker_instance='YOUR_RUNNING_INSTANCE'

instance_id=$(docker ps -qa --filter name=$docker_instance)
image_name_tag=$(docker inspect $instance_id | jq -r [] |.Config.Image')

if [ "-${image_name_tag}-" != "--" ]; then

    status=$(docker pull $image_name_tag | grep "Downloaded newer image")
    if [ "-${status}-" != "--" ]; then

        echo ">>> There is one update for this image ... "

        # stop the docker instance
        docker stop $docker_instance

        # remove the docker instance
        docker rm $docker_instance

        # restart the docker using the last command, using the new image from the remote repository
        run-my-docker-instance.sh

    fi
fi

Ответ 7

Старый вопрос, но это похоже на проблему, которую Сторожевая башня может решить за вас. Это еще одно закрепленное приложение, которое запускается рядом с другими вашими контейнерами и периодически проверяет, обновляются ли их базовые образы. Когда они есть, он загружает новое изображение и перезапускает их.

Если указаны правильные учетные данные, он может работать с локальным реестром.