DBX Database Recipe 模板详解:为 90+ 数据库构建可复现的 Docker 测试环境
DBX Database Recipe 模板详解为 90 数据库构建可复现的 Docker 测试环境【免费下载链接】dbx20 MB lightweight cross-platform database client for 90 databases, including MySQL, PostgreSQL, SQLite, Redis, MongoDB, DuckDB, SQL Server, and Dameng. Built-in AI, MCP Server, CLI, desktop and Docker. | 轻量级跨平台数据库管理工具支持 MySQL、PostgreSQL、SQLite、Redis、MongoDB、达梦等 90 数据库提供桌面端、Docker、CLI、内置 AI 助手和 MCP Server。项目地址: https://gitcode.com/gh_mirrors/dbx7/dbxDBX 内置一套deploy/database测试环境体系每个数据库产品以「版本化 Recipe」recipe.json compose.yaml init/的形式把镜像、端口、凭据、冒烟验证和交互式入口固化成可一键启动的环境。本文以 RECIPE_TEMPLATE.md 为核心逐条拆解 Recipe 的目录约定、字段规范与端口规划并结合 scripts/database-env.mjs 中的真实校验逻辑帮你从零写出一个能通过make db-check与make db-verify的标准 Recipe。一、Recipe 的目录结构与三件套模板要求每个环境放在deploy/database/product/version/下固定包含三个部分见 deploy/database/README.md 的 Recipe layout 一节product/version/ ├── recipe.json # 连接字段与冒烟命令 ├── compose.yaml # Docker Compose 环境定义 └── init/ # 随环境初始化的数据三者分工明确recipe.json声明「怎么连进来」——宿主端口、连接凭据、非交互冒烟命令和交互式 shell 入口是pnpm db:env工具链的唯一事实来源compose.yaml声明「怎么跑起来」——镜像、端口映射、卷、健康检查必须与recipe.json的端口声明严格一致init/初始化数据。以 MySQL 为例mysql/8.4/compose.yaml 将./init只读挂载到/docker-entrypoint-initdb.d容器首次启动时自动执行其中的 SQL。一个细节需要注意Redis 这类不支持镜像初始化目录约定的服务没有init/数据文件其 README如 redis/7.4 对应目录改为文档化verify阶段会创建并读回的冒烟键。二、硬性约定镜像、命名、端口与凭据模板第二段列出了所有 Recipe 必须满足的强制约束。下面结合仓库中真实 Recipe 逐条说明。2.1 固定版本镜像与容器命名每个 Recipe 必须使用pinned image精确到 patch 版本号。例如 mysql/8.4/recipe.json 声明image: docker.cnb.cool/znb/images/mysql:8.4.6而目录名用displayVersion8.4表示redis/7.4/recipe.json 则固定redis:7.4.9-alpine。compose.yaml的container_name必须为dbx-product-version如 mysql/8.4/compose.yaml 第 4 行的dbx-mysql-8.4。该校验是自动化的scripts/database-env.mjs 会检查 compose 文件中是否存在container_name: dbx-product-displayVersion缺失直接报错。2.2 端口规划defaultPort 与 hostPorts这是模板中最容易被忽视、却决定多环境能否并存的关键设计defaultPort填服务原生端口3306、5432、6379、9092…仅用于标识协议语义实际暴露给宿主机的端口放在hostPorts中每个产品独占101xx–115xx区间内的一组端口因此同一仓库的所有环境可以并行运行而互不冲突也不会撞上常见服务端口。仓库中已验证的分配示例产品原生端口 (defaultPort)hostPorts 声明区间MySQL 8.43306DB_PORT: 10101101xxPostgreSQL 17.45432DB_PORT: 10301103xxRedis 7.46379DB_PORT: 10501105xxetcd 3.72379DB_PORT: 10700,ETCD_PEER_PORT: 10701107xxNacos 2.58848DB_PORT: 11000,NACOS_GRPC_PORT: 11001,NACOS_RAFT_PORT: 11002110xxKafka 4.39092DB_PORT: 11300113xx对于Kafka、Nacos、etcd 这类多端口服务hostPorts会声明辅助端口辅助端口的宿主侧映射通过对应的专用环境变量覆盖README 说明service-specific variables override auxiliary ports但主端口统一走DB_PORT。2.3 一致性铁律三处端口必须相同模板明确规定connection.port与 Compose 中DB_PORT的默认回退值必须都等于hostPorts.DB_PORT。这条规则同样有自动化校验兜底scripts/database-env.mjsconnection.port must match hostPorts.DB_PORT同文件 L298-L300逐条比对compose.yaml中的端口默认值与recipe.json的hostPorts不一致即判失败。因此写 Recipe 时只需要选定hostPorts中的端口然后在recipe.json与compose.yaml中机械地复用同一数字即可。2.4 回环绑定、密码与默认库宿主绑定地址默认为回环模板要求 compose 端口写成${DB_BIND_ADDRESS:-127.0.0.1}:${DB_PORT:-10101}:3306形式见 mysql/8.4/compose.yaml。需要远程访问时显式设置DB_BIND_ADDRESS0.0.0.0同时必须更换强密码并配置防火墙——这属于运维侧决策模板默认姿态是「仅本机可连」。密码统一为123456默认库统一为dbx。校验逻辑scripts/database-env.mjs会强制connection.password必须是123456除非authentication: none此时禁止声明密码connection.database必须是dbx。Redis 例外没有命名数据库概念connection.database固定为0数字且键统一使用dbx:前缀例如冒烟键dbx:smoke见 redis/7.4/recipe.json。etcd 同样采用dbx:键前缀etcd/3.7/recipe.json。三、recipe.json 字段全解以 MySQL 8.4 为参照mysql/8.4/recipe.json 是一个最典型的单端口关系型 Recipe完整内容仅 14 行{ database: mysql, name: MySQL, version: 8.4.6, displayVersion: 8.4, image: docker.cnb.cool/znb/images/mysql:8.4.6, platforms: [linux/amd64, linux/arm64], service: database, defaultPort: 3306, connection: { host: 127.0.0.1, port: 10101, username: root, password: 123456, database: dbx }, hostPorts: { DB_PORT: 10101 }, shell: [mysql, -uroot, -p${DB_PASSWORD}, -Ddbx], smoke: { steps: [{ name: query initialized row, command: [mysql, -uroot, -p${DB_PASSWORD}, -Ddbx, -Nse, SELECT note FROM dbx_smoke WHERE id1], expect: DBX smoke }] } }字段说明取值约束来自 scripts/database-env.mjs 的必填与格式校验字段说明约束database/name产品标识小写目录名/ 展示名必填version/displayVersion精确镜像版本 / 目录级版本productdisplayVersion选择器用它必填image固定版本镜像必填须与 compose 一致platforms支持的平台列表db-list会展示如linux/amd64、linux/arm64servicecompose 中的 service 名必填通常为databasedefaultPort原生服务端口整数1–65534connection客户端连接参数host必须为127.0.0.1port等于hostPorts.DB_PORThostPorts环境变量 → 宿主端口映射非空对象键必须形如DB_PORT^[A-Z][A-Z0-9_]*$端口不可复用database-env.mjsshell交互式容器内 shell 入口非空命令数组database-env.mjssmoke非交互冒烟步骤steps非空每步必须有name、command数组与expect期望输出database-env.mjsconnection中还有若干按产品出现的可选字段authentication: noneKafka 等无认证服务使用kafka/4.3/recipe.json声明后不得再带password协议专属端口Kafka 的internalPort: 9095容器内 bootstrap 地址、etcd 的peerPort: 10701etcd/3.7/recipe.json、Nacos 的grpcPort/raftPortnacos/2.5/recipe.jsondeepLinkType如 Nacos 的nacos-v2用于生成 DBX 深度链接。smoke 与 shell 的设计差异模板要求两者缺一不可但定位不同smoke.steps是非交互的每步在容器内执行命令工具检查 stdout 是否包含expect子串。MySQL 的冒烟是查询init/初始化出的dbx_smoke表Redis 则是「先SET dbx:smoke、再GET dbx:smoke读回」两步redis/7.4/recipe.jsonKafka 一步之内完成建 topic、生产、消费并断言DBX smokekafka/4.3/recipe.json。shell是交互式的作为容器内 REPL 入口保留给人工排查。命令中的${DB_PASSWORD}会在运行时被工具链展开为实际密码database-env.mjs 构造DB_PASSWORD/DB_PORT环境。PostgreSQL 的 shell 还示范了通过env PGPASSWORD... psql注入密码的写法postgresql/17.4/recipe.json。可选的 bootstrap幂等初始化对于「镜像起来时凭据尚未初始化」的服务etcd 需要先建 root 用户再开启鉴权Nacos 需要先初始化管理员密码Recipe 可声明bootstrap块bootstrap.check一条幂等的检查命令 期望输出。etcd/3.7 用etcdctl auth status期望输出Authentication Status: truebootstrap.stepscheck 未通过时依次执行的初始化步骤建用户、建角色、授权、启用鉴权。执行逻辑见 scripts/database-env.mjs先跑 check若输出已包含期望值则跳过全部 steps否则逐步执行并断言每步输出。这让make db-verify在容器重建后也能安全重放初始化而不重复执行建号操作。四、compose.yaml 编写要点以 mysql/8.4/compose.yaml 为范本标准写法包含五个要素services: database: image: docker.cnb.cool/znb/images/mysql:8.4.6 # 1. 固定版本镜像与 recipe.json 一致 container_name: dbx-mysql-8.4 # 2. 规范容器名 restart: always ports: - ${DB_BIND_ADDRESS:-127.0.0.1}:${DB_PORT:-10101}:3306 # 3. 回环绑定 DB_PORT 回退值 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-123456} # 4. 密码回退值为 123456 MYSQL_DATABASE: dbx volumes: - data:/var/lib/mysql # 5. 命名卷供 db-reset 清理 - ./init:/docker-entrypoint-initdb.d:ro healthcheck: test: [CMD-SHELL, mysqladmin ping -h 127.0.0.1 -uroot -p\$$MYSQL_ROOT_PASSWORD\ --silent] interval: 5s timeout: 5s retries: 30 start_period: 20s volumes: data:几个容易出错的点端口行三段式绑定地址:宿主端口:容器端口缺一不可且默认回退值${DB_PORT:-10101}必须等于hostPorts.DB_PORT见第三节 2.3健康检查是必备项README 将 health check 列为每个 Recipe 的标准配置之一。CMD-SHELL中引用环境变量需写成$$VARCompose 转义Redis 的写法见 redis/7.4/compose.yamlredis-cli -a $$REDIS_PASSWORD ping | grep PONG并特意把密码放容器环境以便安全引号化命名卷data:承载数据目录make db-reset会删除它——这也是db-reset强制要求CONFIRM1的原因deploy/database/README.md。五、验证与交付检查清单模板最后给出了新增/修改 Recipe 后的四条命令全部在仓库根目录执行pnpm test:db-env make db-check make db-verify DBproductversion make db-reset DBproductversion CONFIRM1各命令的职责目标定义见 Makefile底层均为pnpm db:env命令作用pnpm test:db-env运行工具链自身的单元测试确保验证逻辑本身可信make db-check静态校验全部 Recipe结构字段、端口一致性、容器名、compose 文件由 Docker Compose 实机校验make db-verify DBmysql8.4拉起环境、执行 bootstrap如需并逐步运行smoke.steps断言make db-reset DBmysql8.4 CONFIRM1删除容器与命名卷回到干净状态必须显式确认辅助目标还包括make db-list按产品分组列出各版本的容器端口映射、镜像与平台、make db打印可复制的启动命令、make db-down仅停止不删数据、make db-completionBash/Zsh/PowerShell 补全脚本在 deploy/database/completion/。另外两点实操提示深度链接对 DBX 支持的连接类型verify成功后会打印预填好参数的dbx://connection/new链接由 database-env.mjs 用connection字段拼装macOS 上可open link直接打开新建连接对话框链接含密码不要留存到共享日志。无兼容连接类型的 Recipe 会明确提示不提供深链。排查分层静态问题看db-check的报错信息错误文案即规范条款运行时问题用pnpm db:env -- info|status|logs|shell product version逐层诊断deploy/database/README.md。小结DBX 的 Recipe 模板本质上是一份「可机检的契约」product/version/三件套定义环境与连接defaultPort/hostPorts/connection.port三处端口一致性、dbx-*容器名、123456密码与dbx默认库构成统一约定smokeshell 可选bootstrap覆盖自动验证与人工排查。按模板约束写完三个文件后用make db-check过静态校验、make db-verify过运行时断言即完成一个新数据库测试环境的交付。更多现成范本可对照仓库中 MySQL、PostgreSQL、Redis、etcd、Nacos、Kafka 等 18 个产品的 20 余个版本化 Recipedeploy/database/。【免费下载链接】dbx20 MB lightweight cross-platform database client for 90 databases, including MySQL, PostgreSQL, SQLite, Redis, MongoDB, DuckDB, SQL Server, and Dameng. Built-in AI, MCP Server, CLI, desktop and Docker. | 轻量级跨平台数据库管理工具支持 MySQL、PostgreSQL、SQLite、Redis、MongoDB、达梦等 90 数据库提供桌面端、Docker、CLI、内置 AI 助手和 MCP Server。项目地址: https://gitcode.com/gh_mirrors/dbx7/dbx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

