菜单

构建系统

相关源文件

本文档解释了 Immich 中使用的构建系统,详细说明了各种组件是如何构建和打包以进行部署的。它着重于基于 Docker 的构建过程,该过程创建了在开发和生产环境中使用的容器。有关自动化这些构建的 CI/CD 流水线的信息,请参阅 CI/CD 流水线

概述

Immich 使用基于 Docker 的多阶段构建系统,为每个组件创建优化的容器。该构建系统旨在

  1. 创建一致的开发和生产环境
  2. 通过使用多阶段构建优化容器大小
  3. 支持机器学习组件的不同硬件加速选项
  4. 确保组件间的正确依赖管理

容器组件架构

下图展示了作为 Immich 系统一部分构建的主要组件

来源: server/Dockerfile web/Dockerfile machine-learning/Dockerfile cli/Dockerfile

多阶段构建过程

Immich 使用多阶段构建来优化容器大小,并分离构建时依赖项和运行时依赖项。以下是展示通用构建流程的图表

来源: server/Dockerfile machine-learning/Dockerfile

服务器组件构建

服务器组件构建过程是一个多阶段构建,其中包括编译服务器和 Web 应用程序

服务器 Dockerfile 使用一个基础开发镜像(ghcr.io/immich-app/base-server-dev),其中包含所有必要的构建工具。然后它会

  1. dev 阶段安装依赖项
  2. prod 阶段构建服务器代码
  3. web 阶段构建 Web 界面
  4. 将所有内容组合成基于 ghcr.io/immich-app/base-server-prod 的最终生产镜像

来源: server/Dockerfile1-86

机器学习组件构建

机器学习组件的构建过程最为复杂,因为它支持多种硬件加速选项

机器学习 Dockerfile 通过 DEVICE 参数进行参数化,该参数决定了要使用的硬件加速选项。构建过程

  1. 创建包含相应依赖项的硬件特定构建器镜像
  2. 根据 DEVICE 参数选择正确的构建器
  3. 在虚拟环境中安装 Python 依赖项
  4. 创建硬件特定运行时镜像
  5. 根据 DEVICE 参数选择正确的运行时镜像
  6. 将构建好的工件与运行时镜像结合,创建最终的生产镜像

来源: machine-learning/Dockerfile1-175

Web 组件构建

Web 组件的构建过程较为简单,主要用于开发

对于生产环境,Web 应用程序作为服务器构建过程的一部分进行构建。

来源: web/Dockerfile1-12 server/Dockerfile28-42

CLI 组件构建

CLI 组件的构建是一个两阶段过程,首先构建 TypeScript SDK,然后构建 CLI 应用程序

来源: cli/Dockerfile1-20

开发版本与生产版本

Immich 为开发和生产提供了不同的构建配置

开发和生产构建之间的主要区别

  1. 开发构建包含用于热重载的源代码挂载
  2. 开发构建暴露额外的端口用于调试
  3. 生产构建优化了大小和性能
  4. 生产构建只包含运行时依赖项

来源: server/Dockerfile1-17 server/Dockerfile20-26 server/Dockerfile45-86

构建环境变量

构建系统使用多个环境变量来配置构建过程

可变描述默认用于
IMMICH_VERSION容器的镜像标签releaseDocker Compose 文件
DEVICEML 组件的硬件加速cpu机器学习 Dockerfile
BUILD_ID构建的唯一标识符-服务器和 ML Dockerfile
BUILD_IMAGE构建的镜像名称-服务器和 ML Dockerfile
BUILD_SOURCE_REF构建的 Git 引用-服务器和 ML Dockerfile
BUILD_SOURCE_COMMIT构建的 Git 提交-服务器和 ML Dockerfile

这些变量用于标记构建的镜像,并提供可在运行时访问的构建信息。

来源: server/Dockerfile65-78 machine-learning/Dockerfile156-169 docs/docs/install/environment-variables.md18-25

硬件加速选项

机器学习组件支持各种硬件加速选项

在构建过程中选择合适的硬件加速选项可以显著提高机器学习组件的性能。

来源: machine-learning/Dockerfile1-3 machine-learning/Dockerfile66-125

构建项目

构建 Immich 项目

  1. 对于开发环境:使用 docker-compose -f docker-compose.dev.yml build
  2. 对于生产环境:使用 docker-compose -f docker-compose.prod.yml build

构建过程将根据指定的配置创建所需的容器。

其他构建命令可以在项目的脚本或 Makefile 中找到。

来源: server/Dockerfile machine-learning/Dockerfile web/Dockerfile cli/Dockerfile