如何检测是否存在';没有使用docker pull的新docker映像是什么?

如何检测是否存在';没有使用docker pull的新docker映像是什么?,docker,docker-compose,Docker,Docker Compose,我想每天同时拉取并重新启动docker服务,但前提是有新映像可用。在我可以运行更新服务的地方,是否有返回true的docker命令 例如 docker new-update-available myname/myimage && ./myupdateandrestart.sh 为什么不直接运行docker pull,然后仅在拉取更新时重新启动服务呢。比如: if docker pull myname/myimage | grep -q "Downloaded newer ima

我想每天同时拉取并重新启动docker服务,但前提是有新映像可用。在我可以运行更新服务的地方,是否有返回true的docker命令

例如

docker new-update-available myname/myimage && ./myupdateandrestart.sh

为什么不直接运行
docker pull
,然后仅在拉取更新时重新启动服务呢。比如:

if docker pull myname/myimage | grep -q "Downloaded newer image"; then
    ./myrestart.sh
fi

您只需要两个命令(或一个非常简单的shell脚本):


pull检索docker-compose.yml中定义的所有更新图像。如果容器在较旧的映像上运行,up将重新启动它们,否则将保留应用程序的运行实例。

在计算机上使用同一映像的多个实例时,使用pull可能会出现错误检测(也就是说,我有多个gitlab Runner,如果有更新的映像可用,我想定期升级)。因此,创建一个脚本,如
是否有更新的docker映像可用。sh
,包含以下内容:

!/bin/bash
如果[“$#”-ne 2];则
echo“用法:${0}映像实例”>&2
出口1
fi
如果[-z“${1}”];则
echo“错误:图像参数为空。”>&2
出口1
fi
如果[-z“${2}”];则
echo“错误:实例参数为空。”>&2
出口1
fi
docker pull“${1}”
IMAGE_DIGEST=$(docker IMAGE inspect--format='{{json.Id}}'${1}'| tr-d'')
实例_DIGEST=$(docker-inspect--format='{{json.Image}}'${2}'| tr-d')
测试“${IMAGE\u DIGEST}”=“${INSTANCE\u DIGEST}”
退出$?
如果提取的摘要与您的实例摘要不同,则返回1。 例如,要检查实例
runner0
是否比最新的gitlab runner映像旧:

if./is-newer-docker-image-available.sh“gitlab/gitlab runner:lastest”“runner0”
然后
docker stop runner0
docker rm runner0
docker run-d--名称runner0…gitlab/gitlab runner:latest
fi
更新:docker pull中的哈希值不是图像ID,而是图像摘要,因此我更新了代码以提取图像并检查提取的图像,以获得图像ID,该ID在实例检查数据中用作图像项

docker-compose pull
docker-compose up -d