Shell脚本批量启停Docker

    最近日常测试中经常需要手动启动或停止docker,于是决定写一个Shell脚本来代替人工操作,另外该脚本,也可以通过Python脚本实行远程调用,详细如下所示:

目前该脚本是将Container ID写死在脚本中,当然也可以通过传参给脚本来进行控制,大家可以改造一下。

启动docker

启动脚本详细如下所示:

#!/bin/bash

containerIDs="ad3e4d7fc407 a228730a915f ad3e4d7fc4099"
statusLived="live"
statusdead="Dead"
notExistContainer="None"
retryCount=3

function GetContainerStatus(){
   containerExist=$(sudo docker ps -a | grep -i $1 | wc -l )   
   if [ ${containerExist} -gt 0 ]
     then
       pid=$(sudo docker stats --format "{{.PIDs}}" --no-stream $1 )
       if [ "${pid}" != "0" ]
         then   
           echo "${statusLived}"
       else
           echo "${statusdead}"
       fi
    else
      echo "${notExistContainer}" 
   fi
}

function StartContainer(){
  sudo docker restart $1
}

for containerID in ${containerIDs}
 do
   for((i=1;i<=${retryCount};i++))
   do
    status=$(GetContainerStatus ${containerID} )
    echo "Container ${containerID} status is ${status}"
  
    if [ "${status}" == ${statusLived}  ]
      then
        echo "Container ${containerID} already running"
        break
    fi

    if [ "${status}" == ${notExistContainer}  ]
      then
        echo "Container ${containerID} not existed"
        break
    fi

    if [ "${status}" == ${statusdead}  ]
      then
        echo "Container ${containerID} stopped ,start container"
        StartContainer ${containerID}
        verifyStatus=$(GetContainerStatus ${containerID} )
        if [ "${verifyStatus}" == ${statusLived}  ]
           then
             echo "start container ${containerID} success "
             break
        else
           echo "${i} retry start container"
           StartContainer ${containerID}
        fi
    fi
  done
done

停止docker

停止脚本详细如下所示:

#!/bin/bash

containerIDs="589bda1309cd ad3e4d7fc407 a228730a915f ad3e4d7fc4099"
statusLived="live"
statusdead="Dead"
notExistContainer="None"
retryCount=3

function GetContainerStatus(){
   containerExist=$(sudo docker ps -a | grep -i $1 | wc -l )   
   if [ ${containerExist} -gt 0 ]
     then
       pid=$(sudo docker stats --format "{{.PIDs}}" --no-stream $1 )
       if [ "${pid}" != "0" ]
         then   
           echo "${statusLived}"
       else
           echo "${statusdead}"
       fi
    else
      echo "${notExistContainer}" 
   fi
}

function StopContainer(){
  sudo docker stop $1
}

for containerID in ${containerIDs}
 do
  for ((i=1;i<=${retryCount};i++))
    do
     status=$(GetContainerStatus ${containerID} )
     echo "Container ${containerID} status is ${status}"

     if [ "${status}" == ${statusdead}  ]
      then
        echo "Container ${containerID} already stopped"
        break
     fi

     if [ "${status}" == ${notExistContainer}  ]
       then
        echo "Container ${containerID} not existed"
        break
     fi

     if [ "${status}" == ${statusLived}  ]
       then
         echo "Container ${containerID} is lived ,stop container"
         StopContainer ${containerID}
         verifyStatus=$(GetContainerStatus ${containerID} )
         if [ "${verifyStatus}" == ${statusdead}  ]
           then
              echo "stop container ${containerID} success "
              break
         else
            echo "${i} retry stop container"
            StopContainer ${containerID}
         fi
      fi
   done
done

Python调用脚本

Python示例脚本如下所示:

import paramiko

def StartContainer(svr,port,user,pwd):
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(svr,port=port, username=user, password=pwd,timeout=5)
    client.exec_command("cd /home/TestCode/ && bash startContainer.sh")

def StopContainer(svr,port,user,pwd):
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(svr, port=port, username=user, password=pwd, timeout=5)
    client.exec_command("cd /home/TestCode/ && bash stopContainer.sh ")
本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:
MyQRCode.jpg
posted @   Surpassme  阅读(1740)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示