diff --git a/docs/guide/examples/linux-deps.md b/docs/guide/examples/linux-deps.md index e469c66..04425f0 100644 --- a/docs/guide/examples/linux-deps.md +++ b/docs/guide/examples/linux-deps.md @@ -6,7 +6,7 @@ baihu-panel通常以 Docker 容器的形式运行。Docker 的文件系统具有以下特性: - **挂载目录(持久化)**:像 `data/` 这样的目录被映射到了宿主机,其中的数据(如脚本、日志、配置文件)在重启或升级镜像时会保留。 -- **容器层(非持久化)**:容器自身的系统目录(如 `/usr/bin`, `/lib`, `/etc`)是临时层。如果您直接在终端里执行 `apt-get install xxx`,虽然当下可以立即使用,**但在面板重启、重建或更新镜像后,这些刚安装的系统包就会全部丢失。** +- **容器层(非持久化)**:容器自身的系统目录(如 `/usr/bin`, `/lib`, `/etc`)是临时层。如果您直接在终端里手动执行 `apt-get install xxx`,虽然当下可以立即使用,**但在容器被销毁重建或更新镜像后,这些刚安装的系统包就会全部丢失。**(注意:仅仅是普通的 `docker restart` 重启容器并不会丢失,只有重建容器时才会重置) ## 核心解决思路 @@ -49,6 +49,32 @@ apt-get update apt-get install -y build-essential python3-dev ``` +**示例 3:带 Hash 检查的高阶依赖安装脚本(推荐)** +此脚本利用 `/tmp` 目录和脚本自身内容的哈希值,完美匹配 Docker 容器的生命周期,避免在普通重启时无意义地检测。 +```bash +#!/bin/bash +set -e + +# 生成当前脚本的哈希标识 +SCRIPT_HASH=$(md5sum "$0" | awk '{print $1}') +FLAG_FILE="/tmp/deps_installed_${SCRIPT_HASH}" + +# 如果标识文件存在,说明在此容器生命周期内已安装过,且脚本未被修改,直接退出 +if [ -f "$FLAG_FILE" ]; then + echo "系统依赖已就绪,跳过安装。" + exit 0 +fi + +echo "开始安装系统环境依赖..." +apt-get update +# 假设您需要安装 ffmpeg 和 imagemagick +apt-get install -y ffmpeg imagemagick + +# 安装成功后写入标识文件 +touch "$FLAG_FILE" +echo "系统依赖安装完成!" +``` + ### 第二步:配置开机触发任务 脚本编写并保存到面板后,接下来只需将其配置为开机任务: @@ -79,6 +105,7 @@ apt-get install -y build-essential python3-dev ## 💡 注意事项与进阶建议 -1. **幂等性 (Idempotency)**:开机脚本在每次重启时都会执行。像 `apt-get install -y` 这种命令天然是幂等的(如果已安装就不会重新下载),但这可能会轻微拖慢面板开机速度。您可以在脚本中先用 `dpkg -l <包名>` 或 `command -v <命令>` 判断依赖是否存在,不存在时再执行安装。 +1. **幂等性 (Idempotency)**:开机脚本在每次重启时都会在后台异步执行。像 `apt-get install -y` 这种命令天然是幂等的(如果已安装就不会重新下载),虽然它不会阻塞面板的启动速度,但每次无意义地检查和刷新软件源仍会白白占用开机初期的系统资源。建议您在脚本中先用 `dpkg -l <包名>` 或 `command -v <命令>` 判断依赖是否存在,不存在时再执行安装。 + - **进阶技巧**:您也可以在依赖安装完成后,向 `/tmp` 目录下写入一个带有当前脚本内容 Hash 值的标识文件(例如 `touch /tmp/deps_installed_$(md5sum "$0" | awk '{print $1}')`)。在脚本开头判断该文件是否存在,若存在则直接退出。由于容器被销毁重建时 `/tmp` 目录和您安装的系统依赖会一并丢失,而在普通的重启中它们又会一并保留,这种方式完美契合了容器的临时层生命周期,能避免反复执行依赖检测逻辑,进一步加速开机任务。 2. **网络环境**: Docker 镜像已经**默认将 APT 源替换为了清华源 (TUNA)**,因此在国内网络下执行 `apt-get` 也能获得很快的下载速度,您通常不需要在脚本中再次手动替换源。 3. **避免冲突**:请仅安装您脚本运行强依赖的底层库,尽量不要通过 `apt` 安装 Node.js 或 Python 的运行环境,这些高级语言环境应交由面板的 **「编程语言」** (Mise) 模块统一管理。