一次编写,处处运行:Quasar Framework 跨平台 Vue.js 开发全景指南

一次编写,处处运行:Quasar Framework 跨平台 Vue.js 开发全景指南

前端UI组件跨平台 【免费下载链接】quasar Quasar Framework - Build high-performance VueJS user interfaces in record time 项目地址: https://gitcode.com/gh_mirrors/qu/quasar 点击查看 免费下载 本文以 docs/src/pages/introduction-to-quasar/introductio…

2026/9/20 20:02:46 阅读更多 →
从单条请求到 5 分钟绕过 Cloudflare 验证:Scrapling 网页抓取教程

从单条请求到 5 分钟绕过 Cloudflare 验证:Scrapling 网页抓取教程

从单条请求到 5 分钟绕过 Cloudflare 验证:Scrapling 网页抓取教程 【免费下载链接】Scrapling 🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Dont be shy, join here: https://disc…

2026/9/21 23:48:53 阅读更多 →
Java实现五子棋AI:Alpha-Beta剪枝实战与性能优化

Java实现五子棋AI:Alpha-Beta剪枝实战与性能优化

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

2026/9/21 23:48:53 阅读更多 →

最新新闻

如何制作微信推送源码解析:3步搞定跑不通的代码

如何制作微信推送源码解析:3步搞定跑不通的代码

