Post

Docker Compose部署OpenCVE与Airflow:权限配置与问题排查指南

2026-04-30

OpenCVE 与 Airflow 在 Docker Compose 环境下的部署实践

概述

本文基于 OpenCVE 官方部署文档的真实部署经验,系统梳理 OpenCVE 与 Apache Airflow 在 Docker Compose 场景下的部署配置要点、Git 权限处理方案及常见问题解决方案。重点解决因 Git 安全策略与文件系统权限导致的系统稳定性问题。

核心组件构成

部署架构包含以下核心组件:

  • OpenCVE:由 Django Web 服务与 CVE 数据处理 Worker 组成
  • Apache Airflow:负责任务调度,包含 Webserver、Scheduler 与 opencve DAG
  • 基础服务:PostgreSQL(数据存储)与 Redis(缓存)
  • Git 数据仓库:包含 vulnrichment、cve-data、rules 三个关键仓库

部署关键配置原则

1. Airflow 容器用户权限配置

强制要求:禁止使用 root 用户运行 Airflow 容器

airflow-scheduler:
  image: apache/airflow:2.x
  user: "${AIRFLOW_UID:-50000}:0"

原因

  • Airflow 官方推荐非 root 用户运行
  • Git 安全策略在 root 权限下更容易触发异常
  • 非 root 环境下文件权限问题更易排查

2. Git 仓库挂载规范

强制要求:使用 bind mount 挂载 Git 仓库目录

volumes:
  - ./repositories:/home/airflow/repositories

禁用路径

  • /root/...
  • /opt/...
  • /tmp/...

初始化配置流程

1. 一次性初始化操作(仅需执行一次)

步骤说明

  1. 进入 Airflow 容器(需 root 权限)
    docker compose exec --user root airflow-scheduler bash
    
  2. 配置 Git 安全目录(Git ≥ 2.35 必须)
    git config --global --add safe.directory /home/airflow/repositories
    # 或更严格限制
    git config --global --add safe.directory /home/airflow/repositories/vulnrichment
    
  3. 修复 Git 仓库写权限(容器内执行)
    chown -R airflow:0 /home/airflow/repositories
    chmod -R u+rwX /home/airflow/repositories
    
  4. 验证权限是否生效
    su airflow
    cd /home/airflow/repositories/vulnrichment
    git fetch
    

常见问题与解决方案

1. dubious ownership in repository 错误

错误特征

fatal: detected dubious ownership in repository

解决方案

git config --global --add safe.directory /home/airflow/repositories

2. .git/FETCH_HEAD: Permission denied

错误特征

error: cannot open '.git/FETCH_HEAD': Permission denied

根本原因

  • airflow 用户缺少写权限
  • Git fetch 需要写入 .git/FETCH_HEAD

解决方案
在容器内执行:

chown -R airflow:0 /home/airflow/repositories
chmod -R u+rwX /home/airflow/repositories

3. DAG 显示失败但日志显示成功

现象描述
DAG 状态显示失败,但任务日志显示执行成功
原因分析

  • 前序任务或历史运行失败导致 DAG 状态异常
  • 不是 DAG 文件本身的问题

解决方案

  • 通过 Airflow UI 执行 Clear Task / Clear DAG Run
  • 或重新触发完整 DAG 执行

4. 是否需要删除 opencve DAG?

结论:❌ 不需要
原因

  • DAG 仅定义任务逻辑,问题根源在文件系统/Git 权限
  • 删除 DAG 无法解决根本问题

生产环境优化建议

1. 降低 Git 操作频率

推荐方案

  • 由单个 DAG 统一执行 git fetch
  • 后续任务使用本地数据,避免重复拉取

2. 实施最小权限原则

  • 仅对需要更新的仓库开放写权限
  • 其余仓库设置为只读模式

3. 初始化脚本化

建议在 Airflow 容器启动脚本中添加:

git config --global --add safe.directory /home/airflow/repositories
chown -R airflow:0 /home/airflow/repositories
chmod -R u+rwX /home/airflow/repositories

目的:避免新环境重复踩坑

注意事项

  • 本方案基于 Git ≥ 2.35 的安全策略特性
  • PostgreSQL 与 Redis 的配置需参考 container-database 概念文档
  • Git 权限问题可能与 ssl-certificate-management 中的 Git 配置存在关联