ThreatMapper 自定义 Sensor Agent 部署指南:从自建镜像到 Docker 与 Kubernetes 集群落地
网络安全应用安全云原生漏洞扫描【免费下载链接】ThreatMapperOpen Source Cloud Native Application Protection Platform (CNAPP)项目地址https://gitcode.com/gh_mirrors/th/ThreatMapper点击查看免费下载本指南面向需要基于自研或私有化镜像部署 ThreatMapper 传感器Sensor Agent的开发者与运维人员讲解如何先构建并推送自定义 Agent 镜像再分别通过docker run与 Helm Chart 两种方式将 Agent 部署到 Docker 主机和 Kubernetes 集群并深入解析镜像仓库替换、MGMT_CONSOLE_URL、DEEPFENCE_KEY等关键参数的作用原理。读完本文你将能够完全脱离 Deepfence 官方镜像仓库在自己的环境中完成传感器全生命周期管理部署、验证、升级、卸载。前置条件先构建镜像并推送至自有仓库部署自定义传感器之前必须先在构建机上完成 ThreatMapper 的源码构建并将生成的镜像推送到一个可访问的镜像仓库。官方推荐的构建流程记录在 构建指南 中核心步骤为git clone ThreatMapper 仓库地址 cd ThreatMapper make构建过程会产出管理控制台与传感器相关的多个容器镜像并保存在本地 Docker 仓库中。若要在其他主机上部署传感器需要将deepfence_agent_ce普通传感器与deepfence_cluster_agent_ce集群传感器推送到你的镜像仓库例如 DockerHubACCmyorg # 你的 dockerhub 账户名 docker login -u $ACC # 登录账户 for IMG in \ deepfence_redis_ce \ deepfence_postgres_ce \ deepfence_kafka_broker_ce \ deepfence_router_ce \ deepfence_file_server_ce \ deepfence_server_ce \ deepfence_worker_ce \ deepfence_ui_ce \ deepfence_agent_ce \ deepfence_cluster_agent_ce \ deepfence_package_scanner_ce \ deepfence_malware_scanner_ce \ deepfence_secret_scanner_ce \ deepfence_neo4j_ce do docker tag deepfenceio/$IMG $ACC/$IMG:latest docker push $ACC/$IMG:latest done完成镜像推送后就可以把标准安装文档Docker 安装指南、Kubernetes 安装指南中的镜像引用从 Deepfence 官方地址替换为你自己的镜像地址其余安装逻辑完全一致。从源码结构看Agent 镜像并非单一二进制在 deepfence_agent/Dockerfile 中secret_build、package_build、malware_build、compliance_build四个构建阶段分别把 SecretScanner、Syft/package-scanner、YaraHunter、compliance 扫描器集成进最终镜像同时内置docker、vessel、nerdctl、crictl等工具用于与宿主机容器运行时交互。因此推送镜像时上述扫描器基础镜像同样需要一并推送。在 Docker 主机上安装并运行自定义 Sensor AgentLinux Docker 主机上的 ThreatMapper 传感器以一个轻量容器形式运行。参照 Docker 安装指南 的部署形态把镜像地址替换为你的仓库即可ACCmyorg # 你的 dockerhub 账户名 docker login -u $ACC # 登录账户 docker run -dit \ --cpus.2 \ --namedeepfence-agent \ --restart on-failure \ --pidhost \ --nethost \ --log-driver json-file \ --log-opt max-size50m \ --privilegedtrue \ -v /sys/kernel/debug:/sys/kernel/debug:rw \ -v /var/log/fenced \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /:/fenced/mnt/host/:ro \ -e DF_LOG_LEVELinfo \ -e CUSTOM_TAGS \ -e MGMT_CONSOLE_URL---CONSOLE-IP--- \ -e MGMT_CONSOLE_PORT443 \ -e DEEPFENCE_KEY---DEEPFENCE-API-KEY--- \ -e http_proxy \ -e https_proxy \ -e no_proxy \ $ACC/deepfence_agent_ce:THREATMAPPER_VERSION其中THREATMAPPER_VERSION是你构建/推送时使用的版本标签官方仓库同时提供quay.io/deepfenceio/deepfence_agent_ce:THREATMAPPER_VERSION-multiarch多架构镜像支持 amd64 与 arm64/v8 架构。若使用 Podman将命令中的docker换成podman并将-v /var/run/docker.sock:/var/run/docker.sock替换为-v /run/podman/podman.sock:/run/podman/podman.sock同时挂载-v /run/systemd/:/run/systemd/部署前需确保 Podman system serviceAPI service已启动。关键启动参数说明参数/环境变量含义与作用--pidhost/--nethost与宿主机共享 PID 与网络命名空间是 Agent 观测宿主机进程与网络的基础--privilegedtrue授予容器特权用于内核级采集与合规检查-v /sys/kernel/debug:/sys/kernel/debug:rw挂载内核调试文件系统供漏洞/合规等内核态探测使用-v /var/run/docker.sock:/var/run/docker.sock挂载 Docker Socket用于发现宿主上的容器与镜像-v /:/fenced/mnt/host/:ro只读挂载宿主机根文件系统供恶意软件、机密等扫描器读取宿主文件-v /var/log/fenced挂载扫描日志目录malware-scan、secret-scan、compliance 等子目录MGMT_CONSOLE_URL/MGMT_CONSOLE_PORT管理控制台的地址与端口Agent 据此反向连接控制台默认 443DEEPFENCE_KEY管理控制台的 API Key用于 Agent 身份认证DF_LOG_LEVEL日志级别取值为debug/info/error默认infoCUSTOM_TAGS逗号分隔的自定义标签例如dev,front-end用于在 UI 中标识节点http_proxy/https_proxy/no_proxy当控制台位于代理之后时Agent 通过该代理与控制台通信环境变量在 Agent 内部的真实作用链路这些环境变量并非表面参数而是直接驱动 Agent 的启动逻辑在 deepfence_agent/run_discovery.sh 中MGMT_CONSOLE_URL与MGMT_CONSOLE_PORT会拼接成https://$MGMT_CONSOLE_URL:$MGMT_CONSOLE_PORTDEEPFENCE_KEY作为--probe.token传入deepfence-discovery探测进程DF_LOG_LEVEL映射为--probe.log.level默认info。脚本还会调用vessel自动探测宿主机容器运行时docker/containerd/crio/podman再按探测结果选择对应的--probe.docker/--probe.cri/--probe.podman参数启动探测。在 deepfence_agent/tools/apache/deepfence/df-utils/utils.go#L26-L36 中GetCustomTags()读取CUSTOM_TAGS环境变量按逗号切分并TrimSpace去除首尾空白后作为节点标签上报。在 deepfence_agent/start_agent.sh 中启动阶段会创建/var/log/fenced下的扫描日志目录、配置 logrotate 定时任务并通过 supervisord 拉起全部 Agent 子进程DEEPFENCE_KEY、MGMT_CONSOLE_URL等环境变量还会被注入到 fluentbitshipper配置中用于日志回传。通过代理服务器访问控制台如果管理控制台需要通过代理访问有两种方式在docker run时直接设置http_proxy、https_proxy环境变量Agent 会使用该代理与控制台通信即上文命令中预留的空变量或者配置 Docker 客户端全局代理编辑~/.docker/config.json{ auths: { https://index.docker.io/v1/: { auth: } }, HttpHeaders: { User-Agent: Docker-Client/19.03.1 (linux) }, proxies: { default: { httpProxy: http://111.111.111.111:8006, httpsProxy: http://111.111.111.111:8006, noProxy: localhost,127.0.0.1 } } }随后重启 Docker 守护进程sudo systemctl restart docker。升级传感器升级 Docker 传感器时先停止旧容器再以新版本镜像标签启动新容器即可docker stop deepfence-agent docker rm deepfence-agent # 使用新版本标签重新执行 docker run在 Kubernetes 集群中部署自定义 Sensor Agent在 Kubernetes 中传感器以 DaemonSet 形态运行集群传感器则以单 Pod 形式运行统一通过 Helm Chart 管理适用于独立集群与托管集群EKS、AKS、GKE 等。注意deepfence-consoleChart 默认会在其部署的集群中同时运行 agent 与 cluster-agent Pod因此无需再额外安装deepfence-agentChart。快速安装--set 方式helm repo add deepfence https://artifacts.threatmapper.org/helm-charts/threatmapper helm repo update helm install deepfence-agent deepfence/deepfence-agent \ --set managementConsoleUrlx.x.x.x \ --set deepfenceKey73f6f3d0-9931-4b31-8967-fd6adf475f80 \ --set global.imageTagTHREATMAPPER_VERSION \ --set clusterNameprod-cluster \ --set mountContainerRuntimeSocket.containerdSocktrue \ --set mountContainerRuntimeSocket.dockerSockfalse \ --set mountContainerRuntimeSocket.crioSockfalse \ --set mountContainerRuntimeSocket.podmanSockfalse \ --set mountContainerRuntimeSocket.containerdSockPath/run/containerd/containerd.sock \ --set logLevelinfo \ --namespace deepfence \ --create-namespace \ --version TM_AGENT_HELM_CHART_VERSION要点说明clusterName是集群名称/标识不同集群必须使用不同值如prod-cluster-1、test-cluster它会作为主机名前缀出现在 Deepfence UI 中容器运行时 Socket 的挂载需与实际运行时匹配默认 Chart 中 containerd 开启、docker 关闭在 Minikube 等特殊平台上若 Agent 无法启动可尝试将containerdSock设为false官方镜像标签quay.io/deepfenceio/deepfence_agent_ce:THREATMAPPER_VERSION-multiarch支持 amd64 与 arm64/v8。细调部署values 文件方式需要替换为自定义镜像或深度调优时推荐导出 values 文件后修改helm repo add deepfence https://artifacts.threatmapper.org/helm-charts/threatmapper helm repo update helm show values deepfence/deepfence-agent --version TM_AGENT_HELM_CHART_VERSION deepfence_agent_values.yaml # 必须更新以下值 # managementConsoleUrl 和 deepfenceKey - 指定你的控制台 IP/URL 与 API Key # image:name 和 image:clusterAgentImageName - 改为指向你的自定义镜像 # 可按需调整其他值例如 # containerdSock - 在 Minikube 等平台上 Agent 启动失败时可设为 false vim deepfence_agent_values.yaml helm install -f deepfence_agent_values.yaml deepfence-agent deepfence/deepfence-agent \ --namespace deepfence \ --create-namespace \ --version TM_AGENT_HELM_CHART_VERSION允许容器在 Kubernetes 环境中拉取并部署等待数秒即可完成。替换自定义镜像的完整参数对照deepfence-agent values.yaml 定义了全部可调参数部署自定义传感器时重点修改以下内容Values 参数默认值说明global.imageTag2.5.8当前仓库版本全局镜像标签所有 Agent 组件统一使用agent.image.namequay.io/deepfenceio/deepfence_agent_ce普通传感器镜像改为你的镜像仓库地址cluster_agent.image.namequay.io/deepfenceio/deepfence_cluster_agent_ce集群传感器镜像改为你的镜像仓库地址managementConsoleUrl空控制台 IP/URL必填managementConsolePort443控制台端口deepfenceKey空API KeyUI → Settings → User Management 获取必填createDeepfenceKeySecrettrue是否由 Chart 创建存放 Key 的 SecretclusterName空集群名称作为主机名前缀logLevelinfoPod 日志级别debug/info/errorinstanceIdSuffixN是否给主机名追加云实例 ID区分同名 AMI 实例customTags空逗号分隔的节点自定义标签enableGraphReporttrue是否启用进程/连接图数据上报mountContainerRuntimeSocket.*containerd 开启各容器运行时 Socket 开关与路径imagePullSecretcreate: false私有仓库拉取凭据自定义仓库需开启并填写用户名密码agent.resourcesrequests 150m/512Milimits 1500m/1536Mi传感器资源配额cluster_agent.resourcesrequests 25m/80Milimits 1500m/1536Mi集群传感器资源配额私有仓库与 Key 的底层实现从 Chart 模板可以确认自定义镜像与认证机制的实际落地方式镜像替换在 templates/daemonset.yaml 中容器镜像由{{ .Values.agent.image.name }}:{{ default .Values.global.imageTag .Values.agent.image.tag }}渲染即“镜像名 标签”完全由 values 驱动该模板同时把MGMT_CONSOLE_URL、MGMT_CONSOLE_PORT、DF_KUBERNETES_ONY、DF_CLUSTER_NAME、CUSTOM_TAGS、DF_LOG_LEVEL、代理变量以及DOCKER_SOCKET_PATH/CONTAINERD_SOCKET_PATH等运行时 Socket 路径注入容器环境并将/sys/kernel/debug、宿主机根目录只读、/var/log/fenced等挂载进 Pod与 Docker 部署的参数一一对应。Key 下发在 templates/secret.yaml 中deepfenceKey被 base64 编码写入名为release-key的 Opaque SecretDaemonSet 通过secretKeyRef引用该 Secret 填充DEEPFENCE_KEY环境变量。若你的环境中已存在外部定义的 Secret可将createDeepfenceKeySecret设为false。私有仓库拉取设置imagePullSecret.create: true并填写registry、username、password后Chart 会生成kubernetes.io/dockerconfigjson类型的 Secret 用于拉取自定义镜像。完整可参考 deepfence-agent Chart 文档。部署验证、卸载与容器运行时识别验证部署状态kubectl get daemonset -n deepfence kubectl get pods -n deepfence随后即可在管理控制台的拓扑与主机列表中看到以clusterName-hostname命名的传感器节点。删除传感器helm delete deepfence-agent -n deepfence # 或helm uninstall deepfence-agent -n deepfence识别集群容器运行时如果不知道集群使用哪种容器运行时可先执行kubectl get nodes -ocustom-columnsNAME:.metadata.name,Runtime:.status.nodeInfo.containerRuntimeVersion之后在安装时按结果设置对应的mountContainerRuntimeSocket.*Sock开关与 Socket 路径。即便配置有出入Agent 容器内的vessel工具也会在启动时自动探测实际运行时见 deepfence_agent/run_discovery.sh并据此选择 docker/containerd/crio/podman 对应的探测参数这也是 DaemonSet 模板中挂载多种 Socket 的原因所在。小结部署自定义 ThreatMapper 传感器可以概括为三步其一通过make构建并推送deepfence_agent_ce、deepfence_cluster_agent_ce等镜像到自有仓库其二在 Docker 主机上用docker run以--privileged 宿主机命名空间 多卷挂载的方式拉起 Agent并通过MGMT_CONSOLE_URL、DEEPFENCE_KEY、DF_LOG_LEVEL、CUSTOM_TAGS等环境变量完成与控制台的对接与行为定制其三在 Kubernetes 集群中通过deepfence-agentHelm Chart 以 DaemonSet 方式批量部署替换agent.image.name、cluster_agent.image.name并填写控制台地址与 Key。理解环境变量与 Chart values 到底如何驱动run_discovery.sh、start_agent.sh与 DaemonSet 模板参见 run_discovery.sh、start_agent.sh、daemonset.yaml就能在离线、私有化或定制镜像场景下稳定复现官方部署行为。赞分享网络安全应用安全云原生漏洞扫描【免费下载链接】ThreatMapperOpen Source Cloud Native Application Protection Platform (CNAPP)项目地址https://gitcode.com/gh_mirrors/th/ThreatMapper点击查看免费下载相关推荐Polar 前端性能实践用战略性 Suspense 边界消除异步阻塞加速首屏渲染Polar 前端性能实践用战略性 Suspense 边界消除异步阻塞加速首屏渲染 导读 在 React 与 Next.js 应用中异步组件在返回 JSX网络安全应用安全云原生漏洞扫描ThreatMapper 传感器Sensor Agent部署实战从 Docker、Kubernetes 到 AWS 的完整安装指南ThreatMapper 传感器Sensor Agent部署实战从 Docker、Kubernetes 到 AWS 的完整安装指南 ThreatMappe网络安全应用安全云原生漏洞扫描Mage AI 自建 Spark 集群基于自定义 Docker 镜像与 Helm 的 Standalone 部署实战指南Mage AI 自建 Spark 集群基于自定义 Docker 镜像与 Helm 的 Standalone 部署实战指南 本篇技术指南围绕 Mage AI 仓数据工程数据编排ETL任务调度批处理流处理数据集成后端前端上一篇如何在Godot中快速创建专业对话系统Dialogic 2终极指南下一篇Vanna 2.0企业级自然语言SQL生成框架的技术深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Tribler 源码运行指南:从 git clone 到启动 GUI 与 REST API 的完整实践

