使用 Acorn 打包与部署 FerretDB 应用:Python Flask 应用的云原生实战
后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载FerretDB 是一款真正开源的 MongoDB 替代方案可将 PostgreSQL 作为文档数据库后端而 Acorn 是一个基于 Kubernetes 的简化应用部署框架让开发者无需直接编写 Kubernetes YAML 即可完成云原生部署。本文以一套完整的 Python Flask Todo 应用为例讲解如何编写Acornfile将应用、FerretDB 与 PostgreSQL 后端一起打包成镜像并通过acorn run一键部署、acorn build/push完成镜像发布最终在任意 Kubernetes 环境复用这套工作流。为什么用 Acorn 部署 FerretDB 应用FerretDB 是 MongoDB 的替代方案应用通过 MongoDB 协议与 FerretDB 通信而数据实际存储在 PostgreSQL 或 SQLite 中从而避免厂商锁定。与 MongoDB 生态的高度兼容意味着任何使用pymongo、mongosh等 MongoDB 驱动与工具的应用都可以在不改动业务代码的前提下切换到 FerretDB。Acorn 则提供了位于 Kubernetes 之上的抽象层以 Docker 容器、应用配置、部署描述等应用级原语来声明整个应用。在 Acorn 的模型里Acornfile之于acorn run就如同Dockerfile之于docker build——前者描述容器、服务、应用、卷、密钥与部署信息并被编译成 Acorn 镜像。这样一个文件就能同时承载数据库、中间件与应用的全部配置。本指南将实现一个 Flask FerretDB 的 Todo 应用并使用 Acorn 完成部署、镜像构建与发布。前置条件要完成本指南需要准备Acorn CLI注册 Acorn 平台需要 GitHub 账号FerretDB 本身不需要在本机单独安装因为最终它会作为 Acorn 应用中的容器被一起构建和运行。安装 Acorn CLI安装 Acorn CLI 后即可在终端直接运行acorn命令。macOS 与 Linux 用户brew install acorn-io/cli/acornWindows 用户通过 Scoop 安装scoop install acorn安装完成后使用 GitHub 账号登录 Acorn 平台acorn login终端会引导你创建或登录Acorn 账号完成授权后回到终端即可继续后续操作。搭建 Python Flask 应用我们创建一个简单的 Todo 应用它通过pymongo连接 FerretDB后端为 PostgreSQL。先建立项目目录与文件mkdir -p my-ferret/templates cd my-ferret touch app.py requirements.txt templates/template.html Dockerfile Acornfile最终目录结构如下my-ferret/ │ ├── app.py # Python 主应用文件 ├── requirements.txt # Python 依赖清单 ├── Dockerfile # Docker 构建配置 ├── Acornfile # Acorn 部署配置 │ └── templates/ # HTML 模板目录 └── template.html # HTML 模板文件应用主代码 app.pyimport os from flask import Flask, render_template, request, redirect, url_for from pymongo import MongoClient from bson.objectid import ObjectId app Flask(__name__) db_uri os.environ[DB_URI] db_name os.environ[DB_NAME] print(DB_URI:, db_uri) print(DB_NAME:, db_name) client MongoClient(db_uri) db client[db_name] todos_collection db[todos] def redirect_url(): return request.args.get(next) or \ request.referrer or \ url_for(home) app.route(/) def home(): todo_list list(todos_collection.find({})) return render_template(template.html, todo_listtodo_list) app.route(/add, methods[POST]) def add(): title request.form.get(title) new_todo {title: title, done: False} todos_collection.insert_one(new_todo) return redirect(redirect_url()) app.route(/update/todo_id) def update(todo_id): todo todos_collection.find_one({_id: ObjectId(todo_id)}) todos_collection.update_one({_id: ObjectId(todo_id)}, {$set: {done: not todo[done]}}) return redirect(redirect_url()) app.route(/delete/todo_id) def delete(todo_id): todos_collection.delete_one({_id: ObjectId(todo_id)}) return redirect(redirect_url()) if __name__ __main__: app.run(debugTrue)应用通过 Flask 提供 Web 页面用pymongo与 FerretDB 通信——这正是 FerretDB 兼容 MongoDB 生态的体现驱动层无需任何改造。DB_URI与DB_NAME两个环境变量由 Acornfile 注入分别指向 FerretDB 的连接地址与数据库名CRUD 操作增删改查由insert_one、find_one、update_one、delete_one完成数据最终落盘到 PostgreSQL。前端模板 template.html!doctype html html langen head meta charsetUTF-8 / meta nameviewport contentwidthdevice-width, initial-scale1.0 / titleTodo App/title link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/semantic-ui2.4.2/dist/semantic.min.css / script srchttps://cdn.jsdelivr.net/npm/semantic-ui2.4.2/dist/semantic.min.js/script /head body div stylemargin-top: 50px; classui container h1 classui center aligned headerTo Do App/h1 form classui form action/add methodpost div classfield labelTodo Title/label input typetext nametitle placeholderEnter Todo... /br / /div button classui blue button typesubmitAdd/button /form hr / div classui items {% for todo in todo_list %} div classitem a href/update/{{ todo.id }} {% if todo.done False %} i classlarge square outline icon/i {% else %} i classlarge green check square icon/i {% endif %} /a div classmiddle aligned content div classheader{{ todo.title }}/div /div a href/delete/{{ todo.id }} i classred trash alternate icon/i /a /div {% endfor %} /div /div /body /html页面使用 Semantic UI 渲染 Todo 列表未完成项显示空心方框点击后可切换为绿色勾选删除按钮直接调用/delete/todo_id路由。依赖清单 requirements.txtFlask2.3.2 pymongo这两行依赖将在 Dockerfile 构建阶段安装到容器内。创建 Dockerfile 容器化 Python 应用Dockerfile 负责构建运行 Flask 应用所需的镜像设置环境、安装依赖、配置运行参数最终在隔离容器内启动服务。FROM cgr.dev/chainguard/python:latest-dev WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt --user COPY . . ENV FLASK_APP app.py ENV FLASK_ENV development ENV FLASK_RUN_HOST 0.0.0.0 ENV FLASK_RUN_PORT 8000 EXPOSE 8000 ENTRYPOINT [python, -m, flask, run]注意FLASK_RUN_HOST设为0.0.0.0确保容器外即 Acorn 的负载均衡层可以访问 8000 端口EXPOSE 8000与 Acornfile 中ports: publish: 8000/http的声明保持一致。编写 Acornfile一份文件描述整个应用Acornfile 是整个部署的核心它集中声明了 Docker 构建、数据库、密钥、容器、端口与部署信息。与 Dockerfile 构建出 Docker 镜像同理Acornfile 会被编译成 Acorn 镜像。services: postgres: { image: ghcr.io/acorn-io/postgres:v15.#-# } containers: { app: { build: context: . ports: publish: 8000/http env: { DB_URI: mongodb://{service.postgres.secrets.admin.username}:{service.postgres.secrets.admin.password}ferretdb/ferretdb?authMechanismPLAIN DB_NAME: ferretdb } dependsOn: [ ferretdb ] if args.dev { files: { /src: ./ }, env: FLASK_DEBUG: 1 } } ferretdb: { image: ferretdb/ferretdb ports: publish: 27017/tcp consumes: [postgres] env: { FERRETDB_POSTGRESQL_URL: postgres://{service.postgres.secrets.admin.username}:{service.postgres.secrets.admin.password}{service.postgres.address} } } }三个核心声明逐一拆解postgres 服务services: postgres声明了一个由 Acorn 托管的 PostgreSQL 服务镜像ghcr.io/acorn-io/postgres:v15运行在持久卷之上并提供admin凭据。默认配置下的该服务不具备高可用能力生产环境可以无缝替换为其他 PostgreSQL 服务接口如 AWS RDS for PostgreSQL——这正是 FerretDB 避免厂商锁定价值所在。Acorn 为该服务注入的admin凭据包括POSTGRES_HOST{service.db.address}POSTGRES_DB{service.db.data.dbName}POSTGRES_USER{service.db.secrets.admin.username}POSTGRES_PASSWORD{service.db.secrets.admin.password}ferretdb 容器通过consumes: [postgres]消费上述服务并用{service.postgres.xxx}变量组装FERRETDB_POSTGRESQL_URL环境变量指向 PostgreSQL 后端。这里的连接串格式与仓库中的配置体系完全一致在 配置文档 中FerretDB 通过--postgresql-url命令行标志或FERRETDB_POSTGRESQL_URL环境变量指定 PostgreSQL 连接 URL默认值为postgres://127.0.0.1:5432/postgres容器化部署时必须在环境变量中显式覆盖。仓库根目录的 docker-compose.yml 中 FerretDB 服务同样采用FERRETDB_POSTGRESQL_URLpostgres://pg-user:pg-passhost.docker.internal:5432/postgres的写法可作为对照。app 容器build: context: .让 Acorn 基于同目录 Dockerfile 构建应用镜像ports: publish: 8000/http将 8000 端口对外暴露为 HTTP 端点dependsOn: [ferretdb]保证 FerretDB 容器先就绪。DB_URI中值得注意的authMechanismPLAIN参数FerretDB 不自行存储用户认证信息详见 认证文档用户名与密码必须已存在于 PostgreSQL 中客户端携带的凭据会被校验并映射到数据库权限。dev 开发模式if args.dev块为开发场景注入files卷把源码挂载到/src并设置FLASK_DEBUG1实现本地代码改动即时生效的热加载与调试体验。使用 Acorn 部署应用一切就绪后在 Acornfile 所在目录执行acorn run -n my-ferret构建完成后终端会输出应用端点与控制面摘要┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ || STATUS: ENDPOINTS[https://my-ferret-91916df9.qactc6.on-acorn.io, tcp://k8s-myferret-ferretdb-0c404ccc3f-0e3f1499f0b768c7.elb.us-east-2.amazonaws.com:27017] HEALTHY[2] UPTODATE[2] OK | └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘https://my-ferret-...on-acorn.ioTodo 应用的 HTTP 访问端点tcp://...:27017FerretDB 的 MongoDB 协议端点端口 27017 与 Acornfile 中27017/tcp发布声明对应HEALTHY[2] UPTODATE[2]两个容器app 与 ferretdb均健康且版本一致。通过该 URL 即可访问 Todo 应用新增任务会写入 FerretDB底层 PostgreSQL勾选与删除操作同样实时反映到数据库中。如需本地验证 FerretDB 协议接入可参考 Docker 安装文档 中mongosh连接 URImongodb://username:password127.0.0.1/的用法——Acorn 部署后该连接串只需将主机替换为上面输出的 27017 TCP 端点。构建与发布 Acorn 镜像开发完成、准备交付时可以像传统 Docker 工作流一样把应用打包成 Acorn 镜像。通用构建命令格式为acorn build -t registry/organization/app-name:version .例如发布到 Docker Hubacorn build -t index.docker.io/organization/my-ferret:v1.0 .该命令会把应用源码与Acornfile中声明的全部依赖含 FerretDB、PostgreSQL 服务描述编译进镜像-t指定镜像标签。若非 Docker Hub请替换 registry 前缀并确保 organization/用户名正确。推送镜像前需先登录 registryacorn login index.docker.io随后上传镜像acorn push index.docker.io/organization/my-ferret:v1.0镜像进入 registry 后任何能访问该 registry 的环境都能直接部署acorn run会自动拉取并运行acorn run index.docker.io/organization/my-ferret:v1.0如需在本地手动拉取镜像acorn pull index.docker.io/organization/my-ferret:v1.0至此基于 FerretDB 的 Todo 应用已完成容器化、打标签并可在生产环境中跨环境部署。清理环境完成验证后删除应用及其容器acorn rm my-ferret总结本文演示了完整链路从 Flask pymongo编写业务代码到 Dockerfile 容器化再到用一份 Acornfile 同时声明 PostgreSQL 服务、FerretDB 容器与应用容器最后通过acorn run部署、acorn build/push发布镜像。关键要点回顾FerretDB 兼容 MongoDB 协议与驱动如pymongo业务代码无需改动即可切换FERRETDB_POSTGRESQL_URL是 FerretDB 连接后端的核心环境变量与仓库 flags.md 中的--postgresql-url配置一一对应Acorn 通过{service.postgres.xxx}模板变量自动注入Acorn 将复杂的服务、密钥、容器、任务与配置封装为应用级抽象一份 Acornfile 即可承载完整应用配合 FerretDB 的开源属性整套方案从应用层到数据库层都不存在厂商锁定问题。无论你正在快速原型验证还是构建面向生产的应用都可以参考本指南用 Acorn 将 FerretDB 应用一键部署到云原生环境。更多 FerretDB 能力可查阅仓库内 docs 目录 与 安装文档。赞分享后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载相关推荐实战使用Zappa部署Flask和Django应用实战使用Zappa部署Flask和Django应用 本文详细介绍了使用Zappa无服务器框架部署Flask和Django应用到AWS Lambda的完整配置指云原生DevOps后端使用 Waitress 部署 Flask 应用纯 Python WSGI 服务器实战指南使用 Waitress 部署 Flask 应用纯 Python WSGI 服务器实战指南 Waitress 是一个纯 Python 实现的 WSGI 服务器后端Web框架使用 Crossplane 与 OAM 在 Kubernetes 上管理云原生应用安装、部署与实战使用 Crossplane 与 OAM 在 Kubernetes 上管理云原生应用安装、部署与实战 本文以 Kubernetes 云原生基础设施为背景系统介教程云原生容器编排创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

