如何检查docker pull是否实际拉了东西

时间:2018-08-01 07:37:43

标签: bash docker

我具有以下脚本来更新Nextcloud:

#!/bin/bash

set -ex

docker pull nextcloud
docker rm -f nextcloud
docker run -d -p 8080:80 -v nextcloud:/var/www/html --name nextcloud --restart=unless-stopped nextcloud
docker image prune -f

问题是,即使没有新东西要拉,它也会创建新容器。

如何检查docker pull是否确实拉了东西,或者我的图像已经是最新的?在两种情况下,docker pull的退出代码均为0。

4 个答案:

答案 0 :(得分:3)

您可以检查docker pull命令的输出:

#!/bin/bash    
set -ex

out=$(docker pull nextcloud)

if [[ $out != *"up to date"* ]]; then
   docker stop nextcloud
   docker rm -f nextcloud
   docker run -d -p 8080:80 -v nextcloud:/var/www/html --name nextcloud -- 
   restart=unless-stopped nextcloud
   docker image prune -f
fi

答案 1 :(得分:1)

首先,如果未指定标签,则表示您要提取最新版本。为了更清晰,您可以执行以下操作:

#!/bin/bash

set -ex

docker pull nextcloud:latest
docker rm -f nextcloud
docker run -d -p 8080:80 -v nextcloud:/var/www/html --name nextcloud --restart=unless-stopped nextcloud:latest
docker image prune -f

如果您想知道是否拉出映像,我认为您是对的,退出代码始终为0,无论docker pull a new image还是本地映像已经是最新的。但是您可以捕获Status: Image is up to date...Status: Downloaded newer image...

的docker pull命令和grep的输出。

类似的东西:

docker pull nextcloud:latest | grep "Image is up to date" && echo "Didn't downloaded anything" || echo "Downloaded new image"

将所有内容放在一起:

#!/bin/bash

set -ex

docker pull nextcloud:latest | grep "Image is up to date" && pull_status="already_pulled" || pull_status="newly_pulled"

if [ "$pull_status" = "newly_pulled" ]; then
docker rm -f nextcloud
docker run -d -p 8080:80 -v nextcloud:/var/www/html --name nextcloud --restart=unless-stopped nextcloud:latest
docker image prune -f
fi

答案 2 :(得分:1)

您可以获取本地可用版本的图像ID,例如:

> docker image ls nginx:latest | awk '/nginx/ {print $3}'
> 649dcb69b782

“最新”是默认使用的标签。

在执行docker pull时,您可以再次使用该命令来检查映像ID是否已更改,然后采取相应的措施。

答案 3 :(得分:0)

您可能还会发现此信息有用...

来自docs

  

更新到新版本

     

更新Nextcloud容器是通过拉出新映像,扔掉旧容器并启动新容器来完成的。由于所有数据都存储在卷中,因此不会丢失任何数据。 启动脚本将检查您的卷中的版本以及已安装的docker版本。如果发现不匹配,它将自动开始升级过程。不要忘记将所有卷添加到您的新容器中,这样可以正常工作。

$ docker pull nextcloud
$ docker stop <your_nextcloud_container>
$ docker rm <your_nextcloud_container>
$ docker run <OPTIONS> -d nextcloud
     

请注意,您必须使用最初用于启动Nextcloud的选项运行相同的命令。其中包括卷,端口映射。