在 Docker 中运行 Airflow

2025 年 6 月 11 日 | 阅读 11 分钟

引言

Apache Airflow 是一个强大的平台,用于编排复杂的业务流程和管理数据管道。它允许开发人员和数据工程师使用 Python 以编程方式定义、调度和监控业务流程。然而,由于 Airflow 依赖于数据库、消息代理以及工作节点和调度器等分布式组件,其设置可能很复杂。

在 Docker 中运行 Apache Airflow 通过将其组件封装在轻量级、可移植的容器中,简化了这一过程。Docker 化 Airflow 提供了一个一致、可重现和可扩展的环境,使其成为生产和开发设置的绝佳选择。

什么是Apache Airflow?

Apache Airflow 用于以编程方式创作、调度和监控工作流。Airflow 中的工作流使用 Python 定义,这使其具有灵活性和动态性。

在 Docker 中运行 Airflow 时,我们利用 Docker Compose 设置一个多容器环境,该环境包含以下关键组件:

  • Web 服务器:提供管理工作流的用户界面。
  • 调度器:根据任务的依赖关系将任务分配给工作节点。
  • 工作节点:根据调度器的指示执行函数。
  • 数据库:存储有关工作流、任务及其状态的元数据。
  • 代理(例如 Redis):实现调度器和工作节点之间的消息传递。

为什么选择 Docker?

使用 Docker 有几个优点:

  • 可移植性:容器确保开发、测试和生产环境之间的一致性。
  • 隔离性:Airflow 及其依赖项封装在容器中,避免了系统范围的冲突。
  • 易于部署:Docker Compose 简化了编排多个服务的过程。

前提条件

在继续之前,请确保您的系统上安装了以下工具:

  • Docker:安装最新版本的 Docker Engine。检查您的安装:
  • Docker Compose:运行多容器应用程序所需。验证安装:
  • 硬件要求
    • Docker 至少需要 4 GB 内存。
    • 至少为 Docker Desktop 分配 2 个 CPU。
  • Python(可选):本地安装 Python 有助于编写 DAG 并在容器环境之外测试它们。

设置环境变量

设置环境变量以避免硬编码敏感信息并灵活管理配置。对于 Airflow,最重要的环境变量是 AIRFLOW_UID,它确保 Docker 容器在正确的用户权限下运行。

变量设置如下:

或者,将这些变量存储在 .env 文件中:

Docker Compose 会自动加载 .env 文件。

获取 Apache Airflow 的 docker-compose.yaml

docker-compose.yaml 文件是在 Docker 中运行 Apache Airflow 的重要组成部分。此文件编排所有必要服务的设置,包括 Airflow web 服务器、调度器、工作节点、元数据数据库和消息代理。获取和理解此文件对于正确部署和操作 Airflow 至关重要。

下载的 docker-compose.yaml 定义了几个服务:

  • Airflow-webserver:运行 Airflow Web 界面。
  • Airflow-scheduler:根据 DAG 定义调度任务。
  • Airflow worker:执行调度器分配的任务。
  • Postgres:作为元数据数据库。
  • Redis:作为消息代理。
  • Airflow-init:通过设置数据库和默认配置来初始化环境。

什么是 docker-compose?

yaml

docker-compose.yaml 文件是 Docker Compose 用于定义和管理多容器 Docker 应用程序的配置文件。对于 Apache Airflow,此文件指定:

  • 服务:运行 Airflow 所需的各个组件(例如,web 服务器、调度器、工作节点、数据库、Redis)。
  • 卷:用于日志、DAG 和数据库数据的持久存储。
  • 网络:服务如何在 Docker 环境中相互通信。
  • 环境变量:传递给容器的配置设置。

为什么要使用预定义的 docker-compose.yaml?

Apache Airflow 提供了一个官方的、预配置的 docker-compose.yaml 文件,它通过以下方式简化了设置过程:

  • 确保不同 Airflow 组件之间的兼容性。
  • 减少配置错误的风险。
  • 作为可以针对特定用例进行自定义的模板。

下载 docker-compose.yaml 文件

官方 docker-compose.yaml 文件可从 Apache Airflow 文档中获取。要下载它:

使用 curl

运行以下命令获取文件:

使用 wget

或者,您可以使用 wget:

手动下载

如果您愿意,请访问官方 Apache Airflow 文档并直接下载文件。

文件位置

下载后,确保文件保存在您的工作目录中。确认其存在:

理解 docker-compose.yaml 文件

下载的 docker-compose.yaml 定义了运行 Apache Airflow 所需的几个关键服务。以下是其组件的详细分类:

Airflow Web 服务器

  • 目的:提供用户界面来管理工作流。
  • 定义为:

airflow-webserver

环境

网络

Airflow 调度器

  • 目的:根据 DAG 依赖关系将任务分配给工作节点。
  • 定义为:

airflow-scheduler

环境

网络

Airflow 工作节点

  • 目的:执行调度器分配的任务。
  • 定义为:

