Airflow Summit 2025 將於 10 月 07-09 日舉行。立即註冊獲取早鳥票!

在 Docker 中執行 Airflow

本快速入門指南將幫助您在 Docker 中快速啟動並執行使用 CeleryExecutor 的 Airflow。

注意

此過程對學習和探索很有用。但是,將其用於實際場景可能很複雜,並且 docker compose 檔案不提供生產系統所需的任何安全保證。對此過程進行更改需要 Docker 和 Docker Compose 的專業知識,並且 Airflow 社群可能無法為您提供幫助。

因此,當您準備在生產環境中執行 Airflow 時,我們建議使用 Kubernetes 以及 官方 Airflow 社群 Helm Chart

開始之前

此過程假設您熟悉 Docker 和 Docker Compose。如果您之前沒有使用過這些工具,則應花點時間閱讀 Docker 快速入門(特別是關於 Docker Compose 的部分),以便熟悉它們的工作原理。

如果您尚未安裝所需的工具,請按照以下步驟進行安裝。

  1. 在您的工作站上安裝 Docker Community Edition (CE)。根據您的作業系統,您可能需要配置 Docker 以使用至少 4.00 GB 記憶體,以便 Airflow 容器正常執行。有關更多資訊,請參閱 Docker for WindowsDocker for Mac 文件中的資源部分。

  2. 在您的工作站上安裝 v2.14.0 或更新版本的 Docker Compose

舊版本的 docker-compose 不支援 Airflow 的 docker-compose.yaml 檔案所需的所有功能,因此請仔細檢查您的版本是否滿足最低版本要求。

提示

macOS 上 Docker 可用的預設記憶體通常不足以使 Airflow 正常執行。如果未分配足夠的記憶體,可能會導致 Web 伺服器持續重啟。您應該為 Docker Engine 分配至少 4GB 記憶體(理想情況下為 8GB)。

您可以透過執行此命令檢查是否有足夠的記憶體

docker run --rm "debian:bookworm-slim" bash -c 'numfmt --to iec $(echo $(($(getconf _PHYS_PAGES) * $(getconf PAGE_SIZE))))'

警告

一些作業系統(Fedora、ArchLinux、RHEL、Rocky)最近引入了核心更改,導致在由作業系統團隊維護的社群 Docker 實現中執行 Airflow 時,Docker Compose 中的 Airflow 會消耗 100% 的記憶體。

這是與 containerd 不相容的配置有關的問題,一些 Airflow 依賴項對此有問題,並在一些問題中進行了跟蹤

containerd 團隊目前還沒有解決方案,但似乎在 Linux 上安裝 Docker Desktop 可以解決此問題,如 此評論 中所述,並且可以毫無問題地執行 Breeze。

獲取 docker-compose.yaml 檔案

要在 Docker Compose 上部署 Airflow,您應該獲取 docker-compose.yaml 檔案。

curl -LfO 'https://airflow.apache.tw/docs/apache-airflow/3.0.0/docker-compose.yaml'

重要

從 2023 年 7 月起,Compose V1 已停止接收更新。我們強烈建議升級到更新版本的 Docker Compose,隨附的 docker-compose.yaml 在 Compose V1 中可能無法正常工作。

此檔案包含幾個服務定義

  • airflow-scheduler - 排程器 監控所有任務和 DAG,然後在其依賴項完成後觸發任務例項。

  • airflow-dag-processor - DAG 處理器解析 DAG 檔案。

  • airflow-webserver - Web 伺服器位於 https://:8080

  • airflow-worker - 執行排程器分配的任務的工作節點。

  • airflow-triggerer - 觸發器執行可推遲任務的事件迴圈。

  • airflow-init - 初始化服務。

  • postgres - 資料庫。

  • redis - Redis - 將訊息從排程器轉發到工作節點的代理。

(可選)您可以透過新增 --profile flower 選項來啟用 flower,例如 docker compose --profile flower up,或透過在命令列上顯式指定它,例如 docker compose up flower

所有這些服務允許您使用 CeleryExecutor 執行 Airflow。有關更多資訊,請參閱 架構概述

容器中的一些目錄是掛載的,這意味著它們的內容在您的計算機和容器之間同步。

  • ./dags - 您可以將 DAG 檔案放在此處。

  • ./logs - 包含任務執行和排程器的日誌。

  • ./config - 您可以新增自定義日誌解析器或新增 airflow_local_settings.py 以配置叢集策略。

  • ./plugins - 您可以將 自定義外掛 放在此處。

此檔案使用最新的 Airflow 映象 (apache/airflow)。如果您需要安裝新的 Python 庫或系統庫,您可以構建自己的映象

初始化環境

首次啟動 Airflow 之前,您需要準備環境,即建立必要的檔案、目錄並初始化資料庫。

設定正確的 Airflow 使用者

Linux 上,快速入門需要知道您的主機使用者 ID,並且需要將組 ID 設定為 0。否則,在 dagslogsconfigplugins 中建立的檔案將由 root 使用者擁有。您必須確保為 docker-compose 配置它們

