使用Docker Compose实现可回滚的安全升级方案咨询
基于
:latest标签的更新回滚工作流 方案一:手动标记「已知可用」镜像(你的思路落地)
你的想法完全可行,具体操作步骤可以这样落地:
更新前标记当前可用镜像
在执行更新操作前,先给正在运行的容器对应的镜像打上last-known-working标签,留存可回滚的版本:# 直接基于容器打标签,简洁高效 docker tag calibre-web lscr.io/linuxserver/calibre-web:last-known-working执行更新操作
拉取最新镜像并强制重建容器:docker-compose pull && docker-compose up -d --force-recreate测试后确认或回滚
- 若测试正常:无需额外操作,下次更新前重复步骤1即可覆盖旧的
last-known-working标签; - 若更新失败:临时修改
docker-compose.yml的镜像标签,切换到标记好的可用版本重启:
执行重启命令:services: calibre-web: image: lscr.io/linuxserver/calibre-web:last-known-working container_name: calibre-web ...
回滚完成后,记得把docker-compose up -d --force-recreatedocker-compose.yml改回:latest,方便后续更新。
- 若测试正常:无需额外操作,下次更新前重复步骤1即可覆盖旧的
方案二:利用镜像历史自动回滚(无需手动打标签)
如果不想维护自定义标签,可以直接借助Docker的镜像历史记录回滚:
更新前记录当前镜像ID
执行更新前先保存当前容器使用的镜像ID:docker inspect -f '{{.Image}}' calibre-web > current_image.txt执行更新操作
同样运行更新命令:docker-compose pull && docker-compose up -d --force-recreate回滚时指定旧镜像ID
若需要回滚,修改docker-compose.yml的image字段为current_image.txt里记录的ID:services: calibre-web: image: <记录的镜像ID> container_name: calibre-web ...重启容器即可完成回滚,这种方式不用维护标签,但要确保镜像ID记录不丢失。
方案三:脚本化自动化工作流(一键完成更新+回滚)
把上述步骤写成Shell脚本,能大幅简化操作流程,比如创建update-service.sh:
#!/bin/bash SERVICE="calibre-web" IMAGE="lscr.io/linuxserver/calibre-web" # 标记当前可用镜像 docker tag $SERVICE $IMAGE:last-known-working # 执行更新 docker-compose pull $SERVICE && docker-compose up -d --force-recreate $SERVICE echo "更新完成,请测试服务。" read -p "确认更新保留?(输入y确认,其他键回滚): " CHOICE if [ "$CHOICE" != "y" ]; then # 临时切换标签回滚 sed -i "s|image: $IMAGE:latest|image: $IMAGE:last-known-working|" docker-compose.yml docker-compose up -d --force-recreate $SERVICE # 改回latest标签,方便下次更新 sed -i "s|image: $IMAGE:last-known-working|image: $IMAGE:latest|" docker-compose.yml echo "已回滚至上一个可用版本。" fi
给脚本添加执行权限:chmod +x update-service.sh,之后直接运行脚本就能完成更新、测试、回滚的全流程。
内容的提问来源于stack exchange,提问作者moo
相关产品推荐
相关产品推荐