G6 Fruchterman 力导向布局实战指南:从基础均匀分布到聚类布局

G6 Fruchterman 力导向布局实战指南:从基础均匀分布到聚类布局

数据可视化前端图表库 【免费下载链接】G6 ♾ A Graph Visualization Framework in JavaScript. 项目地址: https://gitcode.com/gh_mirrors/g6/G6 点击查看 免费下载 Fruchterman(FR)力导向布局是图可视化中最经典的布局算法之一&#xff0…

2026/9/24 6:31:31 阅读更多 →
ROS2 实战 | 用 Launch 文件一键启动海龟 TF 广播系统

ROS2 实战 | 用 Launch 文件一键启动海龟 TF 广播系统

ROS2 实战 | 用 Launch 文件一键启动海龟 TF 广播系统 入门阶段我们通常是一个终端跑一个节点,但真实项目里,驱动、感知、规划、控制可能同时有十几个节点。如果每次都手动启动,效率太低。本文通过一个海龟 TF 广播示例,演示如何用 Launch 文件一键启动多节点系统。 一、创…

2026/9/24 6:31:31 阅读更多 →
OpenHarmony上Flutter底部导航实现:从环境搭建到状态保持与避坑

OpenHarmony上Flutter底部导航实现:从环境搭建到状态保持与避坑

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

