添加Dockerfile安装额外依赖失败,报dataclasses模块未找到错误求助
解决Docker中Airflow依赖安装失败的问题
我来帮你一步步排查并解决这个问题:
问题根源
你遇到的ModuleNotFoundError主要来自两个核心问题:
- Dockerfile基础镜像错误:你当前的Dockerfile直接用
python3.7作为基础镜像,完全脱离了puckel/docker-airflow的Airflow运行环境,导致Airflow的核心依赖全部缺失,同时和docker-compose.yml的配置冲突。 - build配置未关联本地Dockerfile:你的docker-compose.yml中webserver服务的build参数指向的是puckel的远程GitHub仓库,根本没有执行你本地的Dockerfile命令,所以你的依赖安装操作从未生效。
另外补充一点:puckel/docker-airflow:1.10.1使用的是Python3.6,而dataclasses是Python3.7+的标准库,所以在这个环境下确实需要通过pip安装。
解决方案
步骤1:修正本地Dockerfile
将你的Dockerfile修改为基于puckel的Airflow镜像,这样能保留Airflow的完整运行环境,同时添加你的自定义依赖:
# 基于目标Airflow镜像构建,保证环境一致性 FROM puckel/docker-airflow:1.10.1 # 切换到root用户执行系统级安装 USER root # 安装git并清理apt缓存(镜像瘦身最佳实践) RUN apt-get update && \ apt-get install -y --no-install-recommends git && \ rm -rf /var/lib/apt/lists/* # 切回airflow用户安装Python依赖(符合原镜像的权限规范) USER airflow # 安装dataclasses(适配Python3.6环境) RUN pip install dataclasses # 安装你的私有Git仓库依赖 RUN pip install git+ssh://git@bitbucket.org/myspace/utilities.git@master
步骤2:调整docker-compose.yml的webserver配置
修改webserver服务的build参数,让它使用你本地的Dockerfile,而不是远程仓库:
version: '3' services: postgres: image: postgres:12.3 environment: - POSTGRES_USER=airflow - POSTGRES_PASSWORD=airflow - POSTGRES_DB=airflow ports: - "5433:5432" webserver: # 注释掉原镜像,因为我们要自定义构建 # image: puckel/docker-airflow:1.10.1 build: context: . # 指向当前airflow-tutorial目录(你的Dockerfile所在位置) # 如果需要保留原有的Airflow和Python依赖,可以保留以下args args: AIRFLOW_DEPS: gcp_api,s3 PYTHON_DEPS: sqlalchemy==1.2.0 restart: always depends_on: - postgres environment: - LOAD_EX=n - EXECUTOR=Local - FERNET_KEY=jsDPRErfv8Z_eVTnGfF8ywd19j4pyqE3NpdUBA_oRTo= - SSH_AUTH_SOCK=/ssh-agent volumes: - /home/awaish/work/airflow/dags1:/usr/local/airflow/dags - /usr/bin/ssh-agent:/ssh-agent # Uncomment to include custom plugins # - ./plugins:/usr/local/airflow/plugins ports: - "8080:8080" command: webserver healthcheck: test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"] interval: 30s timeout: 30s retries: 3
步骤3:重新构建并运行
执行以下命令清理旧容器并重新构建:
docker-compose down docker-compose up --build
额外优化(可选)
如果你希望沿用puckel镜像的依赖注入方式(通过args传递AIRFLOW_DEPS和PYTHON_DEPS),可以把Dockerfile调整为以下形式,更贴合原镜像的构建逻辑:
# 先定义构建参数,和docker-compose的args对应 ARG AIRFLOW_DEPS="" ARG PYTHON_DEPS="" FROM puckel/docker-airflow:1.10.1 USER root RUN apt-get update && \ apt-get install -y --no-install-recommends git && \ rm -rf /var/lib/apt/lists/* USER airflow # 安装原镜像指定的Airflow扩展依赖 RUN if [ -n "${AIRFLOW_DEPS}" ]; then pip install "apache-airflow[${AIRFLOW_DEPS}]"; fi # 安装原镜像指定的Python依赖 RUN if [ -n "${PYTHON_DEPS}" ]; then pip install ${PYTHON_DEPS}; fi # 安装你的自定义依赖 RUN pip install dataclasses RUN pip install git+ssh://git@bitbucket.org/myspace/utilities.git@master
这样就能完美兼容原有的依赖配置,同时添加你的自定义需求。
内容的提问来源于stack exchange,提问作者Awaish Kumar
相关产品推荐
相关产品推荐

