fnOS Docker 容器批量更新踩坑:容器名冲突与 WatchCow 标签失效修复
背景
ZcNas 是一台装了飞牛 fnOS 的机器,插着 RX 6600,跑着 23 个 Docker 容器 —— 从 Wallos 记账到 Gitea 代码托管,从 RSSHub 到 Tiny Tiny RSS,全在 /vol1/1000/docker/ 下用 Compose 管理。每个容器都打了 WatchCow 标签,这样 fnOS 桌面能自动识别为「原生应用」,点图标就能打开。
前几天想着把镜像都更新一遍,结果踩了一串坑。
第一步:SSH 权限 —— 门都进不去
日常用的 mifsh 用户不在 docker 组里,SSH 上去连 docker ps 都跑不了:
# 在 fnOS 上以 root 执行sudo usermod -aG docker mifsh搞定。之后用 sshpass 连:
sshpass -p '***' ssh mifsh@192.168.3.166第二步:批量更新 ——23 个容器一口气
所有 compose 文件分散在 /vol1/1000/docker/ 下的子目录里,逐个 pull 再重建:
for d in wallos bilibili-sync doocs-md homer homebox donetick \ rustpad drydock vcompose rsshub linkding gitea tt-rss \ frpc karakeep; do cd "/vol1/1000/docker/$d" docker compose pull docker compose up -ddone大部分顺利,但 bili-sync-rs 报了个错:
Conflict. The container name "/bili-sync-rs" is already in use原因是这个容器是很早之前手动 docker run 起的,后来才补了 compose 文件 —— 旧容器不在 compose 管理范围内,新容器想用同一个名字就冲突了。解决方法很简单:
docker stop bili-sync-rsdocker rm bili-sync-rscd /vol1/1000/docker/bilibili-sync && docker compose up -d先停掉旧的、删掉,再让 compose 接管。
更新完 23 个容器全部健康运行,但问题才刚开始。
第三步:WatchCow 标签集体失灵
批量更新后第二天,突然发现 fnOS 桌面上少了几个应用图标。用 docker inspect 检查 labels 是好的:
docker inspect wallos --format '{{json .Config.Labels}}'# 输出包含 watchcow.enable, watchcow.display_name, watchcow.service_port但 /var/apps/ 下这些目录全没了:
watchcow.walloswatchcow.rsshubwatchcow.md-editorwatchcow.karakeepwatchcow.tt-rsswatchcow.bili-sync翻 WatchCow 日志
tail -100 /usr/local/apps/@appdata/watchcow/info.log关键线索在这里 —— 每次安装都有这条警告:
[Error] Use `--volume` to specify the volume index,or configure a default using `appcenter-cli default-volume [index]`日志随后确实显示了 Successfully installed fnOS app,但这骗了我。实际上应用装得不完整。查一下默认卷配置:
# root@ZcNas:~# appcenter-cli default-volume0 # ← 未设置!根因找到了。appcenter-cli 没有默认存储卷,于是 install 命令不知道把应用数据往哪放,只能装一半。
第四步:三连修复
1. 设默认卷
appcenter-cli default-volume 1# 验证appcenter-cli default-volume# 输出:12. 卸载残次品
之前 volume 缺失时安装的应用处于损坏状态(返回 code 10500),得卸了重来:
appcenter-cli uninstall watchcow.rsshub # 已损坏appcenter-cli uninstall watchcow.md-editor # 已损坏# watchcow.wallos 没装成功,不需要卸载3. 重启 WatchCow
kill $(cat /usr/local/apps/@appdata/watchcow/app.pid)sleep 2/usr/local/apps/@appcenter/watchcow/watchcow &WatchCow 重启后自动扫所有容器 labels,重新生成并安装应用包。这次日志干净了,没有 volume 报错。
最终结果
fnOS 桌面上 16 个应用全部回归:
| 应用 | 端口 | 容器 |
|---|---|---|
| Wallos | 8282 | wallos |
| BiliSync | 3235 | bili-sync-rs |
| RSSHub | 21200 | rsshub |
| MD 编辑器 | 36880 | md-editor |
| LinkDing | 29090 | linkding |
| Gitea | 10880 | gitea |
| Homer | 8888 | homer |
| Karakeep | 23000 | karakeep |
| HomeBox | 27745 | homebox |
| Donetick | 32021 | donetick |
| Tiny Tiny RSS | 27181 | ttrss |
| Rustpad | 43030 | rustpad |
| Drydock | 24300 | drydock |
| vcompose | 35380 | vcompose |
| ScreenCode | 25173 | screenshot-to-code |
| frpc | — | 无 Web UI |
总结
| 问题 | 根因 | 修复 |
|---|---|---|
| mifsh 无 docker 权限 | 不在 docker 组 | usermod -aG docker mifsh |
| bili-sync-rs 容器名冲突 | 旧容器未被 compose 管理 | 手动 rm 后 compose up |
| WatchCow 部分标签失效 | default-volume 未设置 | default-volume 1 + 卸载损坏应用 + 重启 WatchCow |
核心教训就一句话:fnOS 上用 WatchCow 自动发现 Docker 容器,必须先执行 appcenter-cli default-volume 1。 这步没做的话,应用安装看着成功了,实际上残废 —— 桌面图标隔天就消失。