#!/bin/bash # 定义变量 IMAGE_NAME="hub.zentao.net/app/zendas:3.0" CONTAINER_NAME="zendas" BASE_PORT=8080 MAX_PORT_ATTEMPTS=20 # 最大尝试端口数 LICENSE_FILE="zendas_license.zip" TEMP_DIR="zendas_license_temp" # 打印带时间戳的信息 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" } # 检查 Docker 是否运行 check_docker() { if ! docker info >/dev/null 2>&1; then log "错误: Docker 服务未运行,请先启动 Docker Desktop" exit 1 fi log "Docker 已启动" } # 检查镜像是否存在,不存在则拉取 check_image() { if ! docker image inspect "$IMAGE_NAME" >/dev/null 2>&1; then log "镜像 $IMAGE_NAME 不存在,开始拉取..." if docker pull "$IMAGE_NAME"; then log "镜像拉取成功" else log "错误: 镜像拉取失败" exit 1 fi else log "镜像已存在,跳过拉取" fi } # 检查端口是否可用 find_available_port() { local port=$BASE_PORT local attempts=0 while [ $attempts -lt $MAX_PORT_ATTEMPTS ]; do if ! lsof -i :$port >/dev/null 2>&1; then echo $port return 0 fi log "端口 $port 被占用,尝试下一个端口" ((port++)) ((attempts++)) done log "错误: 在 $BASE_PORT 到 $((BASE_PORT + MAX_PORT_ATTEMPTS - 1)) 范围内未找到可用端口" exit 1 } # 检查容器是否存在 check_container() { if docker ps -a --format '{{.Names}}' | grep -q "^$CONTAINER_NAME$"; then log "容器 $CONTAINER_NAME 已存在" if docker ps --format '{{.Names}}' | grep -q "^$CONTAINER_NAME$"; then log "容器已在运行中" CONTAINER_PORT=$(docker inspect --format='{{(index (index .NetworkSettings.Ports "80/tcp") 0).HostPort}}' "$CONTAINER_NAME") log "访问地址: http://localhost:$CONTAINER_PORT" handle_license_file && copy_license_to_running_container exit 0 else log "启动已存在的容器..." if docker start "$CONTAINER_NAME"; then CONTAINER_PORT=$(docker inspect --format='{{(index (index .NetworkSettings.Ports "80/tcp") 0).HostPort}}' "$CONTAINER_NAME") log "容器启动成功" log "访问地址: http://localhost:$CONTAINER_PORT" handle_license_file && copy_license_to_running_container exit 0 else log "错误: 容器启动失败" exit 1 fi fi fi } # 检查并处理授权文件 handle_license_file() { if [ -f "$LICENSE_FILE" ]; then log "检测到授权文件 $LICENSE_FILE" # 创建临时目录 mkdir -p "$TEMP_DIR" # 解压授权文件 if unzip -o "$LICENSE_FILE" -d "$TEMP_DIR" >/dev/null 2>&1; then log "授权文件解压成功" return 0 else log "错误: 授权文件解压失败" rm -rf "$TEMP_DIR" return 1 fi else IDETIFICATION=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{.MacAddress}}{{end}}' zendas) log "未检测到授权文件 $LICENSE_FILE, 跳过授权替换" log "请联系zendas商务获取授权文件,设备标识:$IDETIFICATION" log "----------------------" log "| 姓名:李木 |" log "| 电话:18562583552 |" log "| 微信:18562583552 |" log "----------------------" return 1 fi } # 复制授权文件到运行中的容器 copy_license_to_running_container() { if [ -d "$TEMP_DIR" ]; then log "开始复制授权文件到容器..." # 检查容器是否正在运行 if ! docker ps --format '{{.Names}}' | grep -q "^$CONTAINER_NAME$"; then log "错误: 容器未运行,无法复制授权文件" return 1 fi # 复制文件到容器 if docker cp "$TEMP_DIR/." "$CONTAINER_NAME:/opt/zbox/app/"; then log "授权文件复制成功" # 清理临时目录 rm -rf "$TEMP_DIR" else log "错误: 授权文件复制失败" return 1 fi fi } # 运行新容器 run_container() { local port=$1 log "尝试在端口 $port 上启动容器..." if docker run -d -p $port:80 --name "$CONTAINER_NAME" "$IMAGE_NAME"; then log "容器启动成功" log "访问地址: http://localhost:$port" # 如果存在授权文件,复制到容器 handle_license_file && copy_license_to_running_container else log "错误: 容器启动失败" exit 1 fi } # 主流程 log "===== 开始执行脚本 =====" check_docker check_image check_container AVAILABLE_PORT=$(find_available_port) handle_license_file # 提前处理授权文件,解压到临时目录 run_container "$AVAILABLE_PORT" log "===== 脚本执行完成 ====="