我需要使用哪些 CLI 命令来检查我的私有 Docker 注册表中的映像是否比我服务器上当前运行的映像更新?
例如,我有一个运行容器docker run -d my.domain.com:5000/project1
我想知道它是否已过时。
我需要使用哪些 CLI 命令来检查我的私有 Docker 注册表中的映像是否比我服务器上当前运行的映像更新?
例如,我有一个运行容器docker run -d my.domain.com:5000/project1
我想知道它是否已过时。
Brownie 指着@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
即使没有命令,您也可以使用 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
通过比较 ids,你可以知道你运行的不是最新版本。
不确定,version
但如果您指的tag
是图像,可以通过注册表 v2 api轻松检查。请注意,在 docker images标签的上下文中,与软件版本无关。
在 CLI 中使用 curl 命令
curl <docker_host_ip>:<docker_host_port>/v2/<repository_name>/tags/list
要获取推送到私有注册表的存储库列表,请使用
curl <docker_host_ip>:<docker_host_port>/v2/_catalog
我不知道这是否像宣传的那样有效。只是我刚刚放在一起的快速破解。但这至少会给你一点推动如何做到这一点。
#!/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
AFAIK,这现在是不可能的。
我唯一看到的是拉注册表以检查您的图像是否有新版本(然后将具有与本地存储的图像不同的 ID):
docker pull your/image:tag
但是,是的,这意味着获取新图像(如果有的话)。
如果您查看注册表 API 文档,您会发现,如果您不介意编写脚本,则无需实际下载图像即可获取此信息,方法是获取图像标签并检查返回的 ID 是否为标签与您拥有的具有相同标签的本地图像的 ID 相匹配。
话虽如此,在 CLI 中集成一些“检查更新”的功能docker
将是一个不错的补充。
您可以使用在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
一个较老的问题,但这听起来像是守望台可以为您解决的问题。它是另一个 dockerized 应用程序,它与您的其他容器相邻运行,并定期检查它们的基本映像是否已更新。当它们存在时,它会下载新图像并重新启动它们。
如果提供正确的凭据,它可以与本地注册表一起使用。