如何制作微信推送源码解析:3步搞定跑不通的代码 复制来的代码跑不通,是不是让你抓狂?报错信息像天书,调试半天没头绪。别急,今天咱们直接扒开【如何制作微信推送】的底层逻辑,用源码解析帮你理清思路。 一句话原理:回调机制与签名校验…

2026/9/21 23:48:35 阅读更多 →
3个资瓷面试必问坑,最佳实践助你通关

3个资瓷面试必问坑,最佳实践助你通关

3个资瓷面试必问坑,最佳实践助你通关 你是不是也遇到过这种情况?语法背得滚瓜烂熟,LeetCode 刷了一堆题,结果面试时面试官问:“你在实际项目中是怎么处理数据资瓷的?”你脑子一片空白。这就是典型的“学会语法却不知怎么搭项目”。很多开发者…

2026/9/21 23:48:35 阅读更多 →
3个DDNS实战项目踩坑记录:面试必问动态解析原理与代码调优

3个DDNS实战项目踩坑记录:面试必问动态解析原理与代码调优

3个DDNS实战项目踩坑记录:面试必问动态解析原理与代码调优 复制来的代码跑不通,报错信息像天书,根本不知道从哪下手调?这种绝望感在搞DDNS(动态域名解析)的实战项目里太常见了。很多开发者把开源仓库里的Demo直接搬到生产环境,结果域名死…

