脚本能自动停止Docker容器吗?

wen 实用脚本 1

本文目录导读:

脚本能自动停止Docker容器吗?

  1. 基础停止脚本
  2. 更实用的脚本示例
  3. 自动化场景示例
  4. 使用Docker Compose
  5. 高级示例:带通知的停止脚本
  6. 使用建议

是的,脚本可以自动停止Docker容器,以下是几种常见的实现方式:

基础停止脚本

停止指定容器

#!/bin/bash
# stop_container.sh
docker stop <容器名称或ID>

停止所有运行中的容器

#!/bin/bash
# stop_all_containers.sh
docker stop $(docker ps -q)

更实用的脚本示例

带状态检查的停止脚本

#!/bin/bash
CONTAINER_NAME="my-app"
# 检查容器是否存在并运行
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
    echo "正在停止容器: ${CONTAINER_NAME}"
    docker stop ${CONTAINER_NAME}
    echo "容器已停止"
else
    echo "容器 ${CONTAINER_NAME} 未运行或不存在"
fi

批量停止带特定标签的容器

#!/bin/bash
# 停止所有带指定标签的容器
LABEL="env=production"
echo "正在查找带标签 ${LABEL} 的运行容器..."
CONTAINERS=$(docker ps --filter "label=${LABEL}" -q)
if [ -n "$CONTAINERS" ]; then
    echo "找到以下容器,正在停止..."
    docker stop $CONTAINERS
    echo "所有匹配的容器已停止"
else
    echo "没有找到匹配的运行容器"
fi

自动化场景示例

定时停止脚本(配合cron)

#!/bin/bash
# 在每天凌晨2点停止特定容器
LOG_FILE="/var/log/docker_auto_stop.log"
echo "$(date) - 开始自动停止任务" >> $LOG_FILE
# 停止开发环境容器
docker stop dev-app dev-db 2>> $LOG_FILE
echo "$(date) - 任务完成" >> $LOG_FILE

设置cron定时任务:

# 每天凌晨2点执行
0 2 * * * /path/to/auto_stop.sh

基于资源使用的自动停止

#!/bin/bash
CPU_THRESHOLD=90
MEMORY_THRESHOLD=90
docker stats --no-stream --format "{{.Name}} {{.CPUPerc}} {{.MemPerc}}" | \
while read -r line; do
    NAME=$(echo $line | awk '{print $1}')
    CPU=$(echo $line | awk '{print $2}' | sed 's/%//')
    MEM=$(echo $line | awk '{print $3}' | sed 's/%//')
    if (( $(echo "$CPU > $CPU_THRESHOLD" | bc -l) )) || \
       (( $(echo "$MEM > $MEMORY_THRESHOLD" | bc -l) )); then
        echo "容器 ${NAME} 资源使用过高 (CPU: ${CPU}%, MEM: ${MEM}%)"
        docker stop $NAME
    fi
done

使用Docker Compose

#!/bin/bash
# 停止docker-compose管理的所有服务
cd /path/to/docker-compose-project
docker-compose down
# 或者只停止不删除
# docker-compose stop

高级示例:带通知的停止脚本

#!/bin/bash
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/xxx"
DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/xxx"
stop_and_notify() {
    local container=$1
    if docker stop $container 2>/dev/null; then
        MESSAGE="✅ 容器 ${container} 已成功停止于 $(date)"
        # 发送通知(可选)
        # curl -X POST -H 'Content-type: application/json' \
        #     --data "{\"text\":\"${MESSAGE}\"}" \
        #     $SLACK_WEBHOOK_URL
        echo $MESSAGE
    else
        echo "❌ 容器 ${container} 停止失败"
    fi
}
# 使用示例
stop_and_notify "my-app"

使用建议

  1. 添加错误处理:使用 set -e 或检查命令返回值
  2. 日志记录:记录操作时间戳和结果
  3. 权限管理:确保脚本有执行权限 chmod +x script.sh
  4. 测试环境:先在测试环境验证脚本
  5. 使用绝对路径:在脚本中使用 docker 的绝对路径 /usr/bin/docker

这样你就可以根据实际需求创建自动停止Docker容器的脚本了。

抱歉,评论功能暂时关闭!