因为工做中须要使用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/