Airflow1.10.9使用BigQueryToCloudStorageOperator提示httplib2缺失
解决方案
之前方法失效的原因
- 手动进入容器安装依赖:容器重启后所有修改会直接丢失,且LocalExecutor模式下任务运行环境也需要对应依赖,仅安装webserver容器后续如果拆分调度逻辑依然会报错。
- 直接挂载requirements.txt不生效:puckel/docker-airflow 1.10.9版本默认不会自动加载挂载的依赖清单,且如果宿主机文件权限和容器内airflow用户权限不匹配,会导致读取失败触发启动报错。
方案1:构建自定义镜像(最稳定,推荐)
该方案将依赖固化到镜像中,不会出现重启丢失、权限不匹配的问题。
- 在docker-compose.yml同级目录创建
Dockerfile,内容如下:
FROM puckel/docker-airflow:1.10.9 # 切换root用户安装系统依赖,避免pip安装httplib2时报错 USER root RUN apt-get update && apt-get install -y --no-install-recommends \ gcc \ python3-dev \ && rm -rf /var/lib/apt/lists/* # 切回airflow用户安装Python依赖 USER airflow RUN pip install --user apache-airflow[gcp]==1.10.9 httplib2>=0.18.0
- 执行构建命令:
docker build -t custom-airflow:1.10.9 . - 修改docker-compose.yml中webserver的image配置:
将image: puckel/docker-airflow:1.10.9替换为image: custom-airflow:1.10.9,保持requirements.txt挂载行注释状态。 - 重启服务生效:
docker-compose up -d --force-recreate
方案2:挂载requirements.txt自动安装(无需构建镜像)
适合临时调试场景,不需要修改镜像。
- 先修改宿主机requirements.txt的权限,匹配容器内airflow用户的uid(500):
sudo chown 500:500 ./requirements.txt - 可以在requirements.txt中补充httplib2声明,避免依赖遗漏:
apache-airflow[gcp]==1.10.9 httplib2>=0.18.0
- 修改docker-compose.yml的webserver配置:
- 取消requirements.txt挂载行的注释
- 在environment字段下添加自动安装依赖的环境变量
修改后示例:
environment: - LOAD_EX=y - EXECUTOR=Local - INSTALL_REQUIREMENTS_ON_START=True volumes: - ./dags:/usr/local/airflow/dags - ./requirements.txt:/requirements.txt
- 重启服务生效:
docker-compose up -d --force-recreate
注意事项
如果后续你拆分出独立的scheduler服务,需要给scheduler也配置相同的依赖安装逻辑,否则任务运行时依然会报依赖缺失错误。
内容的提问来源于stack exchange,提问作者aName
相关产品推荐
相关产品推荐

