Airflow+Docker搭建ML项目遇SQLite log表缺失错误求助
问题诊断与修复方案
问题根源
- Dockerfile配置错误:使用了两个
FROM指令,最终镜像基于apache/airflow:2.1.0,但未利用前一个puckel/docker-airflow镜像,且两类镜像的Airflow工作路径不统一(官方镜像默认路径为/opt/airflow,puckel镜像为/usr/local/airflow),导致挂载的dags、plugins目录无法被正确识别。 - 未配置PostgreSQL连接:
docker-compose.yml中未设置Airflow连接PostgreSQL的核心环境变量,Airflow默认使用SQLite数据库,但该数据库未执行初始化迁移,因此出现no such table: log错误,进而引发Web服务404异常。
修复步骤
1. 修正Dockerfile
删除多余的FROM指令,统一使用官方Airflow镜像,并调整依赖安装路径:
FROM apache/airflow:2.1.0 COPY requirement.txt /opt/airflow/ WORKDIR /opt/airflow RUN pip install --no-cache-dir -r requirement.txt
2. 更新docker-compose.yml
添加PostgreSQL连接配置,补充必要的Airflow环境变量,新增数据库初始化服务:
version: '3.7' services: postgres: image: postgres:9.6 environment: - POSTGRES_USER=airflow - POSTGRES_PASSWORD=airflow - POSTGRES_DB=airflow logging: options: max-size: 10m max-file: "3" volumes: - postgres-db-volume:/var/lib/postgresql/data # 持久化数据库数据 init-db: build: ./dockerfiles depends_on: - postgres environment: - AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow - AIRFLOW__CORE__EXECUTOR=LocalExecutor command: airflow db init webserver: build: ./dockerfiles restart: always depends_on: - init-db - postgres environment: - LOAD_EX=n - AIRFLOW__CORE__EXECUTOR=LocalExecutor - AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow - _AIRFLOW_WWW_USER_CREATE=true - _AIRFLOW_WWW_USER_USERNAME=airflow - _AIRFLOW_WWW_USER_PASSWORD=airflow logging: options: max-size: 10m max-file: "3" volumes: - ./dags:/opt/airflow/dags # 匹配官方镜像的路径 - ./plugins:/opt/airflow/plugins - ./logs:/opt/airflow/logs ports: - "8081:8080" command: webserver healthcheck: test: ["CMD-SHELL", "[ -f /opt/airflow/airflow-webserver.pid ]"] interval: 30s timeout: 30s retries: 3 volumes: postgres-db-volume:
3. 重新部署服务
执行以下命令清理旧容器并启动新服务:
docker-compose down -v docker-compose build docker-compose up -d
关键说明
- 新增
init-db服务专门负责初始化Airflow数据库,确保PostgreSQL中创建完整的表结构。 - 统一使用官方镜像的
/opt/airflow路径,避免路径不匹配导致的文件加载失败。 - 通过
AIRFLOW__CORE__SQL_ALCHEMY_CONN强制指定PostgreSQL作为元数据库,替代默认的SQLite。
内容的提问来源于stack exchange,提问作者Ashwini Choudhary
相关产品推荐
相关产品推荐

