使用 NiceGUI 官方 Docker 镜像部署 Python Web 应用:docker-compose 实践指南

发布时间:2026/11/9 7:01:52

使用 NiceGUI 官方 Docker 镜像部署 Python Web 应用:docker-compose 实践指南 使用 NiceGUI 官方 Docker 镜像部署 Python Web 应用docker-compose 实践指南【免费下载链接】niceguiCreate web-based user interfaces with Python. The nice way.项目地址: https://gitcode.com/GitHub_Trending/ni/nicegui本篇技术指南以 NiceGUI 仓库中的 docker_image 示例 为主线完整讲解如何基于官方zauberzeug/nicegui镜像在 Docker 容器中运行 NiceGUI 应用涵盖数据持久化、非 root 用户执行PUID/PGID、SIGTERM 信号透传与优雅关闭、以及 storage secret 环境变量注入等生产级部署要点。读完本文你将掌握一套可直接复制的 Docker 化 NiceGUI 部署方案并能验证容器重启后的数据持久性与关闭行为。示例结构一览docker_image示例的完整文件结构如下examples/docker_image/ ├── README.md # 部署说明本文主体 ├── docker-compose.yml # 容器编排配置 ├── screenshot.webp # 运行界面截图 └── app/ └── main.py # 演示应用文本笔记持久化 优雅关闭回调其中 app/main.py 是一个极简的笔记持久化演示页面提供一个文本输入框输入内容会绑定到app.storage.user从而在服务器端为每个用户会话持久化保存同时注册了app.on_shutdown回调用于验证容器停止时的优雅关闭流程。使用官方镜像与 docker-compose 快速启动官方镜像为 Docker Hub 上的zauberzeug/nicegui示例中的 docker-compose.yml 将其作为唯一服务编排services: nicegui: image: zauberzeug/nicegui:latest ports: - 8080:8080 volumes: - ./app:/app # mounting local app directory environment: - PUID1000 # change this to your user id - PGID1000 # change this to your group id - STORAGE_SECRETchange-this-to-yor-own-private-secret四个关键配置项的作用如下配置项作用说明image: zauberzeug/nicegui:latest指定官方发布镜像使用latest标签即可获得最新发布版生产环境建议固定为具体版本标签以保证可复现性ports: 8080:8080端口映射NiceGUI 默认监听 8080 端口宿主机的 8080 端口被映射到容器内访问 http://localhost:8080 即可打开应用volumes: ./app:/app挂载应用目录将宿主机app目录挂载到容器内/app镜像默认工作目录容器启动后即运行其中的main.pyenvironment: PUID/PGID/STORAGE_SECRET注入环境变量控制容器内运行用户身份与存储加密密钥详见下文各小节由于镜像的工作目录为/app见 release.dockerfile 中的WORKDIR /app其默认CMD为/opt/venv/bin/python main.py挂载目录中的main.py会作为应用入口被自动执行无需额外覆写command。测试步骤按 README 的说明只需两步即可验证整套部署将docker-compose.yml中的PUID、PGID修改为宿主机当前用户的 uid/gid可通过id -u与id -g查询在examples/docker_image目录下执行docker compose up启动后访问 http://localhost:8080在文本框中输入任意内容例如一条待办笔记然后重启容器即可验证数据是否依然存在——这正是下一节数据持久化要解决的问题。如果你不使用 composeREADME 也明确指出可以用docker run加相应参数实现同样效果例如docker run -p 8080:8080 -v $(pwd)/app:/app -e PUID1000 -e PGID1000 \ -e STORAGE_SECRETchange-this-to-yor-own-private-secret zauberzeug/nicegui:latest数据持久化.nicegui目录与app.storage的落盘机制NiceGUI 会自动在应用根目录容器内即/app生成一个.nicegui目录用于保存持久化数据。从源码看这一路径由 nicegui/storage.py 中的Storage.path定义path Path(os.environ.get(NICEGUI_STORAGE_PATH, .nicegui)).resolve()即默认在当前工作目录下创建.nicegui且支持通过NICEGUI_STORAGE_PATH环境变量覆盖。当未配置 Redis 时用户存储通过 FilePersistentDict 落盘为storage-{id}.json文件见 nicegui/storage.py。示例中宿主机app目录被挂载到容器/app因此.nicegui目录会写入宿主机磁盘容器重启后依然保留。README 给出的验证方法是访问 http://localhost:8080输入一些需要存储的数据示例中即文本框里的笔记重启容器CtrlC停止后重新docker compose up再次访问页面确认数据仍然存在。示例应用之所以能记住笔记是因为 app/main.py 将输入框与app.storage.user双向绑定ui.page(/) def index(): ui.textarea(This note is kept between visits) \ .classes(w-96).bind_value(app.storage.user, note)app.storage.user是 NiceGUI 的用户级存储数据保存在服务器端、通过会话 Cookie 标识用户、可在任意时刻修改相关机制见 nicegui/storage.py。这是部署中重启后数据仍在的底层保障。注意使用app.storage.user以及app.storage.browser时必须在ui.run()中提供storage_secret否则运行时会抛出RuntimeError见 nicegui/storage.py这正是下文Storage Secret小节要处理的问题。非 Root 用户执行PUID/PGID 与文件属主容器内的应用以非 root 用户身份运行这一设计与 linuxserver.io 系列镜像的 PUID/PGID 约定一致由环境变量PUID用户 ID与PGID组 ID指定运行时身份。从 docker-entrypoint.sh 可以看到具体实现逻辑从环境变量读取PUID/PGID若未设置或非纯数字则回退为默认值1000检查该 uid/gid 对应的用户/组是否存在不存在则用groupadd/useradd创建将/app目录属主改为该用户chown -R $PUID:$PGID /app保证应用对挂载卷有写权限最后通过setpriv --reuid$PUID --regid$PGID --init-groups切换到目标用户执行容器命令且保持 PID 1 身份注释中说明这与 gosu/su-exec 等价是正确处理信号的前提。带来的直接效果是NiceGUI 运行期间产生的所有文件尤其是.nicegui持久化数据都会带有你配置的 uid/gid而不是 root 属主。这避免了容器里生成的文件在宿主机上无法删除/修改的经典权限问题。README 明确提醒测试前请把docker-compose.yml中的PUID/PGID改成自己宿主机用户的 uid/gidid -u、id -g可查这样容器内创建的文件在宿主机上完全归属于你本人。Docker 信号透传与优雅关闭官方镜像设计为将 Docker 的信号如SIGTERM透传给 NiceGUI 进程从而触发优雅关闭。技术关键在于 docker-entrypoint.sh 的最后一行exec setpriv --reuid$PUID --regid$PGID --init-groups $exec使得入口脚本进程被应用进程替换并保持 PID 1因此容器收到的信号能直接送达 NiceGUIsetpriv在切换用户的同时不丢失这一 PID 1 属性这与 gosu/su-exec 等工具的用途一致。NiceGUI 侧则通过app.on_shutdown注册关闭回调示例 app/main.py 中def handle_shutdown(): print(Shutdown has been initiated!) app.on_shutdown(handle_shutdown)验证方法按 README 的说明运行docker compose up启动容器按CtrlC停止容器Docker 会向容器发送 SIGTERM执行docker compose logs查看日志应能看到Shutdown has been initiated!的输出证明ui.shutdown流程已被触发。这意味着在滚动发布、docker compose down或资源回收等场景下应用有机会执行清理逻辑如关闭数据库连接、刷新缓存、打印审计日志而不会直接被强杀。Storage Secret从环境变量注入会话加密密钥示例中 app/main.py 的最后一行从环境变量读取存储密钥ui.run(storage_secretos.environ[STORAGE_SECRET])该值在 docker-compose.yml 中通过environment注入STORAGE_SECRETchange-this-to-yor-own-private-secret也可以来自 compose 同级目录的.env文件。这个 secret 在 NiceGUI 内部的作用是作为SessionMiddleware的secret_key用于签发和校验会话 Cookie见 nicegui/storage.py它是启用app.storage.user/app.storage.browser的前置条件ui.run()中storage_secret参数默认为None不提供时使用相关存储 API 会直接抛错nicegui/ui_run.py、nicegui/storage.py。两个实操要点务必更换默认值示例中的change-this-to-yor-own-private-secret仅为占位生产环境应替换为足够随机的私有密钥善用.env将STORAGE_SECRET...写入.env文件后compose 会自动读取并注入容器环境变量避免把密钥硬编码进docker-compose.ymlREADME 明确支持这一做法。从镜像构建看运行前提结合仓库中的 release.dockerfile可以进一步明确官方镜像的运行前提基础镜像为python:3.14-slim通过uv安装依赖并EXPOSE 8080入口为/resources/docker-entrypoint.sh即上文分析的 PUID/PGID 与信号处理逻辑默认命令是运行工作目录下的main.py因此只要把包含main.py的应用目录挂载到/app镜像就会以非 root 身份、以 PID 1 进程运行你的应用无需修改镜像本身。这套官方镜像 docker-compose 挂载 环境变量注入的模式是 NiceGUI 官方推荐的容器化部署方式它同时解决了端口暴露、代码热替换重新挂载即更新、数据持久化、文件属主与优雅关闭这五个部署中的高频问题可作为生产环境的起步模板直接套用。【免费下载链接】niceguiCreate web-based user interfaces with Python. The nice way.项目地址: https://gitcode.com/GitHub_Trending/ni/nicegui创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/30 4:31:54

