我想每天同时拉动并重新启动docker服务,但前提是有新图像可用。是否有一个docker命令在我可以运行更新服务的地方返回true?
例如
docker new-update-available myname/myimage && ./myupdateandrestart.sh
答案 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 项。