2026/9/24 6:30:30 阅读更多 →

最新新闻

对标大厂年薪 30W+!零基础网络安全全栈学习体系:从入门到入职一站式通关!

对标大厂年薪 30W+!零基础网络安全全栈学习体系:从入门到入职一站式通关!

对标大厂年薪 30W!零基础网络安全全栈学习体系:从入门到入职一站式通关在数字化全面渗透的当下,网络安全已成为全行业的刚需核心赛道,人才缺口持续扩大,薪资水平常年稳居 IT 行业前列:头部互联网大厂、顶级…

2026/9/24 7:26:02 阅读更多 →
深入 JVM 方法字节码结构:执行模型、指令系统与栈映射帧(ASM 实战基础)

深入 JVM 方法字节码结构:执行模型、指令系统与栈映射帧(ASM 实战基础)

文档教程后端 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、…

2026/9/24 7:26:02 阅读更多 →
Win11补丁更新翻车?紧急更新决策与系统回滚指南

Win11补丁更新翻车?紧急更新决策与系统回滚指南

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

2026/9/24 7:26:02 阅读更多 →
自动化周报的技术实现:基于5层数据穿透逻辑的工程化实践

自动化周报的技术实现:基于5层数据穿透逻辑的工程化实践

手工周报不是效率问题,是数据链路断裂的工程现象在多数企业中,项目经理每周花费3小时以上拼接Excel周报——这不是流程问题,而是典型的数据孤岛与状态同步缺失。从技术角度看,其本质是三层核心实体(Goal、Plan、Task&a…

2026/9/24 7:26:02 阅读更多 →
单片机RGB颜色格式转换原理与嵌入式实战:RGB565/RGB666/RGB888详解

单片机RGB颜色格式转换原理与嵌入式实战:RGB565/RGB666/RGB888详解

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

2026/9/24 7:26:02 阅读更多 →
案例4.4 swiper和switch组件学习笔记

案例4.4 swiper和switch组件学习笔记

一、案例概述本案例设计一个小程序,演示 swiper 和 switch 组件的功能和使用方法。小程序运行后,利用 switch 组件设置 swiper 组件的属性值,从而实现 swiper 组件的各种播放效果。swiper 组件是微信小程序中用于实现轮播图(滑动视…

2026/9/24 7:25:02 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

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

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

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

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

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

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

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

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

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

2026/9/23 9:53:41 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/23 9:53:40 阅读更多 →