11

我需要使用哪些 CLI 命令来检查我的私有 Docker 注册表中的映像是否比我服务器上当前运行的映像更新?

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

我想知道它是否已过时。

4

7 回答 7

10

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
于 2014-06-25T17:53:25.957 回答
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

通过比较 ids,你可以知道你运行的不是最新版本。

于 2014-06-25T17:48:40.873 回答
1

不确定,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
于 2018-01-08T09:17:32.100 回答
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
于 2014-06-25T14:04:49.220 回答
0

AFAIK,这现在是不可能的。

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

docker pull your/image:tag

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

如果您查看注册表 API 文档,您会发现,如果您不介意编写脚本,则无需实际下载图像即可获取此信息,方法是获取图像标签并检查返回的 ID 是否为标签与您拥有的具有相同标签的本地图像的 ID 相匹配。

话虽如此,在 CLI 中集成一些“检查更新”的功能docker将是一个不错的补充。

于 2014-06-25T15:30:12.073 回答
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
于 2018-02-07T22:12:48.900 回答
0

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

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

于 2019-10-08T00:06:02.693 回答