Java多线程计时器原理与实战优化指南

1. 多线程计时器项目概述 在Java开发中,定时任务处理是每个中高级开发者必须掌握的技能点。这个看似简单的功能背后,隐藏着线程调度、任务队列、时间计算等复杂机制。我曾在电商促销系统中遇到过定时优惠券失效的场景,当时对Timer的理解不够深…

2026/10/28 20:35:12

基于Java Swing的股票交易模拟系统:从订单队列到JDBC事务的完整实践

简介:面向数据结构课程设计而整理的Java实战项目,实现了一款基于Swing的股票交易模拟系统,覆盖行情实时展示、系统管理、账户管理、模拟交易、技术指标与策略分析等完整功能模块,适合计算机专业学生用于课程设计、毕业设计或Java …

2026/11/9 6:58:42

低压电工证表怎么填才不白交培训费?官方报名入口在这儿

低压电工证表怎么填才不白交培训费?官方报名入口在这儿 你是不是也担心考低压电工证表的时候,钱花了却考不过,白交培训费?别急,今天我就给你讲清楚怎么填低压电工证表、怎么报、怎么考,还教你避坑,从南阳卧龙区水利工程从业者的角度出发,一步一走,稳…

2026/11/9 6:58:42

高压电工证新疆找工作值不值得考

