fix:增加定时推动
This commit is contained in:
85
server/docker-entrypoint.sh
Normal file
85
server/docker-entrypoint.sh
Normal file
@@ -0,0 +1,85 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
# 容器入口:
|
||||
# - 默认只启动 API(与原 Dockerfile 行为一致)
|
||||
# - 如需测试“定时推送”,可额外启动 Celery Worker + Beat
|
||||
#
|
||||
# 环境变量:
|
||||
# - START_API=1|0(默认 1)
|
||||
# - START_WORKER=1|0(默认 0)
|
||||
# - START_BEAT=1|0(默认 0)
|
||||
# - START_ALL=1(等价于 START_WORKER=1 + START_BEAT=1)
|
||||
# - HOST / PORT(API 监听地址,默认 0.0.0.0:8000)
|
||||
|
||||
log() {
|
||||
echo "[entrypoint] $*"
|
||||
}
|
||||
|
||||
START_API="${START_API:-1}"
|
||||
START_WORKER="${START_WORKER:-0}"
|
||||
START_BEAT="${START_BEAT:-0}"
|
||||
|
||||
if [ "${START_ALL:-0}" = "1" ]; then
|
||||
START_WORKER="1"
|
||||
START_BEAT="1"
|
||||
fi
|
||||
|
||||
# Beat 只负责“投递任务到队列”,真正执行仍需要 Worker;避免误配。
|
||||
if [ "$START_BEAT" = "1" ] && [ "$START_WORKER" != "1" ]; then
|
||||
log "提示:已启用 START_BEAT=1,自动同时启用 START_WORKER=1(否则队列无人执行)。"
|
||||
START_WORKER="1"
|
||||
fi
|
||||
|
||||
PIDS=""
|
||||
|
||||
stop_children() {
|
||||
# 温和退出
|
||||
for pid in $PIDS; do
|
||||
kill -TERM "$pid" >/dev/null 2>&1 || true
|
||||
done
|
||||
}
|
||||
|
||||
on_term() {
|
||||
log "收到退出信号,正在停止子进程..."
|
||||
stop_children
|
||||
# 等待子进程退出,避免残留
|
||||
wait >/dev/null 2>&1 || true
|
||||
exit 0
|
||||
}
|
||||
|
||||
trap on_term INT TERM
|
||||
|
||||
if [ "$START_WORKER" = "1" ]; then
|
||||
log "启动 Celery Worker:celery -A app.worker:celery_app worker -l info"
|
||||
celery -A app.worker:celery_app worker -l info &
|
||||
PIDS="$PIDS $!"
|
||||
fi
|
||||
|
||||
if [ "$START_BEAT" = "1" ]; then
|
||||
log "启动 Celery Beat:celery -A app.worker:celery_app beat -l info"
|
||||
celery -A app.worker:celery_app beat -l info &
|
||||
PIDS="$PIDS $!"
|
||||
fi
|
||||
|
||||
if [ "$START_API" = "1" ]; then
|
||||
HOST="${HOST:-0.0.0.0}"
|
||||
PORT="${PORT:-8000}"
|
||||
log "启动 API:uvicorn app.main:app --host $HOST --port $PORT"
|
||||
uvicorn app.main:app --host "$HOST" --port "$PORT" &
|
||||
API_PID="$!"
|
||||
PIDS="$PIDS $API_PID"
|
||||
|
||||
# 以 API 生命周期为准:API 退出则容器退出,并清理其他进程
|
||||
wait "$API_PID"
|
||||
CODE="$?"
|
||||
log "API 已退出(code=$CODE),正在停止其他进程..."
|
||||
stop_children
|
||||
wait >/dev/null 2>&1 || true
|
||||
exit "$CODE"
|
||||
fi
|
||||
|
||||
# 未启动 API:就阻塞等待其他进程(一般用于仅跑 worker/beat 的容器)
|
||||
log "未启动 API,等待后台进程..."
|
||||
wait
|
||||
|
||||
Reference in New Issue
Block a user