我这里有一个起始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命令可以做到这一点,但我没有设法找到一个有用的命令。
如果你正在使用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"
简单使用docker compose,您可以删除以上所有内容。
docker-compose pull
这将拉取映像(如果存在),并且 up 将仅重新创建容器(如果它实际上具有较新的映像),否则它将不执行任何操作
检查字符串“图像是最新的”以了解本地图像是否已更新:
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中的谓词返回值? 我需要找到一个树的节点,并检查它是否是一个最小堆。我猜是这样的:- 到目前为止我的代码是这个 输入的类型是- 输出应该为真。