Files
MoviePilot/docker/update-worker.sh

57 lines
1.7 KiB
Bash

#!/bin/bash
# shellcheck shell=bash
set -u
VENV_PATH="${VENV_PATH:-/opt/venv}"
CONFIG_DIR="${CONFIG_DIR:-/config}"
export VENV_PATH CONFIG_DIR
SUPERVISOR_CONFIG="/etc/supervisor/supervisord.conf"
RESTART_REQUEST_FILE="${CONFIG_DIR}/temp/moviepilot.pending_supervisor_restart"
INSTALL_MANIFEST="${CONFIG_DIR}/temp/moviepilot-update/install.json"
function INFO() {
echo "[INFO] ${1}"
}
function ERROR() {
echo "[ERROR] ${1}" >&2
}
if [ ! -f "${INSTALL_MANIFEST}" ]; then
INFO "→ 未检测到待安装的更新清单,跳过 Docker 更新 worker。"
exit 0
fi
cd /app || exit 1
INFO "→ 开始将已下载的更新包替换到 Docker 程序目录..."
if ! "${VENV_PATH}/bin/python3" -m app.cli apply-prepared-update; then
ERROR "→ Docker 更新包替换失败,保留当前运行进程。"
exit 1
fi
# /app 可能刚刚被替换,切回稳定目录后再调用 supervisor 控制面。
if ! cd /; then
ERROR "→ 更新后无法切回稳定工作目录。"
exit 1
fi
if ! mkdir -p "$(dirname "${RESTART_REQUEST_FILE}")"; then
ERROR "→ 无法记录更新后的重启请求。"
exit 1
fi
restart_request_tmp="${RESTART_REQUEST_FILE}.tmp.$$"
if ! printf '%s\n' update > "${restart_request_tmp}" \
|| ! mv -f "${restart_request_tmp}" "${RESTART_REQUEST_FILE}"; then
rm -f "${restart_request_tmp}"
ERROR "→ 无法记录更新后的重启请求。"
exit 1
fi
INFO "→ 更新包已替换,通知 supervisor 关闭并由容器入口重新启动新代码..."
if ! /usr/bin/supervisorctl -c "${SUPERVISOR_CONFIG}" shutdown; then
ERROR "→ supervisor 关闭请求失败,更新代码已落盘,可手动重启后生效。"
exit 1
fi