如何在不使用docker pull的情况下检测是否有新的docker镜像?

时间:2016-10-25 02:48:53

标签: docker docker-compose

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

例如

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

3 个答案:

答案 0 :(得分:2)

为什么不运行docker pull,然后只在您提取更新时重新启动服务。类似的东西:

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

答案 1 :(得分:2)

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

docker-compose pull
docker-compose up -d

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

答案 2 :(得分:1)

在计算机上使用同一图像的多个实例时,可能会使用 pull 进行错误检测(即,我有多个gitlab运行程序,如果有较新的图像可用,我想定期对其进行升级)。因此,创建具有以下内容的脚本is-newer-docker-image-available.sh

#!/bin/bash
if [ "$#" -ne 2 ]; then
  echo "Usage: ${0} IMAGE INSTANCE" >&2
  exit 1
fi
if [ -z "${1}" ]; then
    echo "Error: the IMAGE argument is empty." >&2
    exit 1
fi
if [ -z "${2}" ]; then
    echo "Error: the INSTANCE argument is empty." >&2
    exit 1
fi
docker pull "${1}"
IMAGE_DIGEST=$(docker image inspect --format='{{json .Id}}' "${1}" | tr -d '"')
INSTANCE_DIGEST=$(docker inspect --format='{{json .Image}}' "${2}" | tr -d '"')
test "${IMAGE_DIGEST}" = "${INSTANCE_DIGEST}"
exit $?

如果提取的摘要与您的实例摘要不同,则返回1。 例如,要检查实例runner0是否旧​​,然后检查最新的gitlab-runner映像:

if ./is-newer-docker-image-available.sh "gitlab/gitlab-runner:lastest" "runner0"
then
  docker stop runner0
  docker rm runner0
  docker run -d --name runner0 ... gitlab/gitlab-runner:latest
fi

更新docker pull中的哈希值不是图像ID,而是图像摘要,因此,我更新了代码以提取图像并检查提取的图像以获得图像ID在实例检查数据中用作 Image 项。