
医疗健康后端【免费下载链接】openemrThe most popular open source electronic health records and medical practice management solution.项目地址https://gitcode.com/GitHub_Trending/op/openemr点击查看免费下载导读本文围绕 OpenEMR 官方 Docker 镜像openemr/openemr展开这是开源电子健康记录EHR与诊所管理系统 OpenEMR 的标准容器化分发方式。文章以 docker/dockerhub/overview.md 为主线系统讲解镜像标签体系、环境变量自动安装机制、Redis 会话存储、集群/编排模式、flex 开发镜像系列以及版本自动升级流程并结合仓库内 docker/binary/auto_configure.php、docker/production/docker-compose.yml、docker/HOOKS.md 等源码与配置帮助读者从能跑起来进阶到可配置、可运维、可二次开发。一、镜像定位与总体架构OpenEMR 官方 Docker 镜像支持自动化安装与配置 OpenEMR但它不是独立运行的必须搭配一个 MySQL/MariaDB 容器作为数据库伴生服务。镜像通过容器启动时的初始化流程自动完成数据库建库、建表、初始管理员账号创建等全部安装工作让用户从零到可用的 EHR 系统只需要一次docker compose up。从仓库结构看镜像源代码分为三套参见 docker/README.md目录镜像类型分支范围发布的标签docker/release/生产镜像master 与每个rel-*分支版本号标签如8.0.0.3、7.0.4与浮动别名latest/next/devdocker/flex/flex 开发镜像仅 masterflex、flex-3.22、flex-3.23、flex-edge及flex-alpine-php-php变体docker/binary/二进制发布镜像仅 master面向离线/设备场景的特定二进制构建生产镜像与 flex 镜像的最大差异在于生产镜像把指定版本的 OpenEMR 源码烘焙进镜像而 flex 镜像在容器运行时从 git 仓库拉取指定分支/标签的 OpenEMR 源码因此天然支持任意版本组合专供测试与开发人员使用。二、镜像标签体系2.1 生产标签Supported tags生产镜像按发布行release row发布标签典型的标签形式包括版本号标签如8.0.0.3、7.0.4精确对应某个 OpenEMR 版本浮动别名latest—— 指向最新的稳定生产版本注意并非绝对最新的构建next和dev承载的是开发中版本参见 DOCKER_README.mdnext—— 指向即将发布的下一个稳定版所在的rel-*分支头部dev—— 指向 master 头部活跃开发版本。2.2 不可变日期标签每次生产构建还会额外推送一个不可变的X.Y.Z-YYYY-MM-DD标签例如8.1.0-2026-06-17用于精确钉住某次构建。即使同一版本后续被重新构建该日期标签也不会改变从而保证部署的可复现性。生产环境建议始终指定具体版本号而非latest确保构建流程拉取到的镜像符合预期。2.3 flex 标签flex 系列标签形如flex-alpine版本-php-php版本其中默认 PHP 版本额外提供flex-alpine版本简写默认 flex 默认 PHP 时提供裸标签flex。例如flex-3.22Alpine 3.22、flex-edgeAlpine Edge等均面向测试与开发人员。2.4 标签渲染流水线源码视角标签列表并非手写而是由 docker/dockerhub/render.sh 从 .github/release-targets.yml生产发布行与.github/workflows/docker-build-*.ymlflex 调用方工作流动态渲染进overview.md模板的四个占位符__CURRENT_LATEST_VERSION__—— 携带latest标签的那一行的版本号__SUPPORTED_TAGS_RELEASE__—— 按当前最新 → 旧版本按版本倒序→ next → dev的顺序渲染的生产标签列表__SUPPORTED_TAGS_FLEX__—— 按非 edge 的 Alpine 版本倒序 → edge 最后的顺序渲染的 flex 标签列表__DATED_EXAMPLE__—— 由latest版本号 当日 UTC 日期组成的示例日期标签。渲染出的最终说明文字由docker-push-dockerhub-readme.yml工作流推送到 Docker Hub 仓库主页整个过程受 docker/dockerhub/tests/sanity.sh 与 golden 测试双重守护。三、自动安装环境变量详解官方镜像支持零手工干预的自动化安装。启动容器时只需提供必需的环境变量初始化脚本便会完成全部安装。3.1 必需变量环境变量说明MYSQL_HOST伴生 MySQL/MariaDB 容器的主机名服务名MYSQL_ROOT_PASS数据库 root 密码可通过传入BLANK强制密码为空3.2 可选变量数据库参数环境变量默认值说明MYSQL_ROOT_USERroot数据库 root 用户名MYSQL_USERopenemrOpenEMR 专用数据库账号MYSQL_PASSopenemr上述账号的密码MYSQL_DATABASEopenemr数据库名MYSQL_PORT3306数据库端口OpenEMR 管理账号参数环境变量默认值说明OE_USERadmin首次登录的初始管理员用户名OE_PASSpass初始管理员密码生产环境务必修改3.3 底层实现auto_configure.php这些环境变量最终由容器入口脚本转换为命令行参数交给 docker/binary/auto_configure.php 执行安装。该脚本先加载 OpenEMR 的 Composer 自动加载器再定义一组与上述变量一一对应的默认安装设置管理员账号iuseradmin、iunameAdministrator、iuserpasspass、igroupDefault数据库连接serverlocalhost、loginhostlocalhost、port3306root 凭据rootroot、rootpassBLANKBLANK会被转换为空字符串OpenEMR 数据库账号loginopenemr、passopenemr、dbnameopenemr字符集collateutf8mb4_general_ci推荐完整支持 Unicode 与多语言字符站点sitedefaultOpenEMR 支持单代码库多站点部署高级选项source_site_id、clone_database、no_root_db_access、development_translations默认均为BLANK空。脚本支持两种参数解析方式常规keyvalue参数以及-f servermysql rootpassroot一次性传入多个键值对容器入口即采用后者。安装核心是实例化Installer类并调用quick_install()它负责连接数据库、创建数据库与专用账号、建表、写初始配置、创建管理员失败时抛出异常使容器启动失败避免出现半装状态。3.4 生产级 docker-compose 示例仓库提供了可直接投入生产的最小示例 docker/production/docker-compose.yml关键结构如下services: mysql: restart: always image: mariadb:12.3.3sha256:805c8e104bd563d5bfa24fadd3f31cd419ea859cb5277f32b5dbf2db714f9ed1 command: [mariadbd, --character-set-serverutf8mb4] volumes: - databasevolume:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: root openemr: restart: always image: openemr/openemr:latestsha256:a8e4386f6d9a44f17add20c20e6dbc53c7092e855500ae62eac3cd5e47c45daa ports: - 80:80 - 443:443 volumes: - logvolume01:/var/log - sitevolume:/var/www/localhost/htdocs/openemr/sites environment: MYSQL_HOST: mysql MYSQL_ROOT_PASS: root MYSQL_USER: openemr MYSQL_PASS: openemr OE_USER: admin OE_PASS: pass depends_on: mysql: condition: service_healthy volumes: logvolume01: {} sitevolume: {} databasevolume: {}要点解读数据库容器显式指定--character-set-serverutf8mb4与 OpenEMR 侧的utf8mb4_general_ci字符集对齐必须为/var/www/localhost/htdocs/openemr/sites配置命名卷sitevolume这是后续版本自动升级的前提条件之一详见第六节depends_on使用condition: service_healthy等待数据库就绪OpenEMR 容器自身的健康检查指向https://localhost/meta/health/readyz生产示例同时适用于 amd64 与 arm64含 Raspberry Pi镜像引用使用 SHA 摘要钉住版本保证拉取结果确定。四、端口、TLS 与全局设置4.1 端口与证书镜像使用 80标准 HTTP与 443HTTPS/SSL两个端口。默认情况下 443 使用自签名证书如果设置了DOMAIN环境变量以及可选的EMAIL容器会自动通过 Lets Encrypt 申请、续期并维护正式证书实现生产环境的全自动 HTTPS。4.2 OpenEMR 全局设置OPENEMR_SETTING_*OpenEMR 的数百项全局配置可以通过OPENEMR_SETTING_*前缀环境变量直接注入。命名规则为把全局设置项名如rest_api替换到前缀后即OPENEMR_SETTING_rest_api。典型用法是开启 REST APIenvironment: OPENEMR_SETTING_rest_api: 1这种机制让运维人员可以在不进入 Web 管理界面的情况下通过 compose 文件声明式地完成全局配置。4.3 手动安装模式如果希望绕过自动安装、由人工完成全部安装流程可将MANUAL_SETUP环境变量设为yes。适合需要对安装过程进行深度定制如指定复杂网络拓扑、接入既有数据库的场景。4.4 强制数据库加密连接从7.0.1及 flex3.15-8、edge、3.17系列开始可通过以下两个参数强制数据库连接使用 SSL 或 X509环境变量取值作用FORCE_DATABASE_SSL_CONNECT1强制数据库 SSL 加密连接FORCE_DATABASE_X509_CONNECT1强制数据库 X509 证书认证连接使用前必须确保数据库侧已正确配置 SSL/X509 证书。五、Redis 会话存储两种模式镜像支持 Redis 会话存储且提供两种截然不同的工作模式均从5.0.2与flex*镜像开始支持5.1 Redis Native Mode原生直连模式直接连接单个 Redis 实例会话由php.ini层配置环境变量必填/可选说明REDIS_SERVER必填Redis 主机或host:port格式REDIS_USERNAME可选Redis 用户名REDIS_PASSWORD可选Redis 密码适用场景为单实例 Redis、无需故障转移的小型部署。5.2 Predis Sentinel Mode哨兵高可用模式通过 Redis Sentinel 实现自动故障转移与分布式会话锁会话在 PHP 应用层配置而非 php.ini。从8.1.0与flex*镜像开始支持是Kubernetes 部署的推荐模式。环境变量必填/可选说明SESSION_STORAGE_MODE必填设为predis-sentinel以启用REDIS_SENTINELS必填哨兵主机列表多个用\|\|\|分隔REDIS_MASTER必填哨兵主节点名称master nameREDIS_MASTER_PASSWORD必填Redis 密码REDIS_SENTINELS_PASSWORD可选哨兵密码REDIS_TLS可选设为yes启用 TLSREDIS_TLS_CERT_KEY_PATH可选证书目录路径内含redis-master-ca、redis-master-cert、redis-master-key、redis-sentinel-ca、redis-sentinel-cert、redis-sentinel-key等证书文件REDIS_X509可选设为yes启用 mTLS双向认证REDIS_SESSION_LOCK_TTL可选会话锁 TTL默认60秒REDIS_SESSION_LOCK_MAX_WAIT可选会话锁最大等待时间默认60秒仓库内的 docker/development-easy-redis/docker-compose.yml 提供了 easy-dev Redis 会话存储的组合示例可作为配置参考。六、编排与集群模式SWARM_MODE镜像支持开启 Kubernetes / Docker Swarm / 编排 / 复制部署支持将SWARM_MODE设为yes即可。Docker Swarm适用于5.0.2与flex*镜像Kubernetes适用于6.0.0与flex*镜像。在此模式下以下共享卷是必需的/var/www/localhost/htdocs/openemr/sites/etc/ssl/etc/letsencrypt这保证了多副本/多节点场景下站点数据、SSL 证书与 Lets Encrypt 凭证的一致性。结合上一节的 Predis Sentinel 会话模式应用层分布式会话锁即可构成高可用的多副本 OpenEMR 集群。七、容器生命周期钩子8.4.0从8.4.0起生产镜像支持在容器生命周期事件中挂载并执行 run-parts 兼容的脚本包帮助带定制代码/模块的厂商与管理员应对发布节奏更快、安全影响更强的升级场景。完整语法与示例见 docker/HOOKS.md。钩子目录由HOOKS_ROOT指定默认/root/hooks包含四个生命周期点目录触发时机${HOOKS_ROOT}/postconfig首次配置完成后运行永不重跑${HOOKS_ROOT}/postupgrade升级完成后运行仅在权威容器上即标准部署中的唯一容器或 Swarm/Kubernetes 模式下的领导者${HOOKS_ROOT}/prelaunch所有容器设置完成后、每次启动时运行${HOOKS_ROOT}/tooearly任何容器设置开始前运行面向调试与救援不建议常规部署使用钩子脚本要求仅由字母、数字、下划线、连字符组成的文件名不含点、需设置为可执行、由 run-parts 严格按字母序执行任一脚本返回非零都会导致容器启动失败。在 compose 中以只读卷挂载即可volumes: - logvolume01:/var/log - sitevolume:/var/www/localhost/htdocs/openemr/sites - vendor_prelaunch:/root/hooks/prelaunch:ro volumes: vendor_prelaunch: driver_opts: type: none device: 主机上钩子目录的绝对路径 o: bindprelaunch钩子的典型输出会出现在容器日志中例如openemr-1 | WARNING: /root/hooks/prelaunch/02nope has a shebang but is not executable; run-parts will skip it openemr-1 | hiiii openemr-1 | prelaunch hook OK openemr-1 | [TIMING] Step 15-PreApache: 2.0s elapsed openemr-1 | Starting Apache!注意postconfig与postupgrade若执行失败会导致本次启动失败但由于成功事件不可回滚下次启动时生命周期点已过、不会重试钩子脚本继承openemr.sh的 root 权限相关安全与文件属主问题需自行评估。八、flex 开发镜像系列flex*镜像如flex-3.22基于 Alpine 3.22、flex-edge基于 Alpine Edge面向测试与开发人员允许从指定 git 仓库拉取任意 OpenEMR 版本。8.1 核心必填变量环境变量说明FLEX_REPOSITORY存放目标 OpenEMR 版本的公开 git 仓库地址FLEX_REPOSITORY_BRANCH或FLEX_REPOSITORY_TAG二选一指定该仓库中的分支或标签8.2 特殊开关环境变量取值作用EMPTYyes不安装任何 OpenEMR便于开发人员从宿主机挂载共享卷FORCE_NO_BUILD_MODEyes强制跳过 composer/npm 构建 OpenEMR 依赖包与前端资源EASY_DEV_MODE/EASY_DEV_MODE_NEWyes启用easy development environment开发环境INSANE_DEV_MODEyes在insane development environment中使用开发工具DEVELOPER_TOOLSyes安装开发/测试工具与软件包GITHUB_COMPOSER_TOKEN字符串放置 GitHub 认证令牌XDEBUG_ON1开启 xdebug 支持XDEBUG_PROFILER_ON1开启 xdebug 性能剖析XDEBUG_IDE_KEY/XDEBUG_CLIENT_HOST/XDEBUG_CLIENT_PORT可选xdebug 的可选配置项DEMO_MODEstandard载入标准演示数据SQL_DATA_DRIVE容器内路径该路径下所有*.sql文件都会载入 OpenEMR 数据库这些开关与仓库内的开发环境一一对应easy 开发环境见 docker/development-easy/及其轻量版 docker/development-easy-light/ 与 Redis 版 docker/development-easy-redis/复杂全栈开发环境见 docker/development-insane/README.md。flex 镜像的完整用法见 docker/flex/README.md。需要强调的是除非你清楚自己在做什么否则不建议将 flex 系列用于生产环境。九、版本自动升级流程镜像支持从5.0.1到最新生产标签例如latest对应的当前版本的自动升级注意flex 系列不支持此功能。升级操作极其简单——在docker-compose.yml中把镜像版本标签如5.0.1改为最新生产版本标签然后执行docker compose up容器启动时会自动执行升级流程。但有以下关键限制不支持补丁版本升级例如7.0.3→7.0.3.4不会生效必须设置共享卷升级依赖/var/www/localhost/htdocs/openemr/sites目录的共享卷若未设置共享卷、或将共享卷设成整个/var/www/localhost/htdocs/openemr目录升级都将无法工作升级前务必完整备份。十、镜像性能与运行机制补充docker/release/README.md 记录了生产镜像的两项关键性能优化构建期文件权限文件权限在 Docker 构建阶段设置完毕目录500、文件400、sites/default/为700、sites/default/documents/为700/600、sqlconf.php为666容器启动时不再扫描约 1.5 万个文件做chmod/chown显著缩短启动时间内存优化将文件扫描移到构建期后运行时 Linux page cache 不会被无关文件撑大实测平均内存占用大幅下降。如需复现这些基准数据可进入 docker/container_benchmarking/ 运行./benchmark.sh。镜像的整个发布流水线每日 06:00 UTC 的生产编排器、02:00 UTC 的 flex 发布、标签漂移守卫与 Docker Hub 说明重推均托管于本仓库的.github/workflows/下入口概述见 docker/README.md历史迁移细节见 docs/docker-migration-from-devops.md。结语从单机 docker-compose 一键拉起到 Swarm/Kubernetes 多副本集群再到携带 xdebug 与演示数据的 flex 开发镜像openemr/openemr官方镜像用一套环境变量约定覆盖了生产、运维、测试、开发的全生命周期需求。掌握MYSQL_*、OE_*、OPENEMR_SETTING_*、REDIS_*、SWARM_MODE、FLEX_*等变量的语义与组合方式就能把 OpenEMR 的容器化部署从能运行推进到可控、可升级、可扩展的工程化水平。赞分享医疗健康后端【免费下载链接】openemrThe most popular open source electronic health records and medical practice management solution.项目地址https://gitcode.com/GitHub_Trending/op/openemr点击查看免费下载相关推荐OpenEMR 官方 Docker 容器体系深度解析生产镜像、开发环境与发布流水线OpenEMR 官方 Docker 容器体系深度解析生产镜像、开发环境与发布流水线 OpenEMR 是目前最流行的开源电子健康档案EHR与诊所管理解决方案医疗健康后端Gel 官方 Docker 镜像部署指南从 docker run 到 Docker Compose 的生产级配置Gel 官方 Docker 镜像部署指南从 docker run 到 Docker Compose 的生产级配置 本篇指南以仓库内 docker.rst ht数据库图数据库关系型数据库MARS5-TTS Docker部署完全指南从镜像构建到生产环境配置MARS5 TTS Docker部署完全指南从镜像构建到生产环境配置 MARS5 TTS是一款来自CAMB.AI的语音合成模型本指南将带你完成从Docker上一篇ZeroClaw ESP32 固件实战指南基于 JSON-over-Serial 的 GPIO 外设接入与构建烧录下一篇PaddleOCR MCP Server 集成指南将 OCR 与文档解析能力接入大模型应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考