当前位置: 首页 > 知识库问答 >
问题:

Bash 解析 docker 状态以检查本地映像是否是最新的

柳玄裳
2023-03-14

我这里有一个起始docker脚本:

#!/usr/bin/env bash
set -e

echo '>>> Get old container id'
CID=$(sudo docker ps --all | grep "web-client" | awk '{print $1}')
echo $CID


echo '>>> Stopping and deleting old container'
if [ "$CID" != "" ];
then
  sudo docker stop $CID
  sudo docker rm $CID
fi


echo '>>> Starting new container'
sudo docker pull my-example-registry.com:5050/web-client:latest
sudo docker run --name=web-client -p 8080:80 -d my-example-registry.com:5050/web-client:latest

事实是这个脚本的结果不正确。每次运行脚本时,它都会删除旧容器。

“启动新容器”部分将拉取最新的映像。下面是 docker pull 的示例输出(如果本地映像是最新的):

状态: 映像是最新的 我的示例注册表:5050/Web 客户端:最新

有没有什么方法可以通过添加条件来改进我的脚本:

在做任何事情之前,请检查通过 docker 拉取本地映像是否是注册表上可用的最新版本。然后,如果它是最新版本,请继续执行停止并删除旧容器操作,docker 运行新拉取的映像。

在此脚本中,如何解析状态以检查本地映像是否与注册表上可用的最新映像对应?

也许docker命令可以做到这一点,但我没有设法找到一个有用的命令。

共有3个答案

杭昊空
2023-03-14

如果你正在使用docker compose,这是我的解决方案,我会在推送完docker-compose.yml中所有需要的图片后,将最新的docker-compose.yml放入图片中

服务器将此作为 cron 作业运行:

#!/usr/bin/env bash
docker login --username username --password password
if (( $? > 0 )) ; then
  echo 'Failed to login'
  exit 1
fi
# Grab latest config, if the image is different then we have a new update to make
pullContents=$(docker pull my/registry:config-holder)
if (( $? > 0 )) ; then
  echo 'Failed to pull image'
  exit 1
fi
if echo $pullContents | grep "Image is up to date" ; then
  echo 'Image already up to date'
  exit 0
fi

cd /srv/www/

# Grab latest docker-compose.yml that we'll be needing
docker run -d --name config-holder my/registry:config-holder
docker cp config-holder:/home/docker-compose.yml docker-compose-new.yml
docker stop config-holder
docker rm config-holder

# Use new yml to pull latest images
docker-compose -f docker-compose-new.yml pull

# Stop server
docker-compose down

# Replace old yml file with our new one, and spin back up
mv docker-compose-new.yml docker-compose.yml
docker-compose up -d

配置持有者文档文件:

FROM bash
# This image exists just to hold the docker-compose.yml. So when remote updating the server can pull this, get the latest docker-compose file, then pull those
COPY docker-compose.yml /home/docker-compose.yml
# Ensures that the image is subtly different every time we deploy. This is required we want the server to find this image has changed to trigger a new deployment
RUN bash -c "touch random.txt; echo $(echo $RANDOM | md5sum | head -c 20) >> random.txt"
# Wait forever
CMD exec bash -c "trap : TERM INT; sleep infinity & wait"
娄嘉石
2023-03-14

简单使用docker compose,您可以删除以上所有内容。

docker-compose pull

这将拉取映像(如果存在),并且 up 将仅重新创建容器(如果它实际上具有较新的映像),否则它将不执行任何操作

齐栋
2023-03-14

检查字符串“图像是最新的”以了解本地图像是否已更新:

sudo docker pull my-example-registry.com:5050/web-client:latest | 
   grep "Image is up to date" ||
   (echo Already up to date. Exiting... && exit 0)

因此,将脚本更改为:

#!/usr/bin/env bash
set -e

sudo docker pull my-example-registry.com:5050/web-client:latest | 
   grep "Image is up to date" ||
   (echo Already up to date. Exiting... && exit 0)


echo '>>> Get old container id'
CID=$(sudo docker ps --all | grep "web-client" | awk '{print $1}')
echo $CID


echo '>>> Stopping and deleting old container'
if [ "$CID" != "" ];
then
  sudo docker stop $CID
  sudo docker rm $CID
fi


echo '>>> Starting new container'
sudo docker run --name=web-client -p 8080:80 -d my-example-registry.com:5050/web-client:latest
 类似资料:
  • 问题内容: 我想找出本地是否存在带有特定标签的Docker映像。如果Docker客户端无法本地执行此操作,我可以使用bash脚本。 仅为了提供一些可能的bash脚本提示,运行命令的结果将返回以下内容: 问题答案: 我通常会测试的结果(如以下脚本所示): 但 由于 仅将其 作为参数,因此您需要对tag进行grep,而不使用 。 立即获取标签(docker 1.8+) 下面提到的另一种方法是使用doc

  • 我正在使用docker-compose在linux服务器(centos)中管理我的容器“abc”。 我想完成的步骤: 1)docker撰写拉abc以拉取我的最新图像 2)docker命令检查我的容器'abc'是否需要更新(可能???) 3) 如果我的容器是“abc”,我将执行docker编写up-d 备注:我知道第3步是检查并在必要时更新容器,但如果第2步返回True,我需要执行预任务

  • 问题内容: 我正在使用Go应用程序,该应用程序使用Go Docker SDK启动一些Docker容器。我需要检查容器的进程是否以零(成功)状态代码退出。 这是最小的工作示例: 如您所见,容器中的进程以非零状态()结尾。但是,它不会记录任何致命错误,只会在构建和执行时显示: 如何使用Docker Go SDK检查以非零状态退出的容器进程? 问题答案: 我认为您应该使用状态通道来获取退出代码。错误通道

  • 我在服务器中执行docker()清洁命令: 令我惊讶的是,这个命令删除了停止的容器。这就是问题所在,有些容器因为某种原因停止了,但我仍然想在未来使用它。现在它被删除了,有没有可能恢复错误删除的停止的容器?

  • 我的AWS ECR中有一个Docker映像,我想将其转换为AWS AMI,以便在环境中创建实例。 尝试在Docker容器上使用AMI的原因 我必须在m4中的Docker容器中运行计算密集型ML任务。xlarge在一些文本文件上的实例。然而,使用Docker时,实例的CPU利用率达到了100%,脚本也在提前终止。 但是,它在Docker外部的同一实例中运行良好。 因此,我想从Docker转移到AMI

  • 如何让prolog中的谓词返回值? 我需要找到一个树的节点,并检查它是否是一个最小堆。我猜是这样的:- 到目前为止我的代码是这个 输入的类型是- 输出应该为真。