如何通过Shell脚本动态更新Docker Compose服务的镜像标签?
Docker Compose手动更新镜像标签的方案可行性
原Docker Compose配置
services: utils-microservice: container_name: utils-microservice image: <Masked>.dkr.ecr.ap-south-1.amazonaws.com/utils-microservice:<Some Tag> ports: - '1024:1024' env_file: - './envs/utils-microservice.env'
需求与问题
当CI将新镜像标签推送至ECR后,希望通过Shell脚本完成以下操作:
- 停止当前运行的容器
- 将Docker Compose文件中的
utils-microservice:<Some Tag>替换为utils-microservice:<Some New Tag> - 使用更新后的配置重启服务
请问该方案是否可行?我们不想使用Docker Swarm或Kubernetes来增加操作复杂度。
答案
这个方案完全可行,无需引入集群管理工具即可实现。以下是具体的实现思路和示例:
核心操作逻辑
- 停止服务:使用
docker-compose down停止并清理当前服务的容器,比单独停止容器更彻底。 - 替换镜像标签:通过
sed命令批量替换Compose文件中的旧标签,注意处理ECR地址中的特殊字符(如点、斜线)。 - 重启服务:执行
docker-compose up -d后台启动服务,若本地无新标签镜像,会自动拉取。
示例Shell脚本
#!/bin/bash # 配置参数 COMPOSE_FILE="./docker-compose.yml" OLD_TAG="<Some Tag>" NEW_TAG="<Some New Tag>" IMAGE_URI="<Masked>.dkr.ecr.ap-south-1.amazonaws.com/utils-microservice" # 1. 停止当前服务 docker-compose -f "$COMPOSE_FILE" down # 2. 替换Compose文件中的镜像标签 # 使用竖线作为sed分隔符,避免与URI中的斜线冲突 sed -i "s|${IMAGE_URI}:${OLD_TAG}|${IMAGE_URI}:${NEW_TAG}|g" "$COMPOSE_FILE" # 可选:提前拉取新镜像(确保获取最新版本) aws ecr get-login-password | docker login --username AWS --password-stdin <Masked>.dkr.ecr.ap-south-1.amazonaws.com docker pull "${IMAGE_URI}:${NEW_TAG}" # 3. 启动更新后的服务 docker-compose -f "$COMPOSE_FILE" up -d
注意事项
- 确保脚本运行用户拥有Docker操作权限和Compose文件的修改权限
- 针对不同系统调整
sed参数:Linux用sed -i,MacOS需改为sed -i '' - 可将
OLD_TAG和NEW_TAG设为脚本参数,实现动态传入,提升灵活性 - 在CI环境中需提前配置ECR登录凭证,确保能拉取新镜像
内容的提问来源于stack exchange,提问作者Atharva Unde
相关产品推荐
相关产品推荐

