【MLOps - Airflow 疑難雜症】在Airflow Container裡面跑Docker Operator

更新 發佈閱讀 8 分鐘

關於Airflow是什麼, 歡迎參考「🔒 阿Han的軟體心法實戰營 - MLOps」。


當我們架設好Docker環境, 並撰寫一個DAG為Docker Operator的關卡時, 執行後竟然出現以下錯誤:


 raise AirflowException("Failed to establish connection to any given Docker hosts.")
airflow.exceptions.AirflowException: Failed to establish connection to any given Docker hosts.
raw-image



為什麼會這樣呢? 因為容器需要與host的docker溝通才能夠執行其他容器, 這邊有幾個方向如下:

  1. 掛載/var/run/docker.sock到scheduler裡面。
  2. 架設docker proxy透過代理連通。


為什麼會有兩個方式呢? 不能選其中一種就好了嗎? 別急…, 我們一一來說明這兩種方式的利與弊, 最後再由您自行選擇適合的一種方法。


在開始之前

我們要安裝一下 apache-airflow-providers-docker 這個套件, 怎麼安裝呢? 官方的docker compose支援環境變數來配置要安裝的套件與版本, 也就是我們可以修改 .env這個檔案, 加入:

_PIP_ADDITIONAL_REQUIREMENTS=apache-airflow-providers-docker==3.13.0


接著我們看一下今日主題的重點:

raw-image



我們的DAG檔

很簡單的一個範例, 我們透過docker呼叫python的容器, 並執行Hello World!

from airflow import DAG
from airflow.providers.docker.operators.docker import DockerOperator
from airflow.utils.dates import days_ago

default_args = {
'owner': 'airflow',
'start_date': days_ago(1),
}

with DAG(
dag_id='docker_operator_example',
default_args=default_args,
schedule_interval=None,
catchup=False,
) as dag:

run_docker = DockerOperator(
task_id='run_docker',
image='python:3-alpine', # 要運行的 Docker 映像
command='python -c \\'print("Hello, World!")\\'', # 容器中要運行的命令
docker_url='unix://var/run/docker.sock', # Docker daemon 的 URL
network_mode='bridge', # Docker 網絡模式
auto_remove=True, # 在運行結束後自動移除容器
)

run_docker



方法一: 掛載/var/run/docker.sock到scheduler裡面

我們可以在官方範本的volumes掛載 /var/run/docker.sock。

x-airflow-common:
&airflow-common
...
volumes:
...
- /var/run/docker.sock:/var/run/docker.sock:rw

但運行仍卡關。


究竟是為什麼呢? 難道是我們沒有正確掛載進去? 既然心中有🤔疑問, 那我們就進到容器來檢查看看!

cat /var/run/docker.sock 
cat: /var/run/docker.sock: Permission denied


啊! 原來是權限問題啊! 那我們檢查一下host的權限。

ls -al /var/run/docker.sock 
srw-rw---- 1 root docker 029 07:26 /var/run/docker.sock


果不其然, 使用者是root而群組歸屬於Docker, 但由於airflow的使用者是本機的使用者, 加上群組是「0」這個群組, 導致無法正常溝通, 針對這樣的問題, 最暴力的方式就是把權限全部打開, 包括其他使用者都能夠存取docker.sock, 但這樣有點危險, 請謹慎使用, 這邊為了實驗我們先暫時打開並測試與執行。


❗ 請務必謹慎使用, 我們僅以實驗性質進行分享, 並不擔保資安責任。

sudo chmod 777 /var/run/docker.sock

我們可以看到打開權限之後, 重新執行DAG就成功了!

raw-image



方法二: 架設docker proxy透過代理連通

我們可以用這套 https://github.com/Tecnativa/docker-socket-proxy 來幫我們做代理, 那麼只要簡單的在docker compose裡面加掛這個組件即可。

raw-image



只要兩個步驟就能完成:

  1. 加入docker-socket-proxy到compose。
  2. DAG改用docker-socket-proy的連線位置。
run_docker = DockerOperator(
task_id='run_docker',
image='python:3-alpine', # 要運行的 Docker 映像
command='python -c \\'print("Hello, World!")\\'', # 容器中要運行的命令
docker_url='TCP://docker-socket-proxy:2375', # Docker daemon 的 URL
network_mode='bridge', # Docker 網絡模式
auto_remove=True, # 在運行結束後自動移除容器
)

