1. 程式人生 > >Mac通過docker一鍵部署airflow

Mac通過docker一鍵部署airflow

[toc] # Airflow部署及使用 由於工作中需要使用airflow進行開發,網上搜索“mac系統在docker中搭建airflow”的文章真的很少,而且寫的又不夠詳細。遂自己摸索搭建成功後便分享給大家使用,即有按部就班“一步一步”的操作,也有“一鍵初始化”指令碼,大家根據自己的實際情況進行操作。 ## 1、Dockerhub檢視映象地址 ``` # 如果你比較懶可以使用最後的“airflow一鍵初始化指令碼”,mac電腦通用 https://hub.docker.com/r/puckel/docker-airflow/tags?page=1&ordering=last_updated ``` ## 2、拉取docker映象 ``` # 執行映象下載命令 docker pull puckel/docker-airflow:latest ``` ## 3、在宿主機建立外掛資料夾 ``` # 獲取當前系統的使用者名稱,例如:jason echo $USER # 執行上述命名將得到的使用者名稱替換在 $USER 的位置 sudo mkdir -p -v /data/docker/volumes/airflow/{dags,logs} && sudo chown -R $USER /data/docker/volumes/airflow/{dags,logs} ``` ## 4、建立docker容器 ``` # 建立容器 docker run -p 8080:8080 -v /data/docker/volumes/airflow/dags:/usr/local/airflow/dags -v /data/docker/volumes/airflow/logs:/usr/local/airflow/logs --name airflow -d puckel/docker-airflow:latest 命令說明: -d puckel/docker-airflow:latest #互動執行容器,讓容器以守護態(daemonized)形式在後臺執行 --name airflow #給新建立的容器命名即容器別名,如:airflow -p 8080:8080 #埠對映,此處對映主機8080埠到容器airflow的8080埠 -v /data/docker/volumes/airflow/airflow.cfg:/usr/local/airflow/airflow.cfg #掛載主配置檔案 -v /data/docker/volumes/airflow/dags:/usr/local/airflow/dags #掛載資源路徑 -v /data/docker/volumes/airflow/logs:/usr/local/airflow/logs #掛載日誌檔案 ``` ## 5、重新建立docker容器 此步驟主要是將容器中的airflow.cfg拷貝出來,方便airflow.cfg後續修改; ### 5.1、檢視airflow容器是否正常啟動 ``` # 檢視容器是否正常,如 running 即啟動成功 docker inspect airflow | jq -r '.[].State.Status' ``` ### 5.2、啟動成功才能將容器中的airflow.cfg拷貝出來修改 ``` #1、檢視容器ID,例如:$container_id docker ps -a | grep 'airflow' |awk '{print $1}' #2、使用docker拷貝(命令參考,可忽略):docker cp source_path target_path docker cp $container_id:/usr/local/airflow/airflow.cfg /data/docker/volumes/airflow #3、拷貝airflow.cfg到指定目錄,命令整合(推薦用,一鍵搞定省心) sudo docker cp $(docker ps -a | grep 'airflow' |awk '{print $1}'):/usr/local/airflow/airflow.cfg /data/docker/volumes/airflow ``` ### 5.3、刪除容器重新建立,非刪除映象 此步驟主要是將/usr/local/airflow/airflow.cfg外掛到宿主機中 ``` #1、刪除容器示例:docker stop $image_alias && docker rm $image_alias docker stop airflow && docker rm airflow #2、重新建立docker容器 docker run -p 8080:8080 -v=/data/docker/volumes/airflow/airflow.cfg:/usr/local/airflow/airflow.cfg -v=/data/docker/volumes/airflow/dags:/usr/local/airflow/dags -v=/data/docker/volumes/airflow/logs:/usr/local/airflow/logs --name airflow -d puckel/docker-airflow:latest #3、檢視容器airflow掛載到宿主機的地址 docker inspect airflow | jq -r '.[].HostConfig.Binds' #4、檢視容器是否正常 docker ps ``` ## 6、進入docker容器 ``` docker exec -it airflow /bin/bash -d:分離模式,在後臺執行 -i:互動模式,即使沒有附加也保持 STDIN 開啟 -t:分配一個偽終端 /bin/bash:執行命令 bash shell ``` ## 7、sqlite資料庫初始化 (生產不建議使用,但可用於個人測試。生產推薦使用mysql,如果使用mysql可以跳過sqlite部分) ``` #1、使用預設的sqlite+SequentialExecutor啟動 airflow initdb #2、出現錯誤: airflow.exceptions.AirflowException: Could not create Fernet object: Incorrect padding #3、解決辦法: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" #4、將第3步執行的結果替換到export中 export AIRFLOW__CORE__FERNET_KEY=第3步執行的結果 #5、重新執行初始化資料庫命令 airflow initdb #6、啟動成功後,即可正常訪問 http://localhost:8080/admin/ ``` ![avatar][airflow_1] ## 8、修改airflow的airflow.cfg配置 提供手動修改和命令列修改的功能 ``` #1、檢視docker中mysql的IP地址,替換在如下的IP地址中 docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql #2、手動修改(使用命令列修改可跳過此步) executor = LocalExecutor # 示例:sql_alchemy_conn="mysql://${USER}:${PASSWORD}@${HOST}:${PORT}/${DB_INSTANCE}${DB_EXTRAS}" sql_alchemy_conn = mysql://airflow:[email protected]:3306/airflow #3、命令列修改(使用手動修改可跳過此步) sudo sed -i \"\" 's/executor = SequentialExecutor/executor = LocalExecutor/g' /data/docker/volumes/airflow/airflow.cfg sudo sed -i \"\" 's/\# sql_alchemy_conn = sqlite:\/\/\/\/tmp\/airflow.db/sql_alchemy_conn = mysql:\/\/airflow:airflow\@172.17.0.2:3306\/airflow/g' /data/docker/volumes/airflow/airflow.cfg #4、檢視修改是否成功 cat /data/docker/volumes/airflow/airflow.cfg | grep 'executor =' cat /data/docker/volumes/airflow/airflow.cfg | grep 'sql_alchemy_conn' ``` ## 9、mysql資料庫初始化 部署方式:docker+airflow+mysql+LocalExecutor ### 9.1、檢視docker中mysql的IP地址 如果你的mysql也是安裝在docerk中的話,則最好操作如下命令: ``` # 檢視docker中mysql的IP地址,主要用於mysql建立新使用者授權時使用, # 命令中的 mysql 是docker中安裝資料庫時的別名,請根據實際情況自行修改 docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql ``` ### 9.2、登入mysql並建立專屬的airflow資料庫 ``` #新建