低压电工证新疆找工作千万别踩坑,学历不高也能上手 你是不是也觉得, 学历不高怕报不上名 ?其实,像低压电工证这种特种作业操作证,对学历的要求没你想的那么高,关键是你要 避开那些坑 ,别被误导耽误了机会。…

2026/11/9 6:58:42

特种设备施工工号实操考试考什么,真实经历告诉你怎么过

特种设备施工工号实操考试考什么,真实经历告诉你怎么过 工地太忙根本没时间复习考试,这是很多特种设备施工工号的从业者最真实的感受。尤其是像安阳房建工程这类施工现场,时间紧、任务重,很多人一边忙于施工,一边还要准备考试,压力实在太大。今天就来聊…

2026/11/9 6:58:42

工地太忙根本没时间复习考试?全国中级电工证在哪考全攻略

工地太忙根本没时间复习考试?全国中级电工证在哪考全攻略 工地太忙根本没时间复习考试?全国中级电工证在哪考?这个问题其实很多一线电工都遇到过,特别是南阳卧龙区的应届工程类毕业生,刚进工地就面临考证压力,既要适应高强度工作,又要兼顾学习和考试。…

2026/11/9 6:53:42

电工作业标示牌顺序怎么排?电子证书怎么拿?电工证考前必看

电工作业标示牌顺序怎么排?电子证书怎么拿?电工证考前必看 你是不是也像我一样,手上拿着电工资质证明,却对“电工作业标示牌顺序”一知半解?别急,今天咱们就来聊清楚这件事,毕竟 没有电工证就找不到工作,更别提拿电子证书上岗了…

2026/11/9 0:37:55

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/9 0:03:09

建设厅的特种工有哪些含金量高?别交完钱考不过

建设厅的特种工有哪些含金量高?别交完钱考不过 怕考不过白交培训费?别急,先搞清楚建设厅的特种工有哪些含金量高的证,再决定是不是值得投入时间和金钱。 建设厅的特种工证是建筑行业里最基础、也最实用的证书之一,涉及多个作业类别,每种证的 含金量…

2026/11/9 0:03:09

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱 怕考不过白交培训费?荆门市电工证报名前必须知道这些避坑指南。别看网上一堆培训机构广告,真要报个电工证,很多人被坑得一塌糊涂。特别是那些打着“包过”旗号的,最后不是考试不过,就是证不是全国通…

2026/11/9 0:03:09

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑 不知道去哪报名怕被中介坑?你不是一个人。现在特种作业证报名渠道五花八门,从线下培训机构到线上代理,真假难辨。尤其是像高空电工作业这类高风险、高门槛的作业类型,证书含金量和考试通过率直接影响你…

2026/11/9 6:30:27

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