Docker-检查私有注册表映像版本
我需要使用哪些CLI命令来检查我的中的映像是否比当前服务器上运行的映像版本更新 例如,我有一个容器,我使用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
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