日志说文件生成成功,下一行说上传失败
日志里有两行挨着的话。前一行:
文件已生成: /tmp/astrbot_jmdownloader/xxx.pdf
后一行:
QQ 文件上传失败
retcode=1200 / 识别URL失败
生成成功、上传失败。这两句放一起其实已经把答案给出来了——问题不在"有没有生成",而在"发文件的那一方能不能拿到它"。我花了很久才想到这一层,前面一直在怀疑下载器和 QQ 接口。
这套东西里有两个容器:AstrBot 负责干活、生成文件;NapCat 负责发 QQ 消息、读文件。它们的挂载完全是两套:
| 宿主机上的目录 | AstrBot 容器里看到 | NapCat 容器里看到 |
|---|---|---|
/root/astrbot/data |
/AStrBot/data |
/root/astrbot/data |
| —— | /tmp(容器私有) |
不存在 |
所以有两个问题叠在一起。
第一,PDF 生成在 AstrBot 容器的 /tmp 里。容器私有的临时目录,宿主机都看不到,NapCat 更不可能看到。
第二,就算把文件放进 data 目录,两个容器对同一个目录的内部路径也不一样:AstrBot 看到的是 /AStrBot/data,NapCat 看到的是 /root/astrbot/data。NapCat 按自己那套路径去找,一样是空。
文件没丢,是两边对"文件在哪"的说法不一致。
修法是给 NapCat 也挂上同一个目录,在 compose 里加一行:
napcat:
volumes:
- ./data:/root/astrbot/data
- ./data/jmdownloader:/AStrBot/data/jmdownloader
最后那行是关键:让同一个目录在两边都能被同一串路径命中。
临时救急可以用软链,在 NapCat 容器里:
ln -s /root/astrbot/data/jmdownloader /AStrBot/data/jmdownloader
治本是改插件的输出目录,让它别写 /tmp、直接写共享卷。但插件升级会把源码覆盖,改的东西全丢,长期不靠谱。我最后用的是"输出到共享卷 + 两边内部路径对齐"。
这事我前后踩了三次,第三次才彻底想明白:下载器、日报、还有表情包上传,都是同一类。
日报当时的报错是:
资源文件不存在: /AStrBot/data/plugins/.../res/image/anime1.jpg
路径不一致的老毛病。我顺手把渲染倍率从 5 降到 3,图小一点、快一点,出图失败的概率也跟着降了。
现在只要看到"文件已生成但发送失败",我的第一反应是进两个容器各 ls 一下那个路径。日志里那个路径是"真的",只是它是另一个容器的坐标。