Files
wechatAiclaw/run-docker.sh
2026-03-11 11:27:57 +08:00

60 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# 生产部署脚本:启动前拉取最新代码 → 构建镜像 → 停止旧容器 → 启动新容器
# 用法: ./run-docker.sh [-p PORT] [-d HOST_DATA_DIR]
# -p, --port PORT 宿主机端口,默认 3000
# -d, --data-dir DIR 数据目录挂载,默认 ./data
set -e
IMAGE_NAME="wechat-admin-backend"
CONTAINER_NAME="wechat-admin-backend"
PORT="${PORT:-3000}"
HOST_DATA_DIR="${HOST_DATA_DIR:-$(pwd)/data}"
while [[ $# -gt 0 ]]; do
case $1 in
-p|--port) PORT="$2"; shift 2 ;;
-d|--data-dir) HOST_DATA_DIR="$2"; shift 2 ;;
-h|--help) echo "Usage: $0 [-p PORT] [-d HOST_DATA_DIR]"; echo " -p, --port PORT default 3000"; echo " -d, --data-dir DIR default \$(pwd)/data"; exit 0 ;;
*) echo "Unknown option: $1 (use -h for help)"; exit 1 ;;
esac
done
# 启动前自动获取最新代码(与远端 master 一致,丢弃本地修改)
if git rev-parse --git-dir >/dev/null 2>&1; then
echo "Fetching and reset to origin/master..."
git fetch --all && git reset --hard origin/master
else
echo "Not a git repo, skip git fetch/reset."
fi
echo "Building Docker image: ${IMAGE_NAME}..."
docker build -t "${IMAGE_NAME}" .
echo "Stopping and removing existing container (if any)..."
if [ "$(docker ps -aq -f name=${CONTAINER_NAME})" ]; then
docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 || true
fi
mkdir -p "${HOST_DATA_DIR}"
echo "Data dir (host): ${HOST_DATA_DIR} -> container /app/backend/data"
ENV_FILE=".env"
if [ ! -f "${ENV_FILE}" ]; then
echo "Env file ${ENV_FILE} not found, copying from .env.example ..."
cp .env.example "${ENV_FILE}"
fi
echo "Running container ${CONTAINER_NAME} on port ${PORT}..."
docker run -d \
--name "${CONTAINER_NAME}" \
--env-file "${ENV_FILE}" \
-p "${PORT}:3000" \
-p "8000:8000" \
-v "${HOST_DATA_DIR}:/app/backend/data" \
"${IMAGE_NAME}"
echo "Container started. Data persisted on host: ${HOST_DATA_DIR}"
echo "Health check: curl http://localhost:${PORT}/health"