mkdir -p ./dags ./logs ./plugins ./config
echo -e "AIRFLOW_UID=$(id -u)" > .env

請參閱 Docker Compose 環境變數

對於其他作業系統,您可能會收到關於 AIRFLOW_UID 未設定的警告,但您可以安全地忽略它。您也可以在與 docker-compose.yaml 相同的資料夾中手動建立一個 .env 檔案,包含以下內容以消除警告

AIRFLOW_UID=50000

初始化 airflow.cfg(可選)

如果您想在啟動 airflow 服務之前使用預設值初始化 airflow.cfg,請執行此命令。

docker compose run airflow-cli airflow config list

這將在 config 資料夾中用預設值填充 airflow.cfg

初始化資料庫

所有作業系統上,您都需要執行資料庫遷移並建立第一個使用者帳戶。為此,請執行此命令。

docker compose up airflow-init

初始化完成後,您應該會看到如下訊息

airflow-init_1       | Upgrades done
airflow-init_1       | Admin user airflow created
airflow-init_1       | 3.0.0
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:3.0.0   "/usr/bin/dumb-init …"   3 minutes ago    Up 3 minutes (healthy)    8080/tcp                           compose_airflow-worker_1
ed9b09fc84b1   apache/airflow:3.0.0   "/usr/bin/dumb-init …"   3 minutes ago    Up 3 minutes (healthy)    8080/tcp                           compose_airflow-scheduler_1
7cb1fb603a98   apache/airflow:3.0.0   "/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.tw/docs/apache-airflow/3.0.0/airflow.sh'
chmod +x airflow.sh

現在您可以更輕鬆地執行命令了。

./airflow.sh info

您也可以使用 bash 作為引數進入容器中的互動式 bash shell,或使用 python 進入 python 容器。

./airflow.sh bash
./airflow.sh python

訪問 Web 介面

叢集啟動後,您可以登入 Web 介面並開始使用 DAG 進行實驗。

Web 伺服器位於: https://:8080。預設帳戶的登入名是 airflow,密碼是 airflow

向 REST API 傳送請求

目前 REST API 支援 基本使用者名稱密碼認證,這意味著您可以使用常用工具向 API 傳送請求。

Web 伺服器位於: https://:8080。預設帳戶的登入名是 airflow,密碼是 airflow

以下是一個示例 curl 命令,它傳送一個請求以檢索池列表

ENDPOINT_URL="https://:8080/"
curl -X GET  \
    --user "airflow:airflow" \
    "${ENDPOINT_URL}/api/v1/pools"

清理

要停止並刪除容器、刪除包含資料庫資料的卷以及下載映象,請執行此命令

docker compose down --volumes --rmi all

使用自定義映象

當您想在本地執行 Airflow 時,您可能希望使用包含一些額外依賴項的擴充套件映象——例如,您可能新增新的 Python 包,或將 Airflow Provider 升級到更高版本。這可以透過在 docker-compose.yaml 中指定 build: . 並將自定義 Dockerfile 放在 docker-compose.yaml 旁邊來輕鬆完成。然後您可以使用 docker compose build 命令構建您的映象(只需要執行一次)。您也可以在執行其他 docker compose 命令時新增 --build 標誌,以在執行時重建映象。

有關如何使用自定義 Provider、Python 包、apt 包等擴充套件映象的示例,請參見 構建映象

注意

建立自定義映象意味著您還需要維護一定程度的自動化,因為當您要安裝的包或 Airflow 升級時,您需要重新建立映象。請不要忘記保留這些指令碼。另請記住,在執行純 Python 任務的情況下,您可以使用 Python Virtualenv 函式,它將在執行時動態獲取和安裝 Python 依賴項。從 Airflow 2.8.0 開始,Virtualenv 也可以快取。

特殊情況 - 透過 requirements.txt 檔案新增依賴

自定義映象的常見情況是,您想向其中新增一組依賴項——通常儲存在 requirements.txt 檔案中。在開發過程中,您可能想在啟動原始 airflow 映象時動態新增它,但這會產生許多副作用(例如,您的容器啟動會慢得多——每個額外的依賴項都會進一步延遲您的容器啟動時間)。此外,這完全沒有必要,因為 docker compose 內建了開發工作流程。您可以——按照上一章所述,在本地使用 docker compose 進行迭代時自動構建和使用您的自定義映象。特別是當您想新增自己的 requirements 檔案時,您應該執行以下步驟

  1. 註釋掉 docker-compose.yaml 檔案中的 image: ... 行,並移除 build: . 行的註釋。您的 docker-compose 檔案中相關部分應如下所示(使用正確的映象標籤)

#image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:3.0.0}
build: .
  1. 在與 docker-compose.yaml 檔案相同的資料夾中建立 Dockerfile,內容如下所示

FROM apache/airflow:3.0.0
ADD requirements.txt .
RUN pip install apache-airflow==${AIRFLOW_VERSION} -r requirements.txt

