首页
/ Plausible Analytics 项目的 Docker 镜像构建解析

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_ENVNODE_OPTIONS

构建依赖安装

构建过程需要以下关键组件:

  • Node.js 23.2.0(当前版本)
  • Yarn 和 npm 包管理器
  • Python 3
  • 编译工具链(gcc, make, libc-dev)
  • 其他工具如 git, wget, gnupg 等

构建流程

  1. Elixir 依赖处理:通过 mix 工具获取和编译项目依赖
  2. 前端资源构建
    • 安装 assets 和 tracker 两个前端项目的 npm 依赖
    • 执行 tracker 的部署脚本
    • 使用 mix 任务部署静态资源并生成摘要
  3. 附加数据处理
    • 下载国家/地区数据库
    • 打包源代码用于 Sentry 错误跟踪
  4. 发布包生成:最终使用 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 端口
  • 设置默认数据目录环境变量
  • 定义数据卷以持久化用户数据

技术亮点

  1. 多阶段构建:有效分离构建环境和运行时环境,减小最终镜像体积
  2. 安全实践:使用非 root 用户运行应用,遵循最小权限原则
  3. 构建优化
    • 利用 Docker 层缓存,先复制依赖声明文件(mix.exs, package.json)
    • 并行处理 Elixir 和 JavaScript 依赖
  4. 环境区分:通过 MIX_ENV 参数支持不同版本的构建
  5. QEMU 兼容性:通过 ERL_FLAGS 解决多平台构建时的 QEMU 段错误问题

使用建议

  1. 自定义构建:可以通过修改 MIX_ENV 参数构建不同版本的应用
  2. 数据持久化:确保挂载 /var/lib/plausible 卷以持久化应用数据
  3. 资源限制:构建阶段需要较多内存,建议为 Docker 分配至少 4GB 内存
  4. 平台兼容性:如需构建 ARM 版本,可能需要调整构建参数

总结

Plausible Analytics 的 Dockerfile 设计体现了现代容器化应用的最佳实践,包括安全考虑、构建优化和运行时精简。通过分析其构建过程,开发者可以学习到如何为 Elixir/Phoenix 应用设计高效的容器化方案。