如何重启多组docker-compose进程中带特定标签的actions_1服务
仅重启Docker分组下actions服务的Shell脚本实现
问题背景
当前同时运行2组Docker服务,执行docker ps返回的运行容器列表如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0a8e26682915 image_name:latest "bash -c 'pip instal…" About a minute ago Up About a minute process_name_1_actions_1 ed8b56ff29b1 image_name:latest "bash -c 'cd live-bo…" About a minute ago Up About a minute 0.0.0.0:5005->5005/tcp, :::5005->5005/tcp process_name_1_model_1 6d8016412d12 image_name:latest "bash -c 'pip instal…" About a minute ago Up About a minute process_name_2_actions_1 128d3605297a image_name:latest "bash -c 'cd live-bo…" About a minute ago Up About a minute 0.0.0.0:5006->5005/tcp, :::5006->5005/tcp process_name_2_model_1
所有容器名称都携带分组标识:后缀为_model_1的服务启动耗时很长,后缀为_actions_1的服务需要频繁重启且启动速度快。全量执行docker-compose down再docker-compose up重启整套服务的流程繁琐低效,需要实现遍历进程组、仅重启每组对应actions_1服务的脚本。
具体实现
注意脚本框架中数组的分组名需要和实际容器名前缀保持一致,示例中容器名前缀为process_name_x,直接替换数组内容即可。
方案1:直接匹配容器名重启(无路径依赖)
不需要依赖docker-compose.yml文件位置,直接通过Docker接口匹配目标容器执行重启,适配性更强:
# 填入需要操作的服务分组前缀,必须和容器名前缀完全一致 declare -a arr=("process_name_1" "process_name_2") for i in "${arr[@]}" do target_container="${i}_actions_1" echo "正在重启服务: ${target_container}" # 先校验容器是否存在,避免执行报错 if docker ps -a --format '{{.Names}}' | grep -q "^${target_container}$"; then docker restart "${target_container}" # 如需重启后确认运行状态,可放开下方注释 # docker inspect -f '{{.Name}} 运行状态: {{.State.Status}}' "${target_container}" else echo "警告: 未找到容器 ${target_container},已跳过" fi done
方案2:使用Docker Compose原生命令重启
如果你在docker-compose.yml对应的工作目录下操作,推荐用compose原生命令定向重启服务,重启时会自动加载compose中配置的环境变量、挂载规则、重启策略,和手动操作compose重启单个服务的效果完全一致:
# 填入需要操作的服务分组前缀 declare -a arr=("process_name_1" "process_name_2") # 填写docker-compose.yml文件的实际路径 COMPOSE_CONF_PATH="./docker-compose.yml" for i in "${arr[@]}" do target_service="${i}_actions_1" echo "正在重启分组 ${i} 的actions服务" docker compose -f "${COMPOSE_CONF_PATH}" restart "${target_service}" done
使用说明
- 先给脚本添加可执行权限:
chmod +x restart_actions.sh - 直接执行脚本即可完成定向重启:
./restart_actions.sh - 两种方案选型参考:
- 容器直接操作方案:不依赖compose配置文件路径,只要目标容器存在即可执行,适合compose文件分散、容器被手动启动的场景
- Compose原生命令方案:完全对齐compose服务管理逻辑,不会丢失配置参数,适合所有服务都通过统一compose文件管理的场景
内容的提问来源于stack exchange,提问作者Steinn Hauser Magnússon
相关产品推荐
相关产品推荐

