You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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来增加操作复杂度。

答案

这个方案完全可行,无需引入集群管理工具即可实现。以下是具体的实现思路和示例:

核心操作逻辑

  1. 停止服务:使用docker-compose down停止并清理当前服务的容器,比单独停止容器更彻底。
  2. 替换镜像标签:通过sed命令批量替换Compose文件中的旧标签,注意处理ECR地址中的特殊字符(如点、斜线)。
  3. 重启服务:执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:50:36