【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
116會員
258內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
阿Han的沙龍 的其他內容
當我們在訓練各種模型時, 難免會有許多實驗性的參數、產出的模型、不同的資料來源, 隨著版本迭代越來越多, 過了一段時間回頭看之後卻發現當初最好的某一個實驗參數到底是啥啊? 模型去了哪裡? 用的數據集是哪些? 我想上述這些問題都是模型訓練的過程難免會遇到的問題, 除非我們有一套管理的SOP, 比
我們在「【語音辨識引擎sherpa-onnx GPU下篇】讓您體驗更快的語音辨識功能」建置環境的過程中預到了這樣的錯誤訊息: RuntimeError: /onnxruntime_src/onnxruntime/core/session/provider_bridge_ort.cc: 1209
前面幾個篇章已經大致上介紹了Hugging Face這個平台的一些基本概念了,既然我們都能夠在平台上找到各式各樣的模型,而且也能夠照著教學一步步的來下載並使用,但有沒有更簡單的方式呢? 比如說,我們專注在應用端上的開發,AI的推理就藉由平台進行呢? 答案肯定是有的,近期越來越多開源的平台也都開放這
我們過往介紹了幾個關於文字AI應用的篇章: 【Hugging Face】Ep.5 文字世界中的超能力語言英雄(Named Entity Recognition) 【Hugging Face】Ep.6 解決問題的專業級破關知識家(Question Answering) 但單獨的文字應用似乎不太能
圖片來源… 🔍 Huggingface dataset map increase disk space 我們在「【Hugging Face】Ep.3 前往Datasets掏金趣」有稍微介紹過Dataset在Hugging Face裡面扮演著什麼樣的角色,以及如何使用,沒錯! 它非常的好用,也很
我們已經介紹過關於Transformer模型的平台「【Hugging Face】Ep.1 平凡人也能玩的起的AI平台」,而操作的過程中相信也會有不少玩家會遇到這樣的狀況,因此將遇到的問題整理並分享解決方法,讓需要的朋友可以參考一下。 問題 Input type (torch.FloatTen
當我們在訓練各種模型時, 難免會有許多實驗性的參數、產出的模型、不同的資料來源, 隨著版本迭代越來越多, 過了一段時間回頭看之後卻發現當初最好的某一個實驗參數到底是啥啊? 模型去了哪裡? 用的數據集是哪些? 我想上述這些問題都是模型訓練的過程難免會遇到的問題, 除非我們有一套管理的SOP, 比
我們在「【語音辨識引擎sherpa-onnx GPU下篇】讓您體驗更快的語音辨識功能」建置環境的過程中預到了這樣的錯誤訊息: RuntimeError: /onnxruntime_src/onnxruntime/core/session/provider_bridge_ort.cc: 1209
前面幾個篇章已經大致上介紹了Hugging Face這個平台的一些基本概念了,既然我們都能夠在平台上找到各式各樣的模型,而且也能夠照著教學一步步的來下載並使用,但有沒有更簡單的方式呢? 比如說,我們專注在應用端上的開發,AI的推理就藉由平台進行呢? 答案肯定是有的,近期越來越多開源的平台也都開放這
我們過往介紹了幾個關於文字AI應用的篇章: 【Hugging Face】Ep.5 文字世界中的超能力語言英雄(Named Entity Recognition) 【Hugging Face】Ep.6 解決問題的專業級破關知識家(Question Answering) 但單獨的文字應用似乎不太能
圖片來源… 🔍 Huggingface dataset map increase disk space 我們在「【Hugging Face】Ep.3 前往Datasets掏金趣」有稍微介紹過Dataset在Hugging Face裡面扮演著什麼樣的角色,以及如何使用,沒錯! 它非常的好用,也很
我們已經介紹過關於Transformer模型的平台「【Hugging Face】Ep.1 平凡人也能玩的起的AI平台」,而操作的過程中相信也會有不少玩家會遇到這樣的狀況,因此將遇到的問題整理並分享解決方法,讓需要的朋友可以參考一下。 問題 Input type (torch.FloatTen
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
國泰CUBE App 整合外幣換匯、基金、證券等服務,提供簡便、低成本的美股定期定額投資解決方案。 5分鐘開戶、低投資門檻,幫助新手輕鬆進軍國際股市;提供人氣排行榜,讓投資人能夠掌握市場趨勢。
Thumbnail
我們在「【Message Queue - Kafka】不斷的試誤…, 用Docker來嘗試安裝Kafka」有介紹如何架設kafka, 其中我們使用環境變數來進行kafka的配置, 但除了環境變數之外, 其實還能夠用檔案配置的方式來對kafka進行配置, 如此一來我們就可以將配置檔與啟動檔完全分開,
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 Image 使用,今天我們要教如何產出自己的 Image,這次會使用一個 Dockerfile 範例,自行打包 Docker Image,初步練習使用 Docker 指令 下載 Dockerfile 教學檔案 在這裡我已經幫忙寫好一個 Docke
Thumbnail
前言 上次講到 Dockerfile、DockerImage、Docker Container 他們之間的關係,今天我們要來熟悉 Docker Image 如何使用,教你如何抓取雲端上的 Docker Image, Docker Image 下載來源 當我們今天要要使用 Docker Imag
將使用者加入Docker群組 sudo groupadd docker sudo usermod -aG docker $USER 設定開機自動啟動Docker服務 sudo systemctl enable docker sudo systemctl start docker 試跑
Thumbnail
前言 上次我們初步體驗 Docker 快速佈署能力,今天我們要來講解 Dockerfile、Docker Image 與 Docker Container 這些常見的名詞,我們來了解在我們佈署的時候做哪些事情 Docker 佈署流程 首先看到如下圖上半部,在我們一個完整的佈署流程,我們會先將我
Thumbnail
前言 大家好在先前我們講了什麼是 Docker,Docker 好處有什麼以及怎麼安裝 Docker,今天我們要來開始初體驗 Docker 容器,使用後您會發現 Docker 非常的方便快速 Docker Hub 介紹 首先在開始學怎麼抓取 Docker Image 之前,我們要先來介紹 Doc
Thumbnail
前言 上次我們講到 Docker 的功用與好處,今天我們要在講解,如何安裝 Docker 這個容器,讓我們在之後的教學應用更好的實作與練習,現在讓我們開始吧 Docker Engine 與 Docker Desktop 首先在講解怎麼安裝 Docker 時,我們先講解 Docker Engin
Thumbnail
前言 上次我們針對 Docker 這樣容器化技術做了一點介紹,今天我們要來講解 Docker 架構,你是否發現在每次程式上伺服器的流程很麻煩呢 ? 是否發現你寫的程式在別的作業系統不能用呢 ? 如果你遇到這些問題,Docker 都可以幫助你解決這些問題 Docker 架構 在 Docker 這
Thumbnail
前言 大家好我們今天要來教 Docker 這項技術,什麼是 Docker ? Docker 可以幫助我們做什麼事情 ? Docker 是一項容器化技術,他可以降低我們在佈署 App 時,讓我們可以有效的分配作業系統資源,降低佈署作業成本,現在讓我們來了解 Docker 要解決的問題 傳統佈署遇
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
國泰CUBE App 整合外幣換匯、基金、證券等服務,提供簡便、低成本的美股定期定額投資解決方案。 5分鐘開戶、低投資門檻,幫助新手輕鬆進軍國際股市;提供人氣排行榜,讓投資人能夠掌握市場趨勢。
Thumbnail
我們在「【Message Queue - Kafka】不斷的試誤…, 用Docker來嘗試安裝Kafka」有介紹如何架設kafka, 其中我們使用環境變數來進行kafka的配置, 但除了環境變數之外, 其實還能夠用檔案配置的方式來對kafka進行配置, 如此一來我們就可以將配置檔與啟動檔完全分開,
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 Image 使用,今天我們要教如何產出自己的 Image,這次會使用一個 Dockerfile 範例,自行打包 Docker Image,初步練習使用 Docker 指令 下載 Dockerfile 教學檔案 在這裡我已經幫忙寫好一個 Docke
Thumbnail
前言 上次講到 Dockerfile、DockerImage、Docker Container 他們之間的關係,今天我們要來熟悉 Docker Image 如何使用,教你如何抓取雲端上的 Docker Image, Docker Image 下載來源 當我們今天要要使用 Docker Imag
將使用者加入Docker群組 sudo groupadd docker sudo usermod -aG docker $USER 設定開機自動啟動Docker服務 sudo systemctl enable docker sudo systemctl start docker 試跑
Thumbnail
前言 上次我們初步體驗 Docker 快速佈署能力,今天我們要來講解 Dockerfile、Docker Image 與 Docker Container 這些常見的名詞,我們來了解在我們佈署的時候做哪些事情 Docker 佈署流程 首先看到如下圖上半部,在我們一個完整的佈署流程,我們會先將我
Thumbnail
前言 大家好在先前我們講了什麼是 Docker,Docker 好處有什麼以及怎麼安裝 Docker,今天我們要來開始初體驗 Docker 容器,使用後您會發現 Docker 非常的方便快速 Docker Hub 介紹 首先在開始學怎麼抓取 Docker Image 之前,我們要先來介紹 Doc
Thumbnail
前言 上次我們講到 Docker 的功用與好處,今天我們要在講解,如何安裝 Docker 這個容器,讓我們在之後的教學應用更好的實作與練習,現在讓我們開始吧 Docker Engine 與 Docker Desktop 首先在講解怎麼安裝 Docker 時,我們先講解 Docker Engin
Thumbnail
前言 上次我們針對 Docker 這樣容器化技術做了一點介紹,今天我們要來講解 Docker 架構,你是否發現在每次程式上伺服器的流程很麻煩呢 ? 是否發現你寫的程式在別的作業系統不能用呢 ? 如果你遇到這些問題,Docker 都可以幫助你解決這些問題 Docker 架構 在 Docker 這
Thumbnail
前言 大家好我們今天要來教 Docker 這項技術,什麼是 Docker ? Docker 可以幫助我們做什麼事情 ? Docker 是一項容器化技術,他可以降低我們在佈署 App 時,讓我們可以有效的分配作業系統資源,降低佈署作業成本,現在讓我們來了解 Docker 要解決的問題 傳統佈署遇