我具有以下脚本来更新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。
答案 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 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的选项运行相同的命令。其中包括卷,端口映射。