airflow-worker

环境

网络

Redis

  • 目的:充当调度器和工作节点之间通信的消息代理。
  • 定义为:

Redis

网络

PostgreSQL

  • 目的:作为 Airflow 的元数据数据库。
  • 定义为:

Postgres

网络

Airflow 初始化

  • 目的:初始化 Airflow 环境(例如,创建数据库架构)。
  • 定义为:

airflow-init

入口点:airflow db init

网络

  • 目的:确保数据持久性(例如,用于日志和数据库数据)。
  • 定义为:

网络

  • 目的:为服务之间的通信创建隔离网络。
  • 定义为:

网络

自定义文件

虽然提供的 docker-compose.yaml 是一个很好的起点;您可能需要根据您的用例对其进行自定义:

更改端口

为了避免与现有应用程序冲突,请修改端口映射:

端口

添加依赖项

通过扩展 Airflow 镜像来安装其他 Python 包:

更新 docker-compose.yaml 中的镜像引用:

验证文件

下载并自定义文件后,验证其语法以避免错误:

此命令检查任何语法问题并输出合并的配置。

后续步骤

一旦 docker-compose.yaml 文件准备就绪:

通过运行以下命令初始化环境:

启动所有服务:

初始化 Apache Airflow 数据库

数据库初始化是设置 Apache Airflow 的关键一步。此过程涉及创建必要的元数据数据库、设置基本配置文件以及准备 Airflow 以管理和执行工作流。以下是关于如何在 Docker 环境中初始化 Airflow 数据库的详细说明。

数据库初始化的目的

数据库初始化:

  • 设置 Airflow 操作所需的元数据数据库表。
  • 生成包含重要设置的 airflow.cfg 配置文件。
  • 创建默认用户帐户,包括用于访问 Airflow Web 界面的管理员帐户。

创建所需目录

Apache Airflow 需要特定的目录来存储日志、DAG(有向无环图)和插件。这些目录必须在初始化环境之前创建,以确保正确的挂载和数据持久性。

创建目录的命令

在终端中运行以下命令:

说明

  • ./dags:用于存储您的工作流定义(DAG 文件)的目录。
  • ./logs:用于存储 Airflow 生成的日志的目录。
  • ./plugins:用于存储自定义插件和操作符的目录。

设置环境变量

环境变量定义了 Airflow 容器的用户权限。使用 .env 文件可以简化此过程并确保设置一致。

生成 .env 文件

使用以下命令创建 .env 文件:

说明

  • AIRFLOW_UID:将当前用户的 ID 映射到容器,确保容器创建的文件与主机系统的权限匹配。
  • AIRFLOW_GID:将组 ID 设置为 0(root),确保与容器环境兼容。

验证 .env 文件

检查 .env 文件的内容:

cat .env

您应该看到类似以下内容:

运行初始化命令

要初始化数据库,您需要运行 docker-compose.yaml 文件中定义的 airflow-init 服务。

初始化命令

运行以下命令

初始化期间会发生什么?

元数据数据库设置

  • airflow.Db 模块连接到 PostgreSQL 数据库(或任何配置的后端)。
  • 创建 Airflow 元数据、用户和角色所需的表。

配置文件生成

  • airflow.cfg 文件在容器内创建。它包含执行器类型、数据库连接字符串和日志配置等关键设置。
  1. 默认管理员用户创建
    • 创建一个具有默认凭据(admin/admin)的管理员用户,以后可以更改。

清理 Apache Airflow 环境

清理环境是重置 Apache Airflow 设置或解决问题的重要任务。此过程涉及停止容器、删除持久数据和删除生成的文件,以确保一个干净的开始。

停止容器

在重置环境之前,停止所有正在运行的容器以释放资源并确保没有服务处于活动状态。

停止容器的命令

此操作:

  • 停止 docker-compose.yaml 中定义的所有容器。
  • 删除容器,但默认保留相关数据卷。
  • 断开服务与其网络的连接。

验证容器关闭

运行命令后,您可以检查是否有任何活动的容器:

空列表表示所有容器都已停止。

删除卷

Airflow 使用 Docker 卷来存储持久数据,如日志、数据库信息和配置文件。要完全重置环境,请删除这些卷。

删除卷的命令

此操作:

  • 删除存储在当前项目 Docker 卷中的所有持久数据。
  • 确保没有未使用的或“孤立的”容器或卷。

何时使用

  • 如果您想从新的数据库和日志开始。
  • 如果怀疑存在存储问题或数据损坏。

删除生成的文件

除了 Docker 卷,Airflow 还在您的主机上生成特定的文件和目录。如果您想重置本地设置,请删除这些文件。

删除生成文件的命令

删除的文件和目录:

  • ./dags:您的工作流定义。
  • ./logs:DAG 运行和任务的执行日志。
  • ./plugins:您添加的任何自定义插件。
  • airflow.cfg:初始化期间自动生成的配置文件。

最后步骤

