如何在docker-compose中为多个容器配置通用Python环境
Airflow与Jupyter容器共用Python依赖解决方案
方案1:基于同一份依赖清单构建镜像(生产环境首选)
这个方案可以保证两个容器的依赖完全一致,可复现性最高:
- 项目根目录下存放统一的
requirements.txt,所有Jupyter开发阶段安装的依赖、Airflow执行任务需要的依赖都统一写到这个文件里 - 两个服务的Dockerfile都引入同一份依赖清单安装,注意两者的Python大版本要完全匹配:
基于官方Airflow镜像的Dockerfile示例:
基于官方Jupyter镜像的Dockerfile示例:FROM apache/airflow:2.8.0-python3.10 COPY requirements.txt /tmp/requirements.txt RUN pip install --no-cache-dir -r /tmp/requirements.txtFROM jupyter/scipy-notebook:python-3.10 COPY requirements.txt /tmp/requirements.txt RUN pip install --no-cache-dir -r /tmp/requirements.txt - 你也可以单独构建一个公共基础镜像,两个服务都从这个基础镜像继承,能节省重复构建的时间。
方案2:依赖卷共享(开发调试场景适用)
适合开发阶段频繁调整依赖,不想每次都重新构建镜像的场景:
- 在
docker-compose.yml中定义一个专门存储Python依赖的命名卷,两个容器都把这个卷挂载到各自的第三方包安装目录 - 注意必须保证两个容器的Python大版本完全一致,否则会出现包兼容、无法识别的问题
- 配置示例:
version: '3.8' volumes: shared-python-sitepackages: # 公共依赖存储卷 services: jupyter: image: jupyter/scipy-notebook:python-3.10 volumes: - shared-python-sitepackages:/opt/conda/lib/python3.10/site-packages # 其他原有挂载配置 airflow-worker: image: apache/airflow:2.8.0-python3.10 volumes: - shared-python-sitepackages:/usr/local/lib/python3.10/site-packages # 其他原有挂载配置
这个方案仅适合本地开发使用,生产环境不要采用,否则会出现依赖和镜像解耦、跨环境运行不一致的问题。
方案3:Airflow直接调用Jupyter容器执行任务
如果不想统一维护依赖,也可以直接让Airflow用Jupyter的环境运行任务:
- 给Airflow安装DockerOperator,执行任务时指定用Jupyter镜像启动容器
- 把待执行的Python脚本、Notebook文件目录挂载到启动的Jupyter容器中,直接用Jupyter内置的Python环境运行,完全规避依赖不一致的问题。
内容的提问来源于stack exchange,提问作者joschwen
相关产品推荐
相关产品推荐

