Docker - 检查私有注册表映像版本

时间:2014-06-25 13:19:00

标签: deployment registry docker

我需要使用哪些CLI命令来检查private docker registry中的图像是否比我服务器上当前运行的版本更新?

E.g。我有一个使用docker run -d my.domain.com:5000/project1

运行的容器

我想知道它是否已过时。

7 个答案:

答案 0 :(得分:10)

布朗尼指着@mbarthelemy和@amuino让我走上正轨。从那以后我能够提出以下bash脚本,其他人可能觉得有用。它只检查注册表上的标记是否与当前正在执行的容器不同。

#!/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

答案 1 :(得分:4)

即使没有命令,您也可以使用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

通过比较ID,您可以知道您没有运行最新版本。

答案 2 :(得分:1)

不确定version,但如果您指的是tag图片,则可以通过registry v2 api轻松查看。请注意,在docker图像的上下文中,标记与软件版本无关。

在CLI中使用curl命令

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

要获取在私有注册表上推送的存储库列表,请使用

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

答案 3 :(得分:0)

我不知道这是否像宣传的那样有效。只是一个快速的黑客我只是放在一起。 但这至少会让你对如何做到这一点有所推动。

#!/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})"

示例输出:

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

答案 4 :(得分:0)

AFAIK,现在不可能。

我唯一看到的就是拉出注册表来检查你的图像是否有新版本(然后会有一个与本地存储图像不同的ID):

docker pull your/image:tag

但是,这意味着要获取新图像(如果有的话)。

如果您查看the registry API documentation,您会发现如果您不介意编写脚本,则可以通过获取图片代码来获取此信息而无需实际下载图像并检查标签的返回ID是否与您使用相同标签的本地图像的ID匹配。

话虽如此,有事情要检查更新&#34;集成到docker CLI中将是一个很好的补充。

答案 5 :(得分:0)

您可以使用在cron计划任务中运行的bash脚本:

#!/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

答案 6 :(得分:0)

一个较旧的问题,但这听起来像Watchtower可以为您解决的问题。这是另一个dockerized应用程序,与其他容器相邻运行,并定期检查其基本映像是否已更新。当它们存在时,它将下载新映像并重新启动它们。

如果提供正确的凭据,则可以与本地注册表一起使用。