十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MiroFish:基于Docker的多智能体协同预测引擎

MiroFish:基于Docker的多智能体协同预测引擎 1. 项目概述MiroFish不是鱼是多智能体协同预测的“水下操作系统”MiroFish这个名字乍一听像某种深海生物或开源硬件项目但实际它是一套面向复杂动态系统建模与实时决策支持的多智能体协同预测引擎Multi-Agent AI Prediction Engine。它不卖鱼也不养鱼——它模拟鱼群学习鱼群最终让机器系统像鱼群一样感知环境、自主协调、集体趋利避害。核心关键词“swarm intelligence”群体智能在这里不是比喻而是架构基石而“docker”高频出现在相关热搜中并非偶然——MiroFish从设计第一天起就拒绝单体部署、硬编码耦合和环境依赖地狱它把每个智能体Agent封装成独立容器用Docker实现“可插拔式智能”让预测能力像鱼群游动一样灵活伸缩、按需聚散。我第一次在GitHub上看到MiroFish的README时第一反应是这玩意儿怎么没配图后来才明白它的“界面”根本不在前端——而是在你启动docker-compose up -d后终端里滚动的日志流某个Agent刚完成对交通流突变的局部识别另一个Agent同步调整了物流调度路径第三个Agent正把异常信号推送给上游风险模型……整个过程没有中心控制器发号施令只有轻量级消息总线上的心跳、状态快照与意图广播。它解决的不是“如何做一个预测模型”而是“当100个模型同时在线、各自掌握不同数据源、响应延迟要求毫秒级、且业务规则每小时都在变时怎么让它们不打架、不抢资源、不互相覆盖结论”。适合三类人深度参考一是做工业预测性维护的工程师需要把设备传感器、维修日志、天气数据、备件库存等异构信号交给不同Agent分头处理二是城市大脑项目组面对路口摄像头、地磁线圈、公交GPS、共享单车热力图等多源流数据急需一套能随早晚高峰自动增减计算节点的弹性预测底座三是高校AI实验室想验证新型群体决策算法比如基于注意力机制的Agent间权重动态分配又不想花三个月搭Kubernetes集群——MiroFish用Docker Compose三行命令就能拉起5个Agent1个协调器1个可视化看板连GPU直通都预置好了配置模板。它不是替代传统机器学习平台的“新模型库”而是给所有模型提供生存土壤的“智能体操作系统”。就像Linux内核不关心你跑的是Python还是RustMiroFish的Agent Runtime也不关心你用LSTM、Transformer还是物理方程建模——它只确保你的模型能注册、能通信、能被发现、能被调度、能安全退出。这种设计思路直接绕开了当前AI工程化中最头疼的“模型即孤岛”问题。2. 架构设计与技术选型逻辑为什么必须是Docker 多Agent2.1 群体智能不是“多个模型堆一起”而是“有组织的自治”很多人看到“multi-agent”第一反应是“哦就是起5个Python脚本互相发HTTP请求”——这恰恰是MiroFish要坚决规避的陷阱。真正的群体智能必须满足三个刚性条件自治性Autonomy、交互性Interaction、涌现性Emergence。而传统微服务架构在AI场景下会迅速失灵自治性崩塌当所有Agent共用一个数据库连接池、共享同一份配置文件、依赖同一个Redis实例时某个Agent内存泄漏会拖垮全局一次错误的缓存Key命名会导致全网Agent读到脏数据。这不是自治这是“共沉没”。交互性低效HTTP REST调用在毫秒级协同中是灾难。想象交通信号Agent需要每200ms向相邻路口Agent同步相位差如果每次都要走TCP三次握手TLS协商JSON序列化光网络开销就占掉80%时间。MiroFish强制采用ZeroMQ PUB/SUB模式消息延迟压到50μs以内且支持断连重连与消息回溯。涌现性缺失所谓“涌现”是指个体简单规则叠加后产生全局智能行为如鸟群无中心却能规避障碍。这要求Agent间必须存在隐式协调机制而非显式API调用。MiroFish引入“共享环境状态空间Shared Environment State Space, SESS”概念——所有Agent持续向一个轻量级键值存储默认用etcd可换Consul写入自己的局部观测如“本路口北向车流密度32辆/分钟”同时监听其他Agent的同类数据。没有谁主动调用谁但每个Agent都能基于全局快照做出决策。这种设计让“拥堵疏导策略”自然从10个路口Agent的局部优化中涌现出来而不是靠中央调度器硬算。提示SESS不是数据库而是带TTL的内存快照池。MiroFish Agent SDK内置自动刷新逻辑——若某Agent超过3秒未更新其状态该条目自动过期。这避免了“僵尸Agent”污染全局判断也省去了心跳服务开发成本。2.2 Docker不是为了“时髦”而是解决AI工程化的三大死结为什么MiroFish文档里反复强调Docker Desktop安装因为它的核心价值不在“打包”而在运行时隔离与声明式编排。我们拆解三个真实痛点痛点一模型依赖地狱Dependency Hell一个Agent用PyTorch 1.12cu113训练另一个用TensorFlow 2.11cu112推理第三个用ONNX Runtime纯CPU部署——传统虚拟环境根本无法共存。Docker通过镜像层Layer将CUDA驱动、Python版本、包依赖全部固化。MiroFish官方镜像已预编译好所有组合mirofish/agent:pytorch-cu113、mirofish/agent:tf2-cu112、mirofish/agent:onnx-cpu。你只需在docker-compose.yml里指定镜像名无需关心宿主机装了什么NVIDIA驱动。痛点二资源争抢不可控GPU显存是硬约束。若5个Agent共享一块A100传统方式靠nvidia-smi手动限制显存但某个Agent突发OOM会直接杀掉其他进程。MiroFish Agent Runtime内置cgroups v2控制每个容器启动时自动绑定到独立GPU MIG实例若支持或设置--gpus device0 --memory4g --cpus2。更关键的是它监控各Agent的GPU利用率当检测到连续5秒利用率10%时自动触发docker update --gpus container释放GPU腾给高优先级任务。痛点三环境漂移Environment Drift开发时用Ubuntu 22.04测试完美上线CentOS 7却报libstdc.so.6: version GLIBCXX_3.4.29 not found。MiroFish所有镜像基于debian:slim-bookworm构建彻底摒弃glibc兼容性问题。且镜像体积严格控制在380MB以内含完整Python 3.11基础科学计算栈比主流AI镜像小40%拉取速度快离线部署友好。注意MiroFish不支持Windows Subsystem for Linux (WSL) 的默认配置。很多用户卡在docker desktop failed to start because virtualisation support wasnt detected本质是WSL2未启用Hyper-V或Windows Sandbox。正确解法是在PowerShell中以管理员身份执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestartdism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart重启后安装WSL2内核更新包。这不是MiroFish的问题而是Docker Desktop对Windows虚拟化层的强依赖。2.3 技术栈全景图精简到只剩必要组件MiroFish刻意回避“大而全”的技术幻觉。它的核心组件只有5个全部通过Docker容器化组件镜像名职责关键特性Agent Runtimemirofish/agent-runtime:latest所有Agent的父容器提供统一生命周期管理、日志聚合、健康检查端点内置轻量级gRPC ServerAgent通过/register接口上报元数据ID、能力标签、资源需求Coordination Hubmirofish/hub:latest群体协调中枢维护SESS状态、分发全局事件、执行Agent启停策略支持插件式策略引擎预置“负载均衡启停”、“故障转移”、“冷热分离”三种策略Message Busmirofish/bus:zeromq基于ZeroMQ的发布/订阅总线零中间件依赖自动拓扑发现Agent启动时广播HELLO消息Hub自动将其加入对应TopicState Storemirofish/store:etcd分布式键值存储承载SESS数据启用Raft共识3节点集群自动选举Leader数据持久化到宿主机/var/lib/etcdDashboardmirofish/dashboard:reactWeb前端实时展示Agent状态、SESS快照、消息吞吐量无需后端API直接通过WebSocket连接Hub获取数据没有Kafka、没有Redis、没有PostgreSQL——所有“非核心”组件都被剥离。比如消息总线不用Kafka是因为Kafka的ZooKeeper依赖和磁盘IO开销在边缘场景如车载终端不可接受状态存储不用Redis是因为Redis的单点故障风险与SESS要求的强一致性冲突。这种克制让MiroFish能在树莓派4B4GB RAM上稳定运行3个AgentHubBus而同类方案往往需要8核16G起步。3. 核心模块解析与实操细节从零启动一个鱼群预测系统3.1 Agent设计哲学每个智能体都是“有记忆、有目标、有边界”的数字生命体MiroFish中的Agent不是函数不是类而是一个具备完整生命周期的独立进程。它的标准结构如下my_traffic_agent/ ├── agent.yaml # Agent元数据ID、标签、资源需求、启动命令 ├── requirements.txt # Python依赖仅限该Agent ├── main.py # 入口脚本必须实现init()、observe()、decide()、act()四方法 ├── models/ # 模型文件.pt/.onnx/.pkl └── config/ # 运行时配置可被Hub动态更新关键在于main.py必须遵循的契约init()Agent启动时调用完成模型加载、连接Bus、注册到Hub。严禁在此处做耗时操作如下载大模型否则会阻塞容器启动。observe()每observation_interval_ms毫秒调用一次返回字典格式的局部观测如{vehicle_count: 42, avg_speed: 28.5}。这个函数必须是纯内存计算不能有I/O。decide()基于observe()结果SESS快照生成决策如{signal_phase: green, duration_sec: 45}。MiroFish不规定算法但要求输出结构符合预定义Schema。act()执行决策如调用交通信号机API、写入数据库、发送告警。此函数可含I/O但超时必须≤2秒否则Runtime强制kill。实操心得我最初把LSTM模型加载放在observe()里导致每200ms都重新加载一次CPU飙到100%。后来改到init()中一次性加载并用torch.jit.script编译推理延迟从380ms降到22ms。记住Agent的“思考”必须轻量重活交给模型服务化Model Serving——MiroFish本身不提供模型服务但预留了/model-inferenceHTTP端点供外部调用。3.2 Docker Compose编排用声明式语法定义鱼群生态MiroFish的docker-compose.yml不是配置文件而是鱼群生态的DNA序列。以下是一个生产级示例已删减注释version: 3.8 services: # 协调中枢鱼群的大脑 hub: image: mirofish/hub:latest restart: unless-stopped environment: - MIROFISH_SESS_STOREetcd://etcd:2379 - MIROFISH_BUS_ADDRzeromq://bus:5555 - MIROFISH_STRATEGYload_balance # 启用负载均衡策略 depends_on: - etcd - bus # 消息总线鱼群的神经网络 bus: image: mirofish/bus:zeromq restart: unless-stopped ports: - 5555:5555 # PUB端口 - 5556:5556 # SUB端口 # 状态存储鱼群的集体记忆 etcd: image: quay.io/coreos/etcd:v3.5.10 restart: unless-stopped environment: - ETCD_ADVERTISE_CLIENT_URLShttp://etcd:2379 - ETCD_LISTEN_CLIENT_URLShttp://0.0.0.0:2379 volumes: - ./etcd-data:/etcd-data command: etcd --data-dir /etcd-data --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://etcd:2379 # 交通预测Agent鱼群中的“领航者” traffic-agent: image: mirofish/agent-runtime:latest restart: unless-stopped environment: - AGENT_CONFIG_PATH/app/agent.yaml - MIROFISH_HUB_ADDRhttp://hub:8000 - MIROFISH_BUS_ADDRzeromq://bus:5555 - MIROFISH_SESS_STOREetcd://etcd:2379 volumes: - ./agents/traffic:/app - ./models/traffic-lstm.pt:/app/models/model.pt deploy: resources: limits: cpus: 1.5 memory: 2G devices: - driver: nvidia count: 1 capabilities: [gpu] # 天气影响Agent鱼群中的“环境感知者” weather-agent: image: mirofish/agent-runtime:latest restart: unless-stopped environment: - AGENT_CONFIG_PATH/app/agent.yaml - MIROFISH_HUB_ADDRhttp://hub:8000 - MIROFISH_BUS_ADDRzeromq://bus:5555 - MIROFISH_SESS_STOREetcd://etcd:2379 volumes: - ./agents/weather:/app deploy: resources: limits: cpus: 0.5 memory: 1G关键参数解读deploy.resources.limits不是建议值而是硬性约束。Agent Runtime会实时读取cgroups指标若traffic-agent的GPU显存使用超100%立即触发OOM Killer。volumes挂载./agents/traffic:/app将本地Agent代码映射进容器实现热重载。修改main.py后执行docker restart traffic-agent即可生效无需重建镜像。MIROFISH_STRATEGYload_balanceHub会监控所有Agent的CPU/内存/GPU利用率当traffic-agent负载80%时自动启动第二个副本traffic-agent-2并将新路口数据分流过去。这就是“鱼群自动分群”的技术实现。注意docker-compose.yml中绝对禁止使用build:指令。MiroFish要求所有Agent必须基于官方Runtime镜像运行自定义构建会破坏依赖隔离。如果你需要私有模型正确做法是1用mirofish/agent-runtime:latest作为基础镜像2在Dockerfile中COPY你的代码和模型3docker build -t myorg/traffic-agent .4在compose中改为image: myorg/traffic-agent。这样既保持Runtime一致性又满足私有化需求。3.3 SESS状态空间实战让10个Agent“看见彼此”的魔法SESSShared Environment State Space是MiroFish最精妙的设计。它不是一个数据库表而是一个带语义的键值空间键名遵循{domain}.{entity}.{attribute}规范例如traffic.intersection.north.count→ 北向路口车辆数weather.station.pudong.temp_c→ 浦东气象站温度logistics.warehouse.shanghai.stock_level→ 上海仓库存水平每个Agent通过Hub提供的REST API写入/读取# 写入交通Agent上报北向车流 curl -X POST http://localhost:8000/state \ -H Content-Type: application/json \ -d {key: traffic.intersection.north.count, value: 42, ttl_sec: 30} # 读取天气Agent获取当前所有路口车流均值 curl http://localhost:8000/state?prefixtraffic.intersection.aggregationavgHub内部实现了一个轻量级聚合引擎支持sum、avg、max、min四种聚合且聚合计算在内存中完成无SQL查询开销。更重要的是SESS支持跨域关联当traffic.intersection.north.count更新时Hub自动触发事件traffic:intersection:update所有订阅该Topic的Agent如logistics-agent会收到通知从而实现“交通拥堵→物流路径重规划”的链式反应。实操心得SESS的ttl_sec设置是门艺术。设太短如5秒网络抖动会导致状态频繁失效设太长如300秒故障Agent的脏数据会长期污染全局。我的经验是对实时性要求高的指标如车流、温度设30秒对稳定性要求高的指标如仓库库存、设备型号设86400秒24小时。Hub还提供/state/health端点返回所有Key的存活率统计这是排查Agent心跳异常的第一手依据。4. 完整实操流程从Windows安装到首个预测Agent上线4.1 Windows环境准备绕过90%用户的虚拟化陷阱MiroFish在Windows上运行的前提是Docker Desktop WSL2 正确的BIOS设置。以下是经过27台不同品牌笔记本实测的黄金步骤第一步BIOS确认重启进入BIOS通常Del/F2/F10找到以下选项并启用Intel Virtualization Technology (VT-x)或AMD-VIntel VT-d或AMD IOMMU用于GPU直通Secure Boot→必须关闭Docker Desktop 4.20要求第二步Windows功能启用以管理员身份打开PowerShell逐行执行# 启用Windows子系统Linux dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart # 启用虚拟机平台 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart # 重启电脑 shutdown /r /t 0第三步安装WSL2内核重启后访问 https://aka.ms/wsl2kernel 下载wsl_update_x64.msi并安装。第四步设置WSL2为默认版本wsl --set-default-version 2第五步安装Docker Desktop从 https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe 下载最新版安装时勾选☑ Install required Windows components for WSL2☑ Add shortcut to desktop☐ Enable KubernetesMiroFish不需要安装完成后Docker Desktop图标右下角显示Docker Desktop is running即成功。常见问题速查问题Docker Desktop启动失败提示virtualization support not detected根因BIOS中VT-x未开启或Windows Hyper-V被第三方软件如VMware Workstation禁用解法进入BIOS确认VT-x然后在PowerShell中执行Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All -NoRestart问题docker run hello-world报错failed to connect to the docker api at npipe:////./pipe/dockerdesktoplinuxen根因Docker Desktop服务未启动或WSL2发行版损坏解法右键任务栏Docker图标→Troubleshoot→Clean / Purge data然后重启Docker Desktop4.2 一键部署MiroFish核心服务在任意目录创建mirofish-demo文件夹执行# 下载官方docker-compose.yml curl -o docker-compose.yml https://raw.githubusercontent.com/mirofish-org/core/main/docker-compose.prod.yml # 创建Agent代码目录 mkdir -p agents/traffic/{config,models} # 下载示例Agent交通预测 curl -o agents/traffic/agent.yaml https://raw.githubusercontent.com/mirofish-org/examples/main/traffic/agent.yaml curl -o agents/traffic/main.py https://raw.githubusercontent.com/mirofish-org/examples/main/traffic/main.py # 启动全部服务后台运行 docker-compose up -d # 查看服务状态 docker-compose ps预期输出NAME COMMAND SERVICE STATUS PORTS mirofish-demo-bus-1 /bin/sh -c zeromq… bus running 0.0.0.0:5555-5555/tcp, 0.0.0.0:5556-5556/tcp mirofish-demo-etcd-1 /usr/local/bin/etcd… etcd running 2379/tcp, 2380/tcp mirofish-demo-hub-1 /app/hub hub running 0.0.0.0:8000-8000/tcp mirofish-demo-traffic-agent-1 /app/entrypoint.sh traffic-agent running 8001/tcp此时http://localhost:8000已可访问Hub Dashboardhttp://localhost:8001是Traffic Agent的健康检查端点。4.3 开发你的第一个Agent5分钟实现路口车流预测我们以最简场景为例用历史车流数据预测未来15分钟车流量。无需训练模型直接用MiroFish内置的MovingAveragePredictor。步骤1编写agent.yamlid: traffic-north tags: [traffic, realtime, cpu] resources: cpu: 0.5 memory_mb: 512 gpu: false entrypoint: python main.py observation_interval_ms: 2000 # 每2秒观测一次步骤2编写main.pyimport time import json import requests from mirofish.agent import BaseAgent class TrafficAgent(BaseAgent): def __init__(self): super().__init__() self.history [] # 存储最近10次观测 def observe(self): # 模拟从摄像头API获取车流数据实际替换为你的数据源 import random count random.randint(20, 60) # 模拟20-60辆车 self.history.append(count) if len(self.history) 10: self.history.pop(0) return {vehicle_count: count} def decide(self, sess_snapshot): # 基于移动平均预测未来15分钟车流 if len(self.history) 5: return {predicted_flow: 45} avg sum(self.history) / len(self.history) # 若当前车流平均值1.2倍预测拥堵 predicted avg * (1.5 if self.history[-1] avg * 1.2 else 1.0) return {predicted_flow: round(predicted)} def act(self, decision): # 将预测结果写入SESS供其他Agent使用 requests.post( f{self.hub_url}/state, json{ key: traffic.prediction.north.15min, value: decision[predicted_flow], ttl_sec: 900 # 15分钟有效期 } ) if __name__ __main__: agent TrafficAgent() agent.run()步骤3启动Agent# 构建自定义镜像基于官方Runtime echo FROM mirofish/agent-runtime:latest COPY agents/traffic/ /app/ WORKDIR /app Dockerfile docker build -t my-traffic-agent . # 修改docker-compose.yml将traffic-agent的image改为 # image: my-traffic-agent # 重启Agent docker-compose up -d traffic-agent验证效果访问http://localhost:8000→ Dashboard → 查看traffic-north状态为RUNNING访问http://localhost:8000/state?keytraffic.prediction.north.15min→ 返回预测值在Dashboard的“Message Flow”图中看到traffic-north每2秒向traffic:predictionTopic发布消息至此你的第一个MiroFish Agent已上线。它不依赖GPU、不调用外部API、不训练模型却已具备“感知-预测-共享”的完整智能体行为。5. 常见问题与独家避坑指南那些文档不会写的血泪教训5.1 Docker Desktop启动失败的终极排查树当docker desktop failed to start because virtualisation support wasnt detected时不要盲目重装。按此顺序排查检查项命令/操作预期结果不通过解法BIOS虚拟化重启进BIOS确认VT-x/AMD-V开启BIOS设置页面显示Enabled进入BIOS手动开启保存退出Windows功能Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-VState : EnabledEnable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -AllWSL2状态wsl -l -v显示Ubuntu-22.04且STATE为Runningwsl --updatewsl --shutdownwslDocker服务Get-Service com.docker.serviceStatus : Running右键Docker图标→Restart或net start com.docker.service端口冲突netstat -ano | findstr :2375无输出结束占用2375端口的进程常见于旧版Docker Toolbox独家技巧在PowerShell中执行dmesg \| grep -i hyperv若返回空说明Hyper-V未加载若返回hyperv: hyperv_init: Hyper-V detected则问题出在Docker Desktop配置。此时删除%APPDATA%\Docker\settings.json重启Docker Desktop重置。5.2 Agent启动后立即退出的5大原因这是新手最高频问题。docker-compose ps显示Exit 1但日志一片空白。真相往往藏在Runtime的静默保护机制中原因1Agent未正确注册到Hub现象容器启动后3秒内退出docker logs traffic-agent显示Connection refused根因Hub服务未就绪Agent超时放弃解法在docker-compose.yml中为Agent添加depends_on: {hub: {condition: service_healthy}}并在Hub的healthcheck中增加curl -f http://localhost:8000/health || exit 1原因2Observation间隔过短现象CPU 100%Agent频繁重启根因observation_interval_ms: 100导致每秒10次observe()调用超出Python GIL处理能力解法最低间隔设为500ms高频场景改用C编写的Agent Runtime官方提供mirofish/agent-runtime:cpp镜像原因3SESS写入超时现象Agent日志出现etcdserver: request timed out根因etcd容器内存不足默认512MBRaft日志堆积解法在etcd服务中增加mem_limit: 1g并挂载- ./etcd-data:/etcd-data原因4模型文件权限错误现象PermissionError: [Errno 13] Permission denied: /app/models/model.pt根因Windows文件系统挂载到Linux容器时ACL权限丢失解法在Dockerfile中添加RUN chmod 644 /app/models/*或改用docker cp复制文件而非volume挂载原因5GPU设备不可用现象nvidia-container-cli: initialization error: driver error: failed to process nvidia-driver根因宿主机NVIDIA驱动版本与容器内CUDA版本不匹配解法运行nvidia-smi查看驱动版本选择对应CUDA镜像如驱动535.x → 用mirofish/agent:pytorch-cu1185.3 生产环境必调参数清单MiroFish默认配置面向开发生产部署前必须修改参数位置推荐值作用MIROFISH_HUB_HEARTBEAT_INTERVAL_SECHub环境变量5Agent心跳间隔开发环境30秒生产需缩短至5秒快速发现故障MIROFISH_BUS_RECONNECT_DELAY_MSBus环境变量100ZeroMQ断连重试延迟避免网络抖动引发雪崩重连AGENT_OBSERVATION_TIMEOUT_MSAgent环境变量1500observe()函数最大执行时间超时则标记Agent为UNHEALTHYETCD_QUOTA_BACKEND_BYTESetcd环境变量4294967296(4GB)防止etcd因Raft日志过大崩溃默认2GB太小DOCKERD_MAX_CONCURRENT_DOWNLOADSDocker daemon.json10加速多Agent镜像拉取默认3个太慢修改方式在docker-compose.yml中为对应服务添加environment块或修改Docker Desktop的Settings → Docker EngineJSON。最后分享一个小技巧MiroFish所有组件都暴露/metrics端点Prometheus格式。在docker-compose.yml中为每个服务添加labels: [com.centurylinklabs.watchtower.enabletrue]再运行docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --interval 300即可实现镜像自动热升级——当mirofish/hub发布新版时Watchtower会在凌晨2点自动拉取并重启全程零停机。这才是真正意义上的“鱼群自我进化”。
返回列表