因爲工做中須要使用airflow進行開發,網上搜索「mac系統在docker中搭建airflow」的文章真的不多,並且寫的又不夠詳細。遂本身摸索搭建成功後便分享給你們使用,即有循序漸進「一步一步」的操做,也有「一鍵初始化」腳本,你們根據本身的實際狀況進行操做。python
# 若是你比較懶能夠使用最後的「airflow一鍵初始化腳本」,mac電腦通用 https://hub.docker.com/r/puckel/docker-airflow/tags?page=1&ordering=last_updated
# 執行鏡像下載命令 docker pull puckel/docker-airflow:latest
# 獲取當前系統的用戶名,例如:jason echo $USER # 執行上述命名將獲得的用戶名替換在 $USER 的位置 sudo mkdir -p -v /data/docker/volumes/airflow/{dags,logs} && sudo chown -R $USER /data/docker/volumes/airflow/{dags,logs}
# 建立容器 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 #掛載日誌文件
此步驟主要是將容器中的airflow.cfg拷貝出來,方便airflow.cfg後續修改;mysql
# 查看容器是否正常,如 running 即啓動成功 docker inspect airflow | jq -r '.[].State.Status'
#一、查看容器ID,例如:$container_id docker ps -a | grep 'airflow' |awk '{print $1}' #二、使用docker拷貝(命令參考,可忽略):docker cp source_path target_path docker cp $container_id:/usr/local/airflow/airflow.cfg /data/docker/volumes/airflow #三、拷貝airflow.cfg到指定目錄,命令集成(推薦用,一鍵搞定省心) sudo docker cp $(docker ps -a | grep 'airflow' |awk '{print $1}'):/usr/local/airflow/airflow.cfg /data/docker/volumes/airflow
此步驟主要是將/usr/local/airflow/airflow.cfg外掛到宿主機中git
#一、刪除容器示例:docker stop $image_alias && docker rm $image_alias docker stop airflow && docker rm airflow #二、從新建立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 #三、查看容器airflow掛載到宿主機的地址 docker inspect airflow | jq -r '.[].HostConfig.Binds' #四、查看容器是否正常 docker ps
docker exec -it airflow /bin/bash -d:分離模式,在後臺運行 -i:交互模式,即便沒有附加也保持 STDIN 打開 -t:分配一個僞終端 /bin/bash:運行命令 bash shell
(生產不建議使用,但可用於我的測試。生產推薦使用mysql,若是使用mysql能夠跳過sqlite部分)github
#一、使用默認的sqlite+SequentialExecutor啓動 airflow initdb #二、出現錯誤: airflow.exceptions.AirflowException: Could not create Fernet object: Incorrect padding #三、解決辦法: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" #四、將第3步執行的結果替換到export中 export AIRFLOW__CORE__FERNET_KEY=第3步執行的結果 #五、從新執行初始化數據庫命令 airflow initdb #六、啓動成功後,便可正常訪問 http://localhost:8080/admin/
提供手動修改和命令行修改的功能sql
#一、查看docker中mysql的IP地址,替換在以下的IP地址中 docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql #二、手動修改(使用命令行修改可跳過此步) executor = LocalExecutor # 示例:sql_alchemy_conn="mysql://${USER}:${PASSWORD}@${HOST}:${PORT}/${DB_INSTANCE}${DB_EXTRAS}" sql_alchemy_conn = mysql://airflow:airflow@172.17.0.2:3306/airflow #三、命令行修改(使用手動修改可跳過此步) 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 #四、查看修改是否成功 cat /data/docker/volumes/airflow/airflow.cfg | grep 'executor =' cat /data/docker/volumes/airflow/airflow.cfg | grep 'sql_alchemy_conn'
部署方式:docker+airflow+mysql+LocalExecutordocker
若是你的mysql也是安裝在docerk中的話,則最好操做以下命令:shell
# 查看docker中mysql的IP地址,主要用於mysql建立新用戶受權時使用, # 命令中的 mysql 是docker中安裝數據庫時的別名,請根據實際狀況自行修改 docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql
#新建名字爲<airflow>的數據庫 CREATE DATABASE airflow; #一、新建用戶`airflow`,密碼爲`airflow`, 該用戶對數據庫`airflow`有徹底操做權限 #二、將9.1步驟執行命令行的結果替換在 $IPAddress 的位置,也能夠將IP最後一位換成%,例如:172.17.0.% GRANT all privileges on airflow.* TO 'airflow'@'$IPAddress' IDENTIFIED BY 'airflow'; FLUSH PRIVILEGES; # 查看受權(經常使用操做指令可不執行) select host,user from mysql.`user` where user='airflow'; # 刪除受權(經常使用操做指令可不執行) DROP USER 'airflow'@'$IPAddress';
# 因爲airflow初始化數據庫時須要用到以下參數,請自行添加 [mysqld] explicit_defaults_for_timestamp = 1
# 一、進入docker容器 docker exec -it airflow /bin/bash # 二、先執行數據庫重置命令,再執行數據庫初始化命令 airflow reset airflow initdb # 三、出現錯誤: airflow.exceptions.AirflowException: Could not create Fernet object: Incorrect padding # 四、解決辦法: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" # 五、將第3步執行的結果替換到export中 export AIRFLOW__CORE__FERNET_KEY=第3步執行的結果 # 六、查看環境變量是否設置成功 echo $AIRFLOW__CORE__FERNET_KEY # 七、從新執行初始化數據庫命令 airflow initdb # 八、啓動成功後,便可正常訪問 http://localhost:8080/admin/
注意:執行《一鍵初始化腳本》時須要先配置mysql環境和建立airflow數據庫用戶,即以下操做;數據庫
一、先執行9.一、9.二、9.3等步驟的操做,執行完成後請檢查是否正確;bash
二、先啓動airflow容器,而後再執行9.4步驟的操做;測試
三、執行完成後便可訪問:http://localhost:8080/admin/