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

Docker-检查私有注册表映像版本,docker,deployment,docker-registry,Docker,Deployment,Docker Registry,我需要使用哪些CLI命令来检查我的中的映像是否比当前服务器上运行的映像版本更新 例如,我有一个容器,我使用docker run-d my.domain.com:5000/project1 我想知道它是否过时。我不知道它是否像广告上所说的那样有效。只是我刚刚拼凑的一个快速破解。 但这至少会给你一点推动,让你知道如何做到这一点 #!/bin/bash container=$1 imageid=$(docker inspect --format '{{.Config.Image}}' ${conta

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

例如,我有一个容器,我使用
docker run-d my.domain.com:5000/project1


我想知道它是否过时。

我不知道它是否像广告上所说的那样有效。只是我刚刚拼凑的一个快速破解。 但这至少会给你一点推动,让你知道如何做到这一点

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

好吧,这现在不可能

我看到的唯一一件事是拉动注册表以检查是否存在图像的新版本(然后将具有与本地存储的图像不同的ID):

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

如果您查看一下,您会发现如果您不介意编写一点脚本,您可以通过获取图像标记并检查标记返回的ID是否与具有相同标记的本地图像的ID匹配,从而在不实际下载图像的情况下获取此信息


这就是说,将“检查更新”功能集成到
docker
CLI将是一个不错的补充。

即使没有命令,也可以使用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,您可以知道您运行的不是最新版本。

布朗尼指出@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

不确定图像的
版本
,但如果您指的是图像的
标签
,则可以通过。请注意,在docker images的上下文中,标记与软件版本无关

在CLI中使用curl命令

 curl <docker_host_ip>:<docker_host_port>/v2/<repository_name>/tags/list
curl:/v2//tags/list
要获取私有注册表上推送的存储库列表,请使用

curl <docker_host_ip>:<docker_host_port>/v2/_catalog
curl:/v2/\u目录

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

#/bin/bash
docker\u instance='YOUR\u RUNNING\u instance'
实例\u id=$(docker ps-qa——过滤器名称=$docker\u实例)
image_name_tag=$(docker inspect$instance_id | jq-r[]|.Config.image')
如果[“-${image\u name\u tag}-”!=“--”];然后
状态=$(docker pull$image_name_tag | grep“下载的更新图像”)
如果[“-${status}-”!=“--”];然后
echo“>>>此图像有一个更新…”
#停止docker实例
docker停止$docker\u实例
#删除docker实例
docker rm$docker\u实例
#使用远程存储库中的新映像,使用最后一个命令重新启动docker
run-my-docker-instance.sh
fi
fi

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


如果提供了正确的凭据,它可以与本地注册表一起工作。

我猜如果我在与部署在同一台服务器上的服务器上构建映像,但我没有,那么这将起作用,因此使用私有注册表。我似乎找不到任何与私有注册表交互的命令来列出图像/获取信息等。不幸的是(我无法找出背后的原因),从
docker
CLI与注册表的交互非常少
docker search
(与索引/中心而不是注册表一起工作)、
docker pull
docker tag
docker push
等等。我真的很希望有额外的命令,如
docker lr
(列出您的repo),和
docker check更新/repo
(比较本地图像和repo图像版本)
curl <docker_host_ip>:<docker_host_port>/v2/_catalog