清理后:

  • 如果需要,按照“初始化数据库”的步骤重新初始化环境。
  • 使用 `docker-compose up -d` 启动所有服务。
  • 使用 Airflow Web 界面或 CLI 命令验证设置。

清理环境可确保您的 Apache Airflow 实例处于全新且稳定的状态,无论是用于故障排除、升级还是启动新项目。

Docker Compose 中的环境变量

Docker Compose 支持使用环境变量来增强灵活性、维护安全性并简化配置。这些变量可以定义容器特定的设置、服务级属性或应用程序配置。理解和利用环境变量可以显著提高 Docker Compose 项目的可用性和可维护性。

Docker Compose 中的环境变量类型

  1. 容器的显式环境变量
    • 在 docker-compose.yaml 文件中的 `environment` 键下直接定义变量。
    • 这些变量会传递到容器的运行时环境中。
  2. 外部环境变量文件
    • 从外部 .env 文件加载变量。
  3. 全局变量
    • 在 docker-compose.yaml 文件中使用主机系统上可用的系统环境变量。
  4. 构建时变量
    • 设置在镜像构建过程中使用的环境变量,在 `build` 键下定义。

在 docker-compose.yaml 中使用环境变量

内联定义环境变量

您可以在 `environment` 键中内联定义变量:

或者,您可以使用字典样式格式:

引用系统环境变量

Docker Compose 允许使用 `${VARIABLE_NAME}` 语法引用主机环境变量:

这确保容器从主机系统继承 `API_KEY` 变量的值。

外部 .env 文件

.env 文件是一个简单的文本文件,包含环境变量的键值对。如果 .env 文件与 docker-compose.yaml 文件位于同一目录中,Docker Compose 会自动加载它。

创建 .env 文件

在同一目录中创建一个名为 .env 的文件:

使用 .env 中的变量

在您的 docker-compose.yaml 文件中:

覆盖 .env 变量

您可以通过在主机系统上导出环境变量来覆盖 .env 文件中的值。例如:

构建时变量

您可以在 docker-compose.yaml 中的 `build` 键下定义构建时变量。这在构建自定义 Docker 镜像时很有用。

示例

您还可以在运行时覆盖构建参数:

作用域变量

docker-compose.yaml 中的环境变量作用域为它们所定义的服务。在一个服务的 `environment` 键下声明的变量,除非明确共享,否则其他服务无法访问。

环境变量的优先级

Docker Compose 按照以下优先级顺序(从高到低)解析环境变量:

  • CLI 参数:直接通过 CLI 传递的变量,例如 `API_KEY=123 docker-compose up`。
  • 导出的主机变量:主机系统中可用的环境变量。
  • .env 文件中的环境变量:由 Docker Compose 自动加载。
  • docker-compose.yaml 中的默认值:直接在配置文件中定义的变量。

使用条件默认值

在 docker-compose.yaml 中为环境变量提供默认值:

如果 `ENV_VAR` 未设置,则默认为 `default_value`。

多个 .env 文件

使用 `--env-file` 标志指定不同的 .env 文件:

将 .env 与系统变量结合使用

.env 文件中的环境变量可以引用系统变量:

最佳实践

  • 将 .env 用于敏感数据
    • 将凭据、API 密钥和敏感配置存储在 .env 文件中,并将其添加到 .gitignore 以防止意外暴露。
  • 文档变量
    • 在 README.md 或 .env.example 文件中清楚地记录环境变量的目的和预期值。
  • 验证变量
    • 确保在运行容器之前设置所有必需的环境变量。使用验证脚本或在应用程序中进行检查。
  • 避免硬编码
    • 避免将敏感或特定于环境的值直接嵌入 docker-compose.yaml。

调试环境变量

要解决与环境变量相关的问题,您可以检查正在运行的容器内的环境:

检查环境变量

运行以下命令

检查日志中的变量

如果您的应用程序记录环境变量,请从容器日志中验证它们的值:

在交互式 shell 中测试变量

在容器中启动 shell 会话并检查值:

用例示例

场景

您正在使用 Docker Compose 部署一个 Web 应用程序。该应用程序需要:

  • 用于身份验证的 API 密钥。
  • 环境(例如,开发、生产)。
  • 数据库连接字符串。

注意

在 Apache Airflow 2.2 之前的版本中,docker-compose.yaml 文件通常包含一个名为 AIRFLOW_GID 的环境变量。此参数与主机系统的组 ID (GID) 相关联,并与 AIRFLOW_UID (用户 ID) 一起用于管理文件和目录权限。然而,从 Airflow 2.2 开始,它最终被认为是不必要的并被移除。

设置

.env 文件

Docker-compose.yaml

服务

DB

结果

  • 变量从 .env 文件中安全加载。
  • 应用程序可以通过修改 .env 无缝切换环境。

Docker Compose 中的环境变量提供了一种强大的方式来配置和管理您的容器化应用程序。通过有效使用 .env 文件、内联定义和系统变量,您可以为任何项目构建灵活、安全且可维护的环境。