Plausible Analytics 项目的 Docker 镜像构建解析
2025-07-05 06:15:21作者:虞亚竹Luna
概述
Plausible Analytics 是一个轻量级的网站分析工具,其 Docker 镜像构建过程采用了多阶段构建策略,既保证了构建环境的完整性,又确保了最终镜像的轻量化。本文将深入解析其 Dockerfile 的设计思路和技术细节。
构建阶段分析
第一阶段:构建容器
构建阶段基于 hexpm/elixir
官方镜像,这是一个专为 Elixir 应用构建优化的 Alpine Linux 环境。
环境配置
- 使用 Elixir 1.18.3 和 Erlang 27.3.1 的组合
- 通过
MIX_ENV
参数控制构建环境(默认为ce
社区版) - 设置了 Node.js 相关的环境变量,包括
NODE_ENV
和NODE_OPTIONS
构建依赖安装
构建过程需要以下关键组件:
- Node.js 23.2.0(当前版本)
- Yarn 和 npm 包管理器
- Python 3
- 编译工具链(gcc, make, libc-dev)
- 其他工具如 git, wget, gnupg 等
构建流程
- Elixir 依赖处理:通过 mix 工具获取和编译项目依赖
- 前端资源构建:
- 安装 assets 和 tracker 两个前端项目的 npm 依赖
- 执行 tracker 的部署脚本
- 使用 mix 任务部署静态资源并生成摘要
- 附加数据处理:
- 下载国家/地区数据库
- 打包源代码用于 Sentry 错误跟踪
- 发布包生成:最终使用 mix release 生成可执行发布包
第二阶段:运行时容器
基于 Alpine Linux 3.21.3 的最小化镜像,确保最终镜像体积小巧。
运行时配置
- 创建专门的
plausible
用户(UID 999) - 安装必要的运行时依赖:
- OpenSSL
- ncurses
- C++ 运行时库
- 在 CE 版本中包含 certbot(用于 Let's Encrypt 证书)
文件系统准备
- 从构建阶段复制生成的发布包
- 设置数据目录
/var/lib/plausible
并配置适当权限 - 添加自定义的 docker-entrypoint.sh 脚本
运行时环境
- 工作目录设置为
/app
- 监听所有网络接口(0.0.0.0)
- 暴露 8000 端口
- 设置默认数据目录环境变量
- 定义数据卷以持久化用户数据
技术亮点
- 多阶段构建:有效分离构建环境和运行时环境,减小最终镜像体积
- 安全实践:使用非 root 用户运行应用,遵循最小权限原则
- 构建优化:
- 利用 Docker 层缓存,先复制依赖声明文件(mix.exs, package.json)
- 并行处理 Elixir 和 JavaScript 依赖
- 环境区分:通过
MIX_ENV
参数支持不同版本的构建 - QEMU 兼容性:通过
ERL_FLAGS
解决多平台构建时的 QEMU 段错误问题
使用建议
- 自定义构建:可以通过修改
MIX_ENV
参数构建不同版本的应用 - 数据持久化:确保挂载
/var/lib/plausible
卷以持久化应用数据 - 资源限制:构建阶段需要较多内存,建议为 Docker 分配至少 4GB 内存
- 平台兼容性:如需构建 ARM 版本,可能需要调整构建参数
总结
Plausible Analytics 的 Dockerfile 设计体现了现代容器化应用的最佳实践,包括安全考虑、构建优化和运行时精简。通过分析其构建过程,开发者可以学习到如何为 Elixir/Phoenix 应用设计高效的容器化方案。