Tribler 源码运行指南:从 git clone 到启动 GUI 与 REST API 的完整实践

网络音视频密码学 【免费下载链接】tribler Privacy enhanced BitTorrent client with P2P content discovery 项目地址: https://gitcode.com/gh_mirrors/tr/tribler 点击查看 免费下载 本文以 Tribler 官方文档 doc/basics/running.rst 为主线,完整梳…

2026/10/13 6:08:41 阅读更多 →
Java图案打印:Android开发中的状态映射与坐标思维训练

Java图案打印:Android开发中的状态映射与坐标思维训练

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 6:08:41 阅读更多 →
GitHub Issue智能分诊:信息补全、意图识别与路由推荐三步法

GitHub Issue智能分诊:信息补全、意图识别与路由推荐三步法

1. 为什么 Issue 分诊是开发者团队里最沉默的“时间黑洞”你有没有过这样的经历:周一早上打开 GitHub,收件箱里躺着 27 条新 Issue 通知。点开第一条,标题是“App 崩溃了”,正文只有三个字:“点就崩”。再点第二条&…

2026/10/13 6:08:41 阅读更多 →

最新新闻

阿里云ECS IPv6配置全链路排障指南

阿里云ECS IPv6配置全链路排障指南

1. 为什么现在还值得花时间配通ECS的IPv6——不是赶时髦,是绕不开的现实需求 “阿里云ECS开启IPv6支持”这个标题看起来像一份过时的操作指南。毕竟IPv6喊了十几年,很多人印象里还是“实验室技术”“过渡方案”“等运营商推”。但去年底我帮某高校做一套…

