让自定义 Docker 容器自动变成飞牛桌面应用 —— WatchCow 分享
这是个什么东西?
为自部署的 Docker 应用添加桌面图标
B站视频:
背景
楼主之前用 Docker 跑了一些自己的服务, 但除了官方应用商店外的 Docker 应用, 没办法在桌面生成图标, 也没办法和 FN Connect 集成
所以一直使用 homepage + traefik 的方式构建自己的导航页
楼主选择这两个软件的原因也是因为, 我非常喜欢使用 Docker Label 的方式对容器做配置, 优点很明显, 就是管理集中, 我的任何修改都直接体现在 compose 文件中, 也容易在不同的 Docker 实例之间分享, 只需要复制 compose 文件, 启动后就可以完成转发之类的各种配置, 同时 Label 是 Docker 官方的功能, 兼容性也没问题
一个多月前, 楼主在论坛发帖, 希望能有一个官方支持的集成方案, 但没有得到确定要做的消息, 所以就干脆自己搓一个
工作流程
首先, 你需要安装 watchcow 的fpk包, 你可以从 https://github.com/tf4fun/watchcow/releases/tag/v0.2.0 中下载
之后你需要在你的 docker-compose 文件, 添加一些额外的 label
比如你跑了个 Nginx:
labels:
# 启用 WatchCow 发现
watchcow.enable: "true"
# 应用标识 (对应 manifest.appname)
watchcow.appname: "watchcow.nginx"
# 显示信息 (对应 manifest 字段)
watchcow.display_name: "Nginx"
watchcow.desc: "高性能 Web 服务器"
watchcow.version: "1.0.0"
watchcow.maintainer: "WatchCow"
# 网络配置
watchcow.service_port: "8080"
watchcow.protocol: "http"
watchcow.path: "/"
# UI 配置
watchcow.ui_type: "url" # url=新标签页, iframe=桌面窗口
watchcow.icon: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/nginx.png"
容器一启动,你就能看到新的图标
实现细节
楼主之前看官方的开发者文档时, 看到官方提供的应用的模板
仔细研究之后发现并不复杂, 你完全可以将任意的应用打包为飞牛的官方应用包
所以 WatchCow 做的事情就是:
- 后台监听 Docker 的事件(哪个容器启动了、停止了、删除了)
- 发现有 watchcow.enable=true 标签的容器,就自动生成一个符合飞牛格式的应用包
- 调用 appcenter-cli install-local 把它装上
容器停了,应用也会跟着停;容器删了,应用也会自动卸载。完全不用手动操作
得到的好处是
- 简单, 将一个官方不支持的应用改为官方支持的应用, 只需要修改 compose 文件, 如果你不会修改, 直接扔给豆包或者DS也能有一个**不离十的结果, 分享应用也简单, 一个 compose 文件就可以
- 兼容, label 不会对 docker 应用产生任何的副作用, 也可以和其他的软件一起使用, 比如我前文提到的 Treafik 和 Homepage, 不管是否有这些软件, 额外的 label 也不会有任何问题, 同时使用的安装方式也是飞牛官方的模式, 只要安装包的结构不变就不会有兼容问题
其他
之前楼主其实搓了一个第一版, 当时由于不知道官方的扩展方式, 必须采用一些入侵式的手段, 常见的比如 hook 系统调用, 修改数据库, 修改前端文件之类的方案, 为了防止修改对飞牛系统本身产生影响, 楼主当时选择了一种纯内存修改的方案——ebpf, 也就是 watchcow 的 0.1 版本,通过Linux 内核提供的监听机制, 在进程之间交换数据时, 篡改请求数据, 由于是在内存中修改, 所以不会在系统中产生副作用, 但 0.1 版本有非常多的问题, 比如不支持手机端和FN Connect, 后面发现了官方的开发文档之后才有了 0.2 版本
项目地址:https://github.com/tf4fun/watchcow
有问题欢迎反馈!