✌️✌️✌️ 果然也是成功的!


結語

今天的疑難雜症解方主要是針對我們在Airflow上會面臨到的Docker環境問題, 雖然使用Docker相對於裸機來說較為複雜一些, 但對於後續的維護帶來的效益非常的龐大, 因此我們初期設計時可以多花一些時間深入理解Airflow設計的裡面與使用技巧, 讓我們的自動化產線能夠更加穩定, 關於MLOps的相關知識也歡迎參考「🔒 阿Han的軟體心法實戰營 - MLOps」, 讓我們一起學習成長吧!

留言
avatar-img
留言分享你的想法!
avatar-img
阿Han的沙龍
140會員
306內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
阿Han的沙龍的其他內容
2025/04/23
我們在「【🤖 cursor AI】如何在ubuntu 24.04安裝」有分享如何在Ubuntu安裝cursro這套AI編輯器, 使用起來大幅度的提昇開發效率, 但仍有些問題點需要克服, 比如說: LLM壓根不知道我們的數據庫長怎樣啊? 怎麼分析結構呢? 假設文檔又不足的狀況下更是艱辛, 如果LLM
Thumbnail
2025/04/23
我們在「【🤖 cursor AI】如何在ubuntu 24.04安裝」有分享如何在Ubuntu安裝cursro這套AI編輯器, 使用起來大幅度的提昇開發效率, 但仍有些問題點需要克服, 比如說: LLM壓根不知道我們的數據庫長怎樣啊? 怎麼分析結構呢? 假設文檔又不足的狀況下更是艱辛, 如果LLM
Thumbnail
2025/03/12
我們在「【語音合成技術 - GPT-SoVITS】讓機器說人話的語音生成服務」分享了語音合成技術, 該套GPT-SoVITS也非常的出色, 但效能有點不是非常理想, 加上需要GPU才能達到較佳的體驗, 如此一來成本就會有點高了, 因此我們找了另外一套MeloTTS, 這一套強調CPU推理非常的快!
Thumbnail
2025/03/12
我們在「【語音合成技術 - GPT-SoVITS】讓機器說人話的語音生成服務」分享了語音合成技術, 該套GPT-SoVITS也非常的出色, 但效能有點不是非常理想, 加上需要GPU才能達到較佳的體驗, 如此一來成本就會有點高了, 因此我們找了另外一套MeloTTS, 這一套強調CPU推理非常的快!
Thumbnail
2025/03/05
我們在「【語音合成技術 - GPT-SoVITS】如何架設API伺服器」分享如何架設API V3版本的TTS服務, 但發音的部份似乎只有早期的API版本才使用到g2pw這類的技術, 因此我們可能會需要將API退回舊版, 在這裡我們也整理了早期版本api與api_v2的一些差異, 期望幫助到正在面臨選
Thumbnail
2025/03/05
我們在「【語音合成技術 - GPT-SoVITS】如何架設API伺服器」分享如何架設API V3版本的TTS服務, 但發音的部份似乎只有早期的API版本才使用到g2pw這類的技術, 因此我們可能會需要將API退回舊版, 在這裡我們也整理了早期版本api與api_v2的一些差異, 期望幫助到正在面臨選
Thumbnail
看更多
你可能也想看
Thumbnail
我們在「【🔒 MLOps - Airflow】使用docker compose架設Airflow」教您如何使用docker compose架設一個Airflow環境, 接著我們要教您如何進到容器內開發DAG, 正所謂工欲善其事必先利其器, 就是要先把事前先把工具給整治好, 讓後續的作業順利進行,
Thumbnail
我們在「【🔒 MLOps - Airflow】使用docker compose架設Airflow」教您如何使用docker compose架設一個Airflow環境, 接著我們要教您如何進到容器內開發DAG, 正所謂工欲善其事必先利其器, 就是要先把事前先把工具給整治好, 讓後續的作業順利進行,
Thumbnail
本文介紹了 Docker 的基本概念,包括 Docker Image、Docker Container、Dockerfile、Docker Compose 及其應用情境,如開發與測試環境、微服務架構和持續整合/持續部署。瞭解這些內容能幫助開發人員更有效地利用 Docker 進行應用程式的部署和管理。
Thumbnail
本文介紹了 Docker 的基本概念,包括 Docker Image、Docker Container、Dockerfile、Docker Compose 及其應用情境,如開發與測試環境、微服務架構和持續整合/持續部署。瞭解這些內容能幫助開發人員更有效地利用 Docker 進行應用程式的部署和管理。
Thumbnail
我們在「【🔒 MLOps - Airflow】使用docker compose架設Airflow」有教您如何使用Docker來架設Airflow的環境, 而這個章節我們準備在DAG的流程中設計一個呼叫Docker去執行作業的節點, 這對於我們容器化的工作流會非常有幫助, 而且運行過程中也減少對主機
Thumbnail
我們在「【🔒 MLOps - Airflow】使用docker compose架設Airflow」有教您如何使用Docker來架設Airflow的環境, 而這個章節我們準備在DAG的流程中設計一個呼叫Docker去執行作業的節點, 這對於我們容器化的工作流會非常有幫助, 而且運行過程中也減少對主機
Thumbnail
章節重點 架設minio 建立bucket 架設mlflow 透過mlflow上傳artifact 上一集「【 MLOps - MLflow】AI模型管理平台簡介」我們有稍微簡介一下MLflow的概念, 大致上我們知道MLFlow的Client與Server運作方式了,接著我們將試著以
Thumbnail
章節重點 架設minio 建立bucket 架設mlflow 透過mlflow上傳artifact 上一集「【 MLOps - MLflow】AI模型管理平台簡介」我們有稍微簡介一下MLflow的概念, 大致上我們知道MLFlow的Client與Server運作方式了,接著我們將試著以
Thumbnail
咦! 怎麼啟動個docker compose up -d就出現了可疑的訊息: +] Running 2/2d orphan containers ([xxxx]) for this project. If you removed or renamed this service in your
Thumbnail
咦! 怎麼啟動個docker compose up -d就出現了可疑的訊息: +] Running 2/2d orphan containers ([xxxx]) for this project. If you removed or renamed this service in your
Thumbnail
為什麼要用Docker安裝? Docker是一個容器化平台, 就類似於我們早期虛擬機的VMWare、Virtual Box…等, 虛擬機平台一般, 只是面向的是伺服端, 供企業快速、簡單、輕量的佈署開發完成的程式軟體, 並將相關的環境依賴皆封裝成一包所謂的映像檔(image), 透過這樣的方式減少
Thumbnail
為什麼要用Docker安裝? Docker是一個容器化平台, 就類似於我們早期虛擬機的VMWare、Virtual Box…等, 虛擬機平台一般, 只是面向的是伺服端, 供企業快速、簡單、輕量的佈署開發完成的程式軟體, 並將相關的環境依賴皆封裝成一包所謂的映像檔(image), 透過這樣的方式減少
Thumbnail
前言 上次我們針對 Docker 這樣容器化技術做了一點介紹,今天我們要來講解 Docker 架構,你是否發現在每次程式上伺服器的流程很麻煩呢 ? 是否發現你寫的程式在別的作業系統不能用呢 ? 如果你遇到這些問題,Docker 都可以幫助你解決這些問題 Docker 架構 在 Docker 這
Thumbnail
前言 上次我們針對 Docker 這樣容器化技術做了一點介紹,今天我們要來講解 Docker 架構,你是否發現在每次程式上伺服器的流程很麻煩呢 ? 是否發現你寫的程式在別的作業系統不能用呢 ? 如果你遇到這些問題,Docker 都可以幫助你解決這些問題 Docker 架構 在 Docker 這
Thumbnail
有遇過 pull 自己的私有倉庫無法 pull 下來的問題嗎,今天來教大家如何解決無法 pull image 問題,可暫時解決狀況 錯誤訊息 出現以下訊息代表,這個 docker registry 並沒有經過 https 憑證,所以 docker 會把它擋下來 Error response f
Thumbnail
有遇過 pull 自己的私有倉庫無法 pull 下來的問題嗎,今天來教大家如何解決無法 pull image 問題,可暫時解決狀況 錯誤訊息 出現以下訊息代表,這個 docker registry 並沒有經過 https 憑證,所以 docker 會把它擋下來 Error response f
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News