2026/9/21 23:48:35 阅读更多 →
长沙有哪些旅游景点:一文搞懂底层逻辑与避坑全解

长沙有哪些旅游景点:一文搞懂底层逻辑与避坑全解

长沙有哪些旅游景点:一文搞懂底层逻辑与避坑全解 看了一堆旅游攻略还是踩坑?别急,这跟咱们写代码没跑通一个道理。今天用程序员思维, 一文搞懂 【长沙有哪些旅游景点】背后的规划原理。 一句话原理:旅游即路由匹配 旅游本质是 资源-需求…

2026/9/21 23:47:34 阅读更多 →
2026最新虚拟机多少钱实测:3步搞定性能瓶颈与成本优化

2026最新虚拟机多少钱实测:3步搞定性能瓶颈与成本优化

2026最新虚拟机多少钱实测:3步搞定性能瓶颈与成本优化 很多开发者盯着语法书啃完,代码能跑,但一上手真实项目就卡壳。不知道环境怎么搭,不知道资源怎么配,更不知道 虚拟机多少钱…

2026/9/21 23:47:34 阅读更多 →
3招搞定win7关闭系统更新,面试高频考点避坑指南

3招搞定win7关闭系统更新,面试高频考点避坑指南

3招搞定win7关闭系统更新,面试高频考点避坑指南 版本升级后 API 全变了,很多老项目直接崩盘,这正是 高频面试题 里最扎心的痛点。别急着骂系统,Win7 停服后强制更新是运维噩梦。今天直接上代码,用 Python…

2026/9/21 23:47:34 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →