构建集成Airflow与Spark的Docker镜像时pip依赖解析耗时过长问题求助
构建集成Airflow与Spark的Docker镜像时pip依赖解析耗时过长问题求助
各位大佬好,我最近在折腾一个集成Airflow和Spark的Docker镜像,写了下面的Dockerfile:
FROM apache/airflow:2.7.0-python3.9 ENV AIRFLOW_HOME=/opt/airflow USER root # 更新包列表、安装依赖并清理 RUN apt-get update && \ apt-get install -y gcc python3-dev openjdk-11-jdk wget && \ apt-get clean # 设置JAVA_HOME环境变量 ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 COPY requirements.txt . USER airflow RUN pip install -U pip RUN pip install --no-cache-dir -r requirements.txt
对应的requirements.txt是这些内容:
apache-airflow apache-airflow-providers-apache-spark apache-airflow-providers-celery>=3.3.0 apache-airflow-providers-google pandas psycopg2-binary pytest pyspark requests sqlalchemy
现在遇到两个头疼的问题:
- 镜像构建时pip解析依赖的时间超级久,一直弹出这个提示:
INFO: This is taking longer than usual. You might need to provide the dependency resolver with stricter constraints to reduce runtime. => => # Downloading google_cloud_workflows-1.16.0-py2.py3-none-any.whl.metadata (5.2 kB)
- 要是我把Dockerfile第一行里的
python3.9去掉,又没法安装openjdk-11-jdk了。
有没有大佬能指点一下该怎么解决?万分感谢!
几个可行的解决思路
1. 给依赖加精准的版本约束
pip解析慢本质是因为你没指定版本,它得遍历大量版本组合找兼容的。你可以给每个包固定版本,尤其是Airflow相关的,要和基础镜像的2.7.0版本匹配(可以查Airflow官方的provider兼容表)。比如把requirements.txt改成这样:
apache-airflow==2.7.0 apache-airflow-providers-apache-spark==4.1.1 # 和Airflow 2.7.0兼容的稳定版 apache-airflow-providers-celery==3.3.0 apache-airflow-providers-google==10.1.0 pandas==2.1.4 psycopg2-binary==2.9.9 pytest==7.4.4 pyspark==3.5.0 requests==2.31.0 sqlalchemy==2.0.23
这样pip不用再瞎找版本,解析速度会快很多,还能避免版本冲突。
2. 切换回pip旧版依赖解析器
pip从20.3开始用了新的解析器,虽然更严谨但有时候会变慢。你可以在安装命令里加个参数用旧解析器:
RUN pip install --no-cache-dir --use-deprecated=legacy-resolver -r requirements.txt
这个方法见效快,但要注意可能出现依赖冲突,不过配合版本约束的话问题不大。
3. 优化Dockerfile构建步骤
- 把
pip升级和安装依赖合并成一步,减少镜像层的同时也能稍微加快速度:RUN pip install -U pip && pip install --no-cache-dir -r requirements.txt - 要是你环境固定,也可以提前下载依赖包到本地,再COPY进镜像,但这个维护起来有点麻烦,适合长期不变的场景。
4. 关于去掉python3.9后装不了openjdk的问题
去掉python3.9后,基础镜像会用最新的Airflow版本,对应的底层系统可能换了(比如Debian换成Ubuntu或者版本升级),导致openjdk-11-jdk的包名或者安装方式变了。比如最新Airflow镜像用Ubuntu 22.04的话,可能得装openjdk-11-jre-headless。不过还是建议保留python3.9标签,这样环境更稳定,不会乱引入系统层面的问题。
总结
最推荐的是第一种方法,给依赖加精准版本约束,既解决解析慢的问题,又能保证环境稳定一致。
备注:内容来源于stack exchange,提问作者lili
相关产品推荐
相关产品推荐

