前言
这里教大家用 sh脚本 实现多 Docker WEB容器的启动或重启
ps:小白、简单、高效
常用场景
版本更新的时候 同一个镜像要启动10个容器 要求是 每个容器名 是我输入的容器名 +1 +2 依次类推,
监听的端口号 也是比如 第一个是80, 第二个是81 依次类推
脚本内容
#!/bin/bash
STRING_REGEX=".+"
NUMBER_REGEX="^[0-9]+$"
# 确保用户输入不为空并且符合给定的正则表达式
ensure_valid_input() {
local prompt="$1" # 提示信息
local regex="$2" # 正则表达式,用于验证输入格式
local default="$3" # 默认值
local input
while true; do
echo -n "$prompt" >&2
read input
if [[ -z "$input" ]]; then
if ! [[ -z "$default" ]]; then
echo "$default"
return
fi
echo "输入不能为空,请重新输入!" >&2
elif ! [[ $input =~ $regex ]]; then
echo "输入格式不正确,请重新输入!" >&2
else
break
fi
done
echo "$input"
}
# 开始或重启操作
while true; do
echo -n "请输入需要的操作指令 (启动 start 重启容器 restart): "
read action
if [[ "$action" == "start" || "$action" == "restart" ]]; then
break
else
echo "无效输入,请输入 start 或 restart !"
fi
done
if [[ "$action" == "start" ]]; then
container_count=$(ensure_valid_input "输入要启动的容器数量 (默认 1): " $NUMBER_REGEX 1)
if [[ "$container_count" -eq 0 ]] || [[ "$container_count" -gt 100 ]]; then
echo "容器数量输入无效!最大 100"; exit
fi
image_name=$(ensure_valid_input "输入需要启动容器镜像的名称: " $STRING_REGEX)
version=$(ensure_valid_input "输入容器镜像的版本号(默认 latest):" $STRING_REGEX latest)
base_name=$(ensure_valid_input "输入容器的基础名称 (前缀): " $STRING_REGEX)
volume_name=$(ensure_valid_input "输入容器的挂载卷(默认 \$PWD:/app): " $STRING_REGEX "$PWD:/app")
starting_host_port=$(ensure_valid_input "请输入宿主机监听的端口号:(默认 81) " $NUMBER_REGEX 81)
container_port=$(ensure_valid_input "请输入容器的监听端口号 (默认 8081): " $NUMBER_REGEX 8081)
for ((i=1; i<=container_count; i++)); do
container_name="${base_name}-${i}"
host_port=$((starting_host_port + i - 1))
# 检查容器是否已经在运行,如果运行则删除容器
if docker ps -a --format "{{.Names}}" | grep -q "^${container_name}$"; then
echo "停止并删除已存在的容器 ${container_name}..."
docker stop ${container_name} &> /dev/null
docker rm ${container_name} &> /dev/null
fi
# 构建并运行容器的命令
if [[ "$version" == "latest" ]]; then
docker_command="docker run -d -v ${volume_name} -p ${host_port}:${container_port} --name ${container_name} --restart=always ${image_name}"
else
docker_command="docker run -d -v ${volume_name} -p ${host_port}:${container_port} --name ${container_name} --restart=always ${image_name}:${version}"
fi
echo "运行命令:$docker_command"
eval $docker_command
done
elif [[ "$action" == "restart" ]]; then
container_name=$(ensure_valid_input "请输入容器完整名称或容器名称前缀: " $STRING_REGEX)
# 列出所有容器(包括停止的容器),筛选出符合条件的容器
containers=$(docker ps -a --format "{{.Names}}" | grep "^${container_name}")
if [ -z "$containers" ]; then
echo "没有找到匹配的容器 ${container_name} ..."
else
for container in $containers; do
# 检查容器是否已经在运行,如果运行则先停止容器
if docker ps --format "{{.Names}}" | grep -q "^${container}$"; then
echo "停止容器 ${container}..."
docker stop ${container} &> /dev/null
fi
echo "正在重启容器 ${container}"
docker restart ${container}
done
fi
fi