在 Docker 中运行 Airflow¶
本快速入门指南将允许您使用 Docker 中的 CeleryExecutor 快速启动和运行 Airflow。
注意
此过程可能对学习和探索很有用。但是,将其应用于实际情况可能会很复杂。对此过程进行更改需要 Docker 和 Docker Compose 方面的专业知识,并且 Airflow 社区可能无法为您提供帮助。
因此,我们建议您在准备好在生产环境中运行 Airflow 时,将 Kubernetes 与 官方 Airflow 社区 Helm Chart 一起使用。
在开始之前¶
此过程假定您熟悉 Docker 和 Docker Compose。如果您以前没有使用过这些工具,则应该花点时间阅读 Docker 快速入门(尤其是关于 Docker Compose 的部分),以便您熟悉它们的工作原理。
如果您尚未安装必要的工具,请按照以下步骤操作。
在您的工作站上安装 Docker 社区版 (CE)。根据您的操作系统,您可能需要将 Docker 配置为至少使用 4.00 GB 内存,以便 Airflow 容器正常运行。有关更多信息,请参阅 Docker for Windows 或 Docker for Mac 文档中的“资源”部分。
在您的工作站上安装 Docker Compose v2.14.0 或更高版本。
旧版本的 docker-compose
不支持 Airflow docker-compose.yaml
文件所需的所有功能,因此请仔细检查您的版本是否满足最低版本要求。
提示
macOS 上 Docker 可用的默认内存量通常不足以启动和运行 Airflow。如果分配的内存不足,可能会导致 Web 服务器不断重启。您应该为 Docker 引擎分配至少 4GB 内存(最好是 8GB)。
您可以通过运行以下命令来检查您的内存是否足够
docker run --rm "debian:bullseye-slim" bash -c 'numfmt --to iec $(echo $(($(getconf _PHYS_PAGES) * $(getconf PAGE_SIZE))))'
警告
一些操作系统(Fedora、ArchLinux、RHEL、Rocky)最近引入了内核更改,导致 Docker Compose 中的 Airflow 在操作系统团队维护的社区 Docker 实现中运行时会消耗 100% 的内存。
这是 containerd 配置向后不兼容的问题,Airflow 的一些依赖项存在此问题,并在以下几个问题中进行了跟踪
containerd 团队目前还没有解决方案,但似乎安装 Linux 版 Docker Desktop 可以解决 此评论 中所述的问题,并允许 Breeze 正常运行。
获取 docker-compose.yaml
¶
要在 Docker Compose 上部署 Airflow,您应该获取 docker-compose.yaml。
curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.9.2/docker-compose.yaml'
重要
从 2023 年 7 月开始,Compose V1 停止接收更新。我们强烈建议升级到 Docker Compose 的较新版本,提供的 docker-compose.yaml
在 Compose V1 中可能无法正常运行。
此文件包含多个服务定义
airflow-scheduler
- 调度程序 监视所有任务和 DAG,然后在其依赖项完成后触发任务实例。airflow-webserver
- Web 服务器位于http://localhost:8080
。airflow-worker
- 执行调度程序给定任务的工作程序。airflow-triggerer
- 触发器为可延迟任务运行事件循环。airflow-init
- 初始化服务。postgres
- 数据库。redis
- Redis - 将消息从调度程序转发到工作程序的代理。
或者,您可以通过添加 --profile flower
选项来启用 flower,例如 docker compose --profile flower up
,或者在命令行中显式指定它,例如 docker compose up flower
。
flower
- 用于监控环境的 Flower 应用程序。它位于http://localhost:5555
。
所有这些服务都允许您使用 CeleryExecutor 运行 Airflow。有关更多信息,请参阅 架构概述。
容器中的一些目录是挂载的,这意味着它们的内容在您的计算机和容器之间同步。
./dags
- 您可以将您的 DAG 文件放在这里。./logs
- 包含来自任务执行和调度程序的日志。./config
- 您可以添加自定义日志解析器或添加airflow_local_settings.py
来配置集群策略。./plugins
- 您可以将您的 自定义插件 放在这里。
此文件使用最新的 Airflow 镜像 (apache/airflow)。如果您需要安装新的 Python 库或系统库,您可以 构建您的镜像。
初始化环境¶
在第一次启动 Airflow 之前,您需要准备您的环境,即创建必要的文件、目录并初始化数据库。
设置正确的 Airflow 用户¶
在 Linux 上,快速入门需要知道您的主机用户 ID,并且需要将组 ID 设置为 0
。否则,在 dags
、logs
和 plugins
中创建的文件将使用 root
用户所有权创建。您必须确保为 docker-compose 配置它们
mkdir -p ./dags ./logs ./plugins ./config
echo -e "AIRFLOW_UID=$(id -u)" > .env
对于其他操作系统,您可能会收到警告,指出未设置 AIRFLOW_UID
,但您可以安全地忽略它。您也可以在与 docker-compose.yaml
相同的文件夹中手动创建一个包含以下内容的 .env
文件,以消除警告
AIRFLOW_UID=50000
初始化数据库¶
在所有操作系统上,您都需要运行数据库迁移并创建第一个用户帐户。 为此,请运行。
docker compose up airflow-init
初始化完成后,您应该会看到如下消息
airflow-init_1 | Upgrades done airflow-init_1 | Admin user airflow created airflow-init_1 | 2.9.2 start_airflow-init_1 exited with code 0
创建的帐户的登录名为 airflow
,密码为 airflow
。
清理环境¶
我们准备的 docker-compose 环境是一个“快速入门”环境。 它并非设计用于生产环境,并且存在许多注意事项 - 其中之一是从任何问题中恢复的最佳方法是将其清理并从头开始重新启动。
最好的方法是
在您下载
docker-compose.yaml
文件的目录中运行docker compose down --volumes --remove-orphans
命令删除您下载
docker-compose.yaml
文件的整个目录rm -rf '<DIRECTORY>'
从头开始完成本指南,从重新下载
docker-compose.yaml
文件开始
运行 Airflow¶
现在您可以启动所有服务
docker compose up
注意
docker-compose 是旧语法。 请查看 Stackoverflow。
在第二个终端中,您可以检查容器的状态,并确保没有容器处于不健康状态
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
247ebe6cf87a apache/airflow:2.9.2 "/usr/bin/dumb-init …" 3 minutes ago Up 3 minutes (healthy) 8080/tcp compose_airflow-worker_1
ed9b09fc84b1 apache/airflow:2.9.2 "/usr/bin/dumb-init …" 3 minutes ago Up 3 minutes (healthy) 8080/tcp compose_airflow-scheduler_1
7cb1fb603a98 apache/airflow:2.9.2 "/usr/bin/dumb-init …" 3 minutes ago Up 3 minutes (healthy) 0.0.0.0:8080->8080/tcp compose_airflow-webserver_1
74f3bbe506eb postgres:13 "docker-entrypoint.s…" 18 minutes ago Up 17 minutes (healthy) 5432/tcp compose_postgres_1
0bd6576d23cb redis:latest "docker-entrypoint.s…" 10 hours ago Up 17 minutes (healthy) 0.0.0.0:6379->6379/tcp compose_redis_1
访问环境¶
启动 Airflow 后,您可以通过 3 种方式与其交互
运行 CLI 命令¶
您也可以运行 CLI 命令,但您必须在定义的 airflow-*
服务之一中执行此操作。 例如,要运行 airflow info
,请运行以下命令
docker compose run airflow-worker airflow info
如果您使用的是 Linux 或 Mac OS,则可以简化您的工作并下载可选的包装器脚本,以便您使用更简单的命令运行命令。
curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.9.2/airflow.sh'
chmod +x airflow.sh
现在您可以更轻松地运行命令。
./airflow.sh info
您还可以使用 bash
作为参数进入容器中的交互式 bash shell,或使用 python
进入 python 容器。
./airflow.sh bash
./airflow.sh python
向 REST API 发送请求¶
REST API 当前支持 基本用户名密码身份验证,这意味着您可以使用常用工具向 API 发送请求。
Web 服务器位于:http://localhost:8080
。 默认帐户的登录名为 airflow
,密码为 airflow
。
这是一个示例 curl
命令,它发送一个请求来检索池列表
ENDPOINT_URL="http://localhost:8080/"
curl -X GET \
--user "airflow:airflow" \
"${ENDPOINT_URL}/api/v1/pools"
使用自定义镜像¶
当您想在本地运行 Airflow 时,您可能希望使用包含一些附加依赖项的扩展镜像 - 例如,您可以添加新的 Python 包,或将 Airflow 提供程序升级到更高版本。 这可以通过在您的 docker-compose.yaml
中指定 build: .
并在您的 docker-compose.yaml
旁边放置一个自定义 Dockerfile 来轻松完成。 然后您可以使用 docker compose build
命令来构建您的镜像(您只需要执行一次)。 您还可以在运行其他 docker compose
命令时,将 --build
标志添加到您的 docker compose
命令中,以便在运行中重建镜像。
您可以在 构建镜像 中找到如何使用自定义提供程序、python 包、apt 包等扩展镜像的示例。
注意
创建自定义镜像意味着您还需要维护一定程度的自动化,因为当您要安装的软件包或 Airflow 升级时,您需要重新创建镜像。 请不要忘记保留这些脚本。 还要记住,如果您运行纯 Python 任务,您可以使用 Python Virtualenv 函数,它将在运行时动态获取和安装 Python 依赖项。 使用 Airflow 2.8.0,Virtualenvs 也可以被缓存。
特殊情况 - 通过 requirements.txt 文件添加依赖项¶
自定义镜像的常见情况是,当您想向其中添加一组需求时 - 通常存储在 requirements.txt
文件中。 对于开发,您可能会倾向于在启动原始 airflow 镜像时动态添加它,但这会产生许多副作用(例如,您的容器启动速度会慢得多 - 每个额外的依赖项都会进一步延迟您的容器启动时间)。 这也是完全没有必要的,因为 docker compose 内置了开发工作流程。 您可以按照上一章,在使用 docker compose 进行本地迭代时自动构建和使用您的自定义镜像。 具体来说,当您想添加自己的需求文件时,您应该执行以下步骤
注释掉
image: ...
行并从docker-compose.yaml
文件中的build: .
行中删除注释。 您的 docker-compose 文件的相关部分应类似于(使用正确的镜像标签)
#image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.9.2}
build: .
在您的
docker-compose.yaml
文件所在的同一文件夹中创建Dockerfile
,其内容类似于
FROM apache/airflow:2.9.2
ADD requirements.txt .
RUN pip install apache-airflow==${AIRFLOW_VERSION} -r requirements.txt
最佳做法是安装与原始镜像中相同的 apache-airflow 版本。 这样,您可以确保 pip
在安装其他需求时不会尝试降级或升级 apache airflow,这可能会在您尝试添加与您正在使用的 apache-airflow 版本冲突的依赖项时发生。
将
requirements.txt
文件放在同一目录中。
运行 docker compose build
来构建镜像,或者在 docker compose up
或 docker compose run
命令中添加 --build
标志以根据需要自动构建镜像。
特殊情况 - 添加自定义配置文件¶
如果您有一个自定义配置文件并希望在您的 Airflow 实例中使用它,您需要执行以下步骤
从
docker-compose.yaml
文件中的AIRFLOW_CONFIG: '/opt/airflow/config/airflow.cfg'
行中删除注释。将您的自定义
airflow.cfg
文件放在本地配置文件夹中。如果您的配置文件的名称与
airflow.cfg
不同,请调整AIRFLOW_CONFIG: '/opt/airflow/config/airflow.cfg'
中的文件名
网络¶
通常,如果您想在本地使用 Airflow,您的 DAG 可能会尝试连接到主机上运行的服务器。 为了实现这一点,必须在 docker-compose.yaml
中添加额外的配置。 例如,在 Linux 上,配置必须位于 services: airflow-worker
部分,添加 extra_hosts: - "host.docker.internal:host-gateway"
;并使用 host.docker.internal
代替 localhost
。 此配置因平台而异。 有关 Windows 和 Mac 的更多信息,请查看 Docker 文档。
使用 PyCharm 调试 docker 容器内的 Airflow¶
先决条件:在 PyCharm 中创建一个项目并下载 (docker-compose.yaml)。
步骤
修改
docker-compose.yaml
在
services
部分下添加以下部分
airflow-python:
<<: *airflow-common
profiles:
- debug
environment:
<<: *airflow-common-env
user: "50000:0"
entrypoint: ["bash"]
注意
此代码段创建了一个名为 “airflow-python” 的新服务,专门用于 PyCharm 的 Python 解释器。 在 Linux 系统上,如果您执行了命令 echo -e "AIRFLOW_UID=$(id -u)" > .env
,则需要在 airflow-python
服务中设置 user: "50000:0"
以避免 PyCharm 的 Unresolved reference 'airflow'
错误。
配置 PyCharm 解释器
打开 PyCharm 并导航到 设置(或 macOS 上的 偏好设置)> 项目:<您的项目名称> > Python 解释器。
单击 “添加解释器” 按钮并选择 “在 Docker Compose 上”。
在“配置文件”字段中,选择您的
docker-compose.yaml
文件。在“服务”字段中,选择新添加的
airflow-python
服务。点击“下一步”,然后按照提示完成配置。
构建解释器索引可能需要一些时间。配置完成后,您可以在容器环境中调试 Airflow 代码,模拟您的本地设置。
常见问题解答¶
ModuleNotFoundError: No module named 'XYZ'
¶
Docker Compose 文件使用最新的 Airflow 镜像(apache/airflow)。如果您需要安装新的 Python 库或系统库,您可以自定义和扩展它。
Docker Compose 支持的环境变量¶
不要将此处的变量名称与构建镜像时设置的构建参数混淆。AIRFLOW_UID
构建参数在构建镜像时默认为 50000
,因此它被“烘焙”到镜像中。另一方面,可以使用 - 例如 - id -u
命令的结果在容器运行时设置以下环境变量,这允许使用在构建镜像时未知的动态主机运行时用户 ID。
变量 |
描述 |
默认值 |
---|---|---|
|
要使用的 Airflow 镜像。 |
apache/airflow:2.9.2 |
|
运行 Airflow 容器的用户 UID。如果您想使用非默认的 Airflow UID,请覆盖此项(例如,当您从主机映射文件夹时,应将其设置为 |
|
注意
在 Airflow 2.2 之前,Docker Compose 也有 AIRFLOW_GID
参数,但它没有提供任何额外的功能 - 只会增加混乱 - 因此它已被删除。
如果您正在尝试/测试通过 Docker Compose 安装 Airflow,则这些附加变量非常有用。它们不打算在生产环境中使用,但它们使环境能够更快地为首次使用的用户提供最常见的自定义设置。
变量 |
描述 |
默认值 |
---|---|---|
|
管理员 UI 帐户的用户名。如果指定了此值,则会自动创建管理员 UI 用户。这仅在您想试用 Airflow 并想启动一个包含嵌入式开发数据库的容器时有用。 |
airflow |
|
管理员 UI 帐户的密码。仅在设置了 |
airflow |
|
如果非空,airflow 容器将尝试安装变量中指定的依赖项。例如: |