You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建集成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

现在遇到两个头疼的问题:

  1. 镜像构建时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)
  1. 要是我把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:23:07