關於Airflow是什麼, 歡迎參考「🔒 阿Han的軟體心法實戰營 - MLOps」, 在開始之前我們也推薦以下兩篇給您閱讀:
🤷♂️ 今天到底怎麼了?
我們都知道容器化能帶來許多好處對吧! 但當我們今天想要對宿主主機進行操作時就會面臨一些困難了, 沒關係, 很開心您閱讀到這個篇章, 我們也非常樂意的幫您整理出幾個問題點。

而我們剛好在開發一個自動化的需求就會需要去操作主機的指令與存取目錄, 因此也透過分享經驗的方式讓有需要的朋友可以作為參考。
🤝 我們可以怎麼做?
大致上我們會是這樣的需求, 任務1主要是在進行主機的初始化任務, 讓後續的容器可以避免權限問題, 進而操作主機特定的目錄。

如果化身為DAG呢?

這邊流程看似簡單, 但我們的init_container究竟要使用哪一個容器呢? 既然是操作目錄, 那麼最直接的就是Bash了, 因此我們會使用到「https://hub.docker.com/_/bash」這個Docker Image來達成功能。
🛠️ 讓我們手把手動手做看看
with DAG(
dag_id='test',
default_args=default_args,
description='初始化host目錄',
catchup=False,
tags=['test'],
params={
'ottdir': Param(
'/workspace/ottdir',
description='ott目錄',
type='string',
),
},
) as dag:
# 執行一個Bash腳本, 主要是初始化掛載目錄, 用mkdir建立目錄, 最後使用chown及chmod設定權限
init_task = DockerOperator(
task_id='init_directories',
image='bash:5.2.37',
container_name='init_directories',
docker_url='TCP://docker-socket-proxy:2375',
network_mode='bridge',
auto_remove=True,
mounts=[
{
'type': 'bind',
'source': '/workspace',
'target': '/workspace',
},
],
command=[
'bash',
'-c',
'mkdir -p {{ params.ottdir }}',
'chmod 775 {{ params.ottdir }}'
],
)
init_task
結語
世界的每件事物都是一個取捨的過程, 就如同我們今天的案例, 想要享受容器化帶來的隔離、獨立, 就得捨棄掉直接存取主機的方便性, 我們每個決策並沒有絕對好的一個方案, 只有當下最符合的選擇才是最好的, 因此不要害怕做決策, 決定之後, 我們總會有其他道路可以通行的, 讓我們一起加油, 互相學習吧!