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
Старый вопрос, но это похоже на проблему, которую Сторожевая башня может решить за вас. Это еще одно закрепленное приложение, которое запускается рядом с другими вашими контейнерами и периодически проверяет, обновляются ли их базовые образы. Когда они есть, он загружает новое изображение и перезапускает их.
Если указаны правильные учетные данные, он может работать с локальным реестром.