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

发布时间:2026/9/14 11:44:30

使用 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/9/14 11:44:30

Matlab+Simulink通信系统建模实战:QPSK链路设计与信道仿真

简介:本资源是一套面向通信工程专业学生、科研初学者及MATLAB/Simulink入门工程师的实践型建模与仿真学习包,聚焦通信系统核心环节——从信源编码、调制解调(含QPSK、OFDM等典型方式)、信道建模(含噪声与衰落&#xff…

2026/9/14 11:44:30

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

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

2026/9/14 12:29:34

font-awesome图标字体加载失败排查与构建优化:从woff2 404到性能压降

简介:开发工具 Font Awesome 压缩版样式文件,是面向 Web 前端开发者的图标字体工具资源,适用于需要在网页中快速加载矢量图标、减少图片请求的个人站点、企业官网或后台管理系统等场景。文件采用单一 CSS 格式,整个资源包仅含 1 个…

2026/9/14 12:29:34

如何为 Flipper Zero 的 IR Remote 应用编写 IR 按钮地图文件?

如何为 Flipper Zero 的 IR Remote 应用编写 IR 按钮地图文件? 【免费下载链接】Flipper Playground (and dump) of stuff I make or modify for the Flipper Zero 项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper Flipper Zero 的通用红外应用需…

2026/9/14 12:24:34

STM32F103 ADC电压读取完整工程:采样周期、滤波与注入通道

简介:这个工程覆盖了基于STM32F103的模拟电压采集完整链路,包括GPIO模拟输入配置、ADC校准、12位采样精度设置、单次/连续/扫描模式切换、采样时间匹配,以及通过查询、中断或DMA读取转换结果并换算为实际电压值,特别适合刚接触STM…

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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