2026/10/13 8:19:36 阅读更多 →
JDK编译报错“不支持发行版本6”:根因分析与Maven配置修复指南

JDK编译报错“不支持发行版本6”:根因分析与Maven配置修复指南

最近帮一位同事收拾旧项目,报错很典型:本地装的是JDK 11,代码从仓库拉下来,在IDE里一点编译,控制台直接打出java: 错误: 不支持发行版本 6。第一反应是Maven没配置好,又怀疑依赖版本冲突,折腾了…

2026/10/13 8:19:36 阅读更多 →
LLM代理成为一等优化手段:算子优化范式从手写汇编到代理驱动的转变

LLM代理成为一等优化手段:算子优化范式从手写汇编到代理驱动的转变

1. 从"手写汇编"到"代理驱动":算子优化范式正在发生什么变化2026年过半,如果你还在用纯手工的方式去调一个LLM推理场景下的算子kernel,大概率会在效率上吃大亏。这不是危言耸听,而是我这半年在几个实际项目里…

2026/10/13 8:19:36 阅读更多 →
开源可自托管代码评审工作流:从流程负担到质量抓手的工程实践

开源可自托管代码评审工作流:从流程负担到质量抓手的工程实践

代码评审这件事,做得好是团队效率的放大器,做得不好就是每天下班前的一场互相折磨。我在一线写了十几年代码,见过太多评审流于形式的团队——评论里全是“LGTM”,合入之后bug频发;也有评审严格到让人不敢提PR的团队&am…

2026/10/13 8:19:36 阅读更多 →
鸿蒙校园通开发实战:分布式数据同步与后台任务调度避坑指南

鸿蒙校园通开发实战:分布式数据同步与后台任务调度避坑指南

简介:这份资源是面向鸿蒙应用开发初学者与在校学生的实战项目源码包,以华为HarmonyOS为技术底座,围绕校园生活场景构建了一款功能完整的「校园通」软件。项目覆盖课程表管理、食堂菜谱、图书馆查询、校园导航、景点导览、号码百事通、校区平面…

2026/10/13 8:19:36 阅读更多 →
JMeter If Controller深度解析:逻辑调度与条件控制最佳实践

JMeter If Controller深度解析:逻辑调度与条件控制最佳实践

1. 项目概述:If Controller不是“条件开关”,而是JMeter里最被低估的逻辑调度中枢 如果你在用Jmeter做接口压测时,还只是把所有请求堆在同一个线程组里、靠“固定定时器”硬控节奏,或者一遇到“登录成功才跑下单”“状态为process…

2026/10/13 8:18:35 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →