必须用--restart=unless-stopped,否则nas重启后容器彻底消失;-d后台运行、禁用-it;-v挂载与-w设工作目录必须配对;镜像选python:3.11-slim;定时任务用supercronic或while循环;日志写入挂载目录确保故障留痕。

必须用 --restart=unless-stopped,否则 NAS 重启后容器彻底消失,爬虫就断了——这不是“偶尔掉线”,而是“一断就死”。
容器启动不能用 -it,得靠 -d + 自动恢复策略
交互式启动(docker run -it)会绑定终端 stdin/stdout,SSH 断开或 DSM 网页终端关闭,容器立刻退出。群晖没人守着终端,爬虫必须脱离交互环境自维持:
-
-d启动后台常驻,不加-it - 必须带
--restart=unless-stopped,NAS 断电、DSM 升级、重装后自动拉起 - 别用
--restart=always:它会掩盖启动失败(比如脚本报错退出后又无限重启,你根本看不到日志) - 验证是否生效:
docker inspect mycrawler | grep -i restart,输出里得有"unless-stopped"
-v 和 -w 必须配对,否则 open("config.json") 直接报错
爬虫脚本里写相对路径读配置或写日志,但容器内路径和宿主机不一致,是最常见的 FileNotFoundError 根源:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
-
-v /volume1/docker/crawler:/app把 NAS 上目录挂进容器 -
-w /app显式设工作目录,让python crawler.py的当前路径就是/app - 所有文件——
crawler.py、config.json、logs/、output/——都放在这同一个挂载点下 - 别在容器里写
cd /volume1/scripts && python x.py:容器根本没有/volume1/scripts这个路径 - 挂载后进容器执行
ls -l /app,确认能看到你的脚本和配置文件
镜像选 python:3.11-slim,别碰 latest 或 python:3
python:3 是模糊标签,Docker Hub 会悄悄更新底层小版本,2026 年已有多起因 zoneinfo 或 httpx 兼容问题导致爬虫崩溃的案例;latest 更被官方标记为“不推荐用于生产”:
-
python:3.11-slim固定小版本,基础层更小、启动更快、攻击面更少 -
--slim版本不含gcc、make,但绝大多数纯 Python 爬虫依赖(requests、beautifulsoup4、lxml)完全够用 - 真需要编译(如
pydantic-core),改用python:3.11-bookworm并在Dockerfile中装build-essential - 避免用
python:3.14这类未长期维护的新版,3.11 是当前最稳的 LTS 小版本
定时任务别靠 DSM 任务计划直接调 python3,用容器内守护进程
DSM 的“用户定义脚本”本质是每分钟拉一次 shell,容易和容器进程冲突,且无法感知 Python 异常退出;docker exec -it 在非交互环境下还会卡住:
- 在容器里用
supercronic(轻量 cron 替代):一行配置就能按 crontab 格式跑脚本,无依赖、易调试 - 简单轮询可用
while true; do python crawler.py || true; sleep 3600; done,|| true防止某次失败导致整个循环退出 - DSM 任务计划只作触发器:比如发
docker kill -s SIGUSR1 mycrawler唤醒已驻留的主进程 - 所有日志必须写到挂载目录(如
/app/logs/crawler.log),否则容器重启后 Traceback 永远丢失
真正难的不是让脚本跑起来,而是让它在断电、升级、磁盘满、DNS 临时失效这些真实故障下还能自己扛住、留痕、恢复——所有配置都得围绕“无人值守”这个前提来压测和验证。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