最佳實踐是安裝與原始映象中相同版本的 apache-airflow。這樣可以確保 pip 在安裝其他依賴項時不會嘗試降級或升級 apache airflow,如果您嘗試新增與正在使用的 apache-airflow 版本衝突的依賴項,則可能會發生這種情況。

  1. requirements.txt 檔案放在同一目錄中。

執行 docker compose build 命令構建映象,或者在 docker compose updocker compose run 命令中新增 --build 標誌,以便根據需要自動構建映象。

特殊情況 - 新增自定義配置檔案

如果您有自定義配置檔案並希望在 Airflow 例項中使用它,則需要執行以下步驟

  1. 用您的自定義配置檔案替換本地 config 資料夾中自動生成的 airflow.cfg 檔案。

  2. 如果您的配置檔名稱與 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。此配置因平臺而異。有關更多資訊,請查閱 Docker WindowsMac 文件。

使用 PyCharm 除錯 Docker 容器中的 Airflow

先決條件:在 PyCharm 中建立一個專案並下載 (docker-compose.yaml)。

步驟

  1. 修改 docker-compose.yaml 檔案

    services 部分下新增以下內容

airflow-python:
  <<: *airflow-common
  profiles:
      - debug
  environment:
      <<: *airflow-common-env
  user: "50000:0"
  entrypoint: [ "/bin/bash", "-c" ]

注意

此程式碼片段建立了一個名為 “airflow-python” 的新服務,專門用於 PyCharm 的 Python 直譯器。在 Linux 系統上,如果您執行了命令 echo -e "AIRFLOW_UID=$(id -u)" > .env,您需要在 airflow-python 服務中設定 user: "50000:0" 以避免 PyCharm 的 Unresolved reference 'airflow' 錯誤。

  1. 配置 PyCharm 直譯器

    • 開啟 PyCharm 並導航到 Settings > Project: <Your Project Name> > Python Interpreter

    • 點選 “Add Interpreter” 按鈕,選擇 “On Docker Compose”

    • Configuration file 欄位中,選擇您的 docker-compose.yaml 檔案。

    • Service field 欄位中,選擇新新增的 airflow-python 服務。

    • 點選 “Next” 並按照提示完成配置。

Configuring the container's Python interpreter in PyCharm, step diagram

構建直譯器索引可能需要一些時間。 3) 在 python 服務中的 docker-compose/command 和 actions 中新增 exec

Configuring the container's Python interpreter in PyCharm, step diagram

配置完成後,您可以在容器環境中除錯您的 Airflow 程式碼,這模擬了您的本地設定。

FAQ:常見問題

ModuleNotFoundError: 找不到名為 'XYZ' 的模組

Docker Compose 檔案使用最新的 Airflow 映象 (apache/airflow)。如果您需要安裝新的 Python 庫或系統庫,您可以自定義和擴充套件它

下一步?

從這一點開始,您可以前往 教程 部分獲取更多示例,或者如果您已準備好動手實踐,請前往 操作指南 部分。

Docker Compose 支援的環境變數

請勿混淆此處的變數名與構建映象時設定的構建引數。AIRFLOW_UID 構建引數在構建映象時預設為 50000,因此它是“內建”到映象中的。另一方面,以下環境變數可以在容器執行時設定,例如使用 id -u 命令的結果,這允許使用構建映象時未知的動態主機執行時使用者 ID。

變數

描述

預設值

AIRFLOW_IMAGE_NAME

要使用的 Airflow 映象。

apache/airflow:3.0.0

AIRFLOW_UID

執行 Airflow 容器的使用者 UID。如果您想使用非預設的 Airflow UID(例如,從主機對映資料夾時,應將其設定為 id -u 呼叫的結果),則可以覆蓋此設定。更改後,將在容器內建立一個 UID 為此值的使用者,名稱為 default,其主目錄設定為 /airflow/home/,以便共享安裝在此處的 Python 庫。這是為了實現 OpenShift 相容性。更多資訊請參閱 任意 Docker 使用者

50000

注意

在 Airflow 2.2 之前,Docker Compose 也有 AIRFLOW_GID 引數,但它沒有提供任何附加功能 - 只增加了混淆 - 因此已被移除。

這些附加變數在您透過 Docker Compose 嘗試/測試 Airflow 安裝時很有用。它們不適用於生產環境,但可以幫助初次使用者更快地使用最常見的自定義設定啟動環境。

變數

描述

預設值

_AIRFLOW_WWW_USER_USERNAME

管理員 UI 賬戶的使用者名稱。如果指定此值,將自動建立管理員 UI 使用者。這僅在您想試執行 Airflow 並希望啟動一個帶有嵌入式開發資料庫的容器時有用。

airflow

_AIRFLOW_WWW_USER_PASSWORD

管理員 UI 賬戶的密碼。僅在設定了 _AIRFLOW_WWW_USER_USERNAME 時使用。

airflow

_PIP_ADDITIONAL_REQUIREMENTS

如果不為空,airflow 容器將嘗試安裝變數中指定的依賴項。例如:lxml==4.6.3 charset-normalizer==1.4.1。適用於 Airflow 映象 2.1.1 及更高版本。

這篇文章有幫助嗎?