在 Docker 中執行 Airflow¶
本快速入門指南將幫助您在 Docker 中快速啟動並執行使用 CeleryExecutor 的 Airflow。
注意
此過程對學習和探索很有用。但是,將其用於實際場景可能很複雜,並且 docker compose 檔案不提供生產系統所需的任何安全保證。對此過程進行更改需要 Docker 和 Docker Compose 的專業知識,並且 Airflow 社群可能無法為您提供幫助。
因此,當您準備在生產環境中執行 Airflow 時,我們建議使用 Kubernetes 以及 官方 Airflow 社群 Helm Chart。
開始之前¶
此過程假設您熟悉 Docker 和 Docker Compose。如果您之前沒有使用過這些工具,則應花點時間閱讀 Docker 快速入門(特別是關於 Docker Compose 的部分),以便熟悉它們的工作原理。
如果您尚未安裝所需的工具,請按照以下步驟進行安裝。
在您的工作站上安裝 Docker Community Edition (CE)。根據您的作業系統,您可能需要配置 Docker 以使用至少 4.00 GB 記憶體,以便 Airflow 容器正常執行。有關更多資訊,請參閱 Docker for Windows 或 Docker for Mac 文件中的資源部分。
在您的工作站上安裝 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。
flower- Flower 應用程式 用於監控環境。它位於https://:5555。
所有這些服務允許您使用 CeleryExecutor 執行 Airflow。有關更多資訊,請參閱 架構概述。
容器中的一些目錄是掛載的,這意味著它們的內容在您的計算機和容器之間同步。
./dags- 您可以將 DAG 檔案放在此處。./logs- 包含任務執行和排程器的日誌。./config- 您可以新增自定義日誌解析器或新增airflow_local_settings.py以配置叢集策略。./plugins- 您可以將 自定義外掛 放在此處。
此檔案使用最新的 Airflow 映象 (apache/airflow)。如果您需要安裝新的 Python 庫或系統庫,您可以構建自己的映象。
初始化環境¶
首次啟動 Airflow 之前,您需要準備環境,即建立必要的檔案、目錄並初始化資料庫。
設定正確的 Airflow 使用者¶
在 Linux 上,快速入門需要知道您的主機使用者 ID,並且需要將組 ID 設定為 0。否則,在 dags、logs、config 和 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
初始化 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 檔案時,您應該執行以下步驟
註釋掉
docker-compose.yaml檔案中的image: ...行,並移除build: .行的註釋。您的 docker-compose 檔案中相關部分應如下所示(使用正確的映象標籤)
#image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:3.0.0}
build: .
在與
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 版本衝突的依賴項,則可能會發生這種情況。
將
requirements.txt檔案放在同一目錄中。
執行 docker compose build 命令構建映象,或者在 docker compose up或 docker compose run 命令中新增 --build 標誌,以便根據需要自動構建映象。
特殊情況 - 新增自定義配置檔案¶
如果您有自定義配置檔案並希望在 Airflow 例項中使用它,則需要執行以下步驟
用您的自定義配置檔案替換本地 config 資料夾中自動生成的
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。此配置因平臺而異。有關更多資訊,請查閱 Docker Windows 和 Mac 文件。
使用 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: [ "/bin/bash", "-c" ]
注意
此程式碼片段建立了一個名為 “airflow-python” 的新服務,專門用於 PyCharm 的 Python 直譯器。在 Linux 系統上,如果您執行了命令 echo -e "AIRFLOW_UID=$(id -u)" > .env,您需要在 airflow-python 服務中設定 user: "50000:0" 以避免 PyCharm 的 Unresolved reference 'airflow' 錯誤。
配置 PyCharm 直譯器
開啟 PyCharm 並導航到 Settings > Project: <Your Project Name> > Python Interpreter。
點選 “Add Interpreter” 按鈕,選擇 “On Docker Compose”。
在 Configuration file 欄位中,選擇您的
docker-compose.yaml檔案。在 Service field 欄位中,選擇新新增的
airflow-python服務。點選 “Next” 並按照提示完成配置。
構建直譯器索引可能需要一些時間。 3) 在 python 服務中的 docker-compose/command 和 actions 中新增 exec
配置完成後,您可以在容器環境中除錯您的 Airflow 程式碼,這模擬了您的本地設定。
FAQ:常見問題¶
ModuleNotFoundError: 找不到名為 'XYZ' 的模組¶
Docker Compose 檔案使用最新的 Airflow 映象 (apache/airflow)。如果您需要安裝新的 Python 庫或系統庫,您可以自定義和擴充套件它。
下一步?¶
Docker Compose 支援的環境變數¶
請勿混淆此處的變數名與構建映象時設定的構建引數。AIRFLOW_UID 構建引數在構建映象時預設為 50000,因此它是“內建”到映象中的。另一方面,以下環境變數可以在容器執行時設定,例如使用 id -u 命令的結果,這允許使用構建映象時未知的動態主機執行時使用者 ID。
變數 |
描述 |
預設值 |
|---|---|---|
|
要使用的 Airflow 映象。 |
apache/airflow:3.0.0 |
|
執行 Airflow 容器的使用者 UID。如果您想使用非預設的 Airflow UID(例如,從主機對映資料夾時,應將其設定為 |
|
注意
在 Airflow 2.2 之前,Docker Compose 也有 AIRFLOW_GID 引數,但它沒有提供任何附加功能 - 只增加了混淆 - 因此已被移除。
這些附加變數在您透過 Docker Compose 嘗試/測試 Airflow 安裝時很有用。它們不適用於生產環境,但可以幫助初次使用者更快地使用最常見的自定義設定啟動環境。
變數 |
描述 |
預設值 |
|---|---|---|
|
管理員 UI 賬戶的使用者名稱。如果指定此值,將自動建立管理員 UI 使用者。這僅在您想試執行 Airflow 並希望啟動一個帶有嵌入式開發資料庫的容器時有用。 |
airflow |
|
管理員 UI 賬戶的密碼。僅在設定了 |
airflow |
|
如果不為空,airflow 容器將嘗試安裝變數中指定的依賴項。例如: |