Docker-Compose启动Airflow镜像时插件导入失败(本地正常、生产环境报错)
兄弟,我之前也踩过几乎一模一样的坑!本地跑起来顺得不行,一到生产环境就报插件导入错误,这种情况基本逃不开这几个原因,咱们一步步排查:
先确认镜像里到底有没有打包进目标插件
别光看本地跑起来正常,先验证下你构建的镜像里确实包含了/opt/airflow/plugins/operators/name.py:- 本地启动容器后,执行命令进入容器:
docker exec -it <你的容器ID> /bin/bash - 查看插件路径下的文件:
ls /opt/airflow/plugins/operators/
如果本地容器里能看到name.py,那再去生产环境检查拉取的镜像ID和本地的是否一致——很多时候是生产拉到了旧版本镜像,建议给镜像打个明确的版本tag(比如airflow-custom:v1.0),别用默认的latest,避免拉错镜像。
- 本地启动容器后,执行命令进入容器:
检查生产环境的Docker-Compose挂载配置
大概率是生产的docker-compose.yml里加了本地插件目录的挂载,把镜像里的插件给覆盖了!比如你本地的compose里可能有:volumes: - ./plugins:/opt/airflow/plugins但生产机器上的
./plugins目录是空的或者没有name.py,就会把镜像里的插件文件替换成空的。赶紧对比下本地和生产的compose文件,要是生产不需要挂载本地插件,直接把这行挂载配置删掉就行。排查插件文件的权限问题
生产环境容器里的插件文件权限可能不对,Airflow默认用airflow用户运行,如果name.py的所有者不是这个用户,就会导致读权限不足。你可以进入生产的容器,执行:ls -l /opt/airflow/plugins/operators/name.py要是权限不对,就在你的Dockerfile里加一行命令,确保插件目录的权限正确:
RUN chown -R airflow:airflow /opt/airflow/plugins重新构建镜像后推到生产再试试。
检查插件依赖是否在镜像中安装
你贴的日志没写完,不过很多插件导入失败是因为缺依赖——比如name.py里用了某个第三方库,但你在Dockerfile里没加pip install安装这个依赖。本地环境可能因为你之前装过,或者本地容器挂载了本地的Python环境,所以没问题,但生产镜像里没有这个依赖。等你拿到完整的Traceback,看看最后一行是不是ImportError: No module named xxx,要是的话,把对应的依赖加到Dockerfile里就行。
备注:内容来源于stack exchange,提问作者M99

