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 都跑不了:

Terminal window
# 在 fnOS 上以 root 执行
sudo usermod -aG docker mifsh

搞定。之后用 sshpass 连:

Terminal window
sshpass -p '***' ssh mifsh@192.168.3.166

第二步:批量更新 ——23 个容器一口气

所有 compose 文件分散在 /vol1/1000/docker/ 下的子目录里,逐个 pull 再重建:

Terminal window
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 -d
done

大部分顺利,但 bili-sync-rs 报了个错:

Conflict. The container name "/bili-sync-rs" is already in use

原因是这个容器是很早之前手动 docker run 起的,后来才补了 compose 文件 —— 旧容器不在 compose 管理范围内,新容器想用同一个名字就冲突了。解决方法很简单:

Terminal window
docker stop bili-sync-rs
docker rm bili-sync-rs
cd /vol1/1000/docker/bilibili-sync && docker compose up -d

先停掉旧的、删掉,再让 compose 接管。

更新完 23 个容器全部健康运行,但问题才刚开始。

第三步:WatchCow 标签集体失灵

批量更新后第二天,突然发现 fnOS 桌面上少了几个应用图标。用 docker inspect 检查 labels 是好的:

Terminal window
docker inspect wallos --format '{{json .Config.Labels}}'
# 输出包含 watchcow.enable, watchcow.display_name, watchcow.service_port

/var/apps/ 下这些目录全没了:

watchcow.wallos
watchcow.rsshub
watchcow.md-editor
watchcow.karakeep
watchcow.tt-rss
watchcow.bili-sync

翻 WatchCow 日志

Terminal window
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,但这骗了我。实际上应用装得不完整。查一下默认卷配置:

Terminal window
# root@ZcNas:~# appcenter-cli default-volume
0 # ← 未设置!

根因找到了。appcenter-cli 没有默认存储卷,于是 install 命令不知道把应用数据往哪放,只能装一半。

第四步:三连修复

1. 设默认卷

Terminal window
appcenter-cli default-volume 1
# 验证
appcenter-cli default-volume
# 输出:1

2. 卸载残次品

之前 volume 缺失时安装的应用处于损坏状态(返回 code 10500),得卸了重来:

Terminal window
appcenter-cli uninstall watchcow.rsshub # 已损坏
appcenter-cli uninstall watchcow.md-editor # 已损坏
# watchcow.wallos 没装成功,不需要卸载

3. 重启 WatchCow

Terminal window
kill $(cat /usr/local/apps/@appdata/watchcow/app.pid)
sleep 2
/usr/local/apps/@appcenter/watchcow/watchcow &

WatchCow 重启后自动扫所有容器 labels,重新生成并安装应用包。这次日志干净了,没有 volume 报错。

最终结果

fnOS 桌面上 16 个应用全部回归:

应用端口容器
Wallos8282wallos
BiliSync3235bili-sync-rs
RSSHub21200rsshub
MD 编辑器36880md-editor
LinkDing29090linkding
Gitea10880gitea
Homer8888homer
Karakeep23000karakeep
HomeBox27745homebox
Donetick32021donetick
Tiny Tiny RSS27181ttrss
Rustpad43030rustpad
Drydock24300drydock
vcompose35380vcompose
ScreenCode25173screenshot-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 这步没做的话,应用安装看着成功了,实际上残废 —— 桌面图标隔天就消失。