首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash解析码头状态以检查本地映像是否是最新的

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

Stack Overflow用户
提问于 2017-06-24 18:16:00
回答 3查看 4.1K关注 0票数 4

我在这里有一个起始码头脚本:

代码语言:javascript
复制
#!/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

事实上,这个脚本有不恰当的结果。每次运行脚本时,它都会删除旧容器。

“启动新容器”部分将提取最新的图像。如果本地映像是最新的,下面是码头拉的示例输出:

状态:图像更新为我的示例-注册表:5050/web-客户端:最新

是否有任何方法通过添加条件来改进我的脚本:

在任何情况下,检查通过码头拉本地图像是最新版本可用的注册表。然后,如果这是最近的版本,继续停止和删除旧容器动作和码头运行新的拉图。

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

也许一个docker命令可以完成这个任务,但是我没有找到一个有用的命令。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-24 19:56:24

检查字符串"Image是最新的“,以了解是否更新了本地映像:

代码语言:javascript
复制
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)

因此,将脚本更改为:

代码语言:javascript
复制
#!/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
票数 7
EN

Stack Overflow用户

发布于 2017-06-24 18:52:28

简单使用对接-合成,你可以删除上述所有。

docker-compose pull && docker-compose up

这将拉出图像,如果它存在,up只会重新创建容器,如果它实际上有一个较新的映像,否则它将什么也不做。

票数 4
EN

Stack Overflow用户

发布于 2022-07-06 15:34:15

如果您正在使用docker组合,下面是我的解决方案,在我将所有所需的图像按在docker-come.yml中之后,我就会将最新的docker-come.yml保存在映像中。

服务器以cron作业的形式运行:

代码语言:javascript
复制
#!/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

Config holder dockerfile:

代码语言:javascript
复制
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"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44739538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档