Docker环境执行dbt deps报dbt_modules权限拒绝错误
问题根因
你遇到的是两个独立问题:
[Errno 13] Permission denied: 'dbt_modules':dbt deps默认会在执行命令时所在的dbt项目根目录创建dbt_modules文件夹存放拉取的第三方包,你当前容器内运行进程的UID 50000对目标目录没有写入权限,导致目录创建失败。dbt_modules的路径规则和你dbt_project.yml里clean-targets的配置完全对应,没有隐藏的特殊存放路径。- pyarrow版本告警:安装pandas时pip默认拉取了最新的6.0.1版本,和dbt 0.21.1要求的
pyarrow<3.1.0,>=3.0.0版本约束冲突。
修复方案
1. 解决目录权限问题
- 先在宿主机的项目根目录(存放docker-compose.yaml的位置)执行命令,提前创建dbt运行需要的目录,把属主改成容器内使用的UID/GID,避免挂载后权限不匹配:
mkdir -p ./dbt/dbt_modules ./dbt/target ./dbt/dbt_packages sudo chown -R 50000:50000 ./dbt ~/.dbt
- 修改docker-compose.yaml的卷挂载配置,去掉
~/.dbt的只读标记,否则后续dbt需要写入配置时会触发新的权限错误:
volumes: - ./dags:/opt/airflow/dags - ./logs:/opt/airflow/logs - ./plugins:/opt/airflow/plugins - ./config/airflow.cfg:/opt/airflow/airflow.cfg - ./dbt:/opt/airflow/dbt - ~/.dbt:/home/airflow/.dbt - ./dags:/dags
- 执行dbt命令时必须指定正确的项目目录,不要在容器默认工作目录
/opt/airflow下直接运行,否则会尝试在无权限的路径创建dbt_modules,标准执行命令如下:
dbt deps --project-dir /opt/airflow/dbt --profiles-dir /home/airflow/.dbt
- 如果不想在宿主机提前授权,也可以修改Dockerfile,在构建镜像时提前创建dbt工作目录并给airflow用户授权:
FROM ${AIRFLOW_BASE_IMAGE} USER root RUN mkdir -p /opt/airflow/dbt && chown -R airflow:root /opt/airflow/dbt USER airflow RUN pip install dbt \ apache-airflow-providers-microsoft-azure==3.7.0 \ apache-airflow-providers-snowflake\ riotwatcher \ pandas
2. 解决pyarrow版本冲突
修改Dockerfile的pip安装命令,固定pyarrow版本到符合约束的区间,同时固定dbt版本避免后续升级带来兼容性问题:
USER airflow RUN pip install dbt==0.21.1 \ pyarrow==3.0.2 \ apache-airflow-providers-microsoft-azure==3.7.0 \ apache-airflow-providers-snowflake\ riotwatcher \ pandas
修改完成后重新构建镜像并重启服务:
docker-compose build --no-cache docker-compose up -d
验证步骤
- 进入airflow worker容器:
docker-compose exec airflow-worker bash - 执行上述dbt deps命令,确认可以正常拉取fishtown-analytics/dbt_utils包,无权限报错
- 执行
pip show pyarrow,确认版本为3.0.2,版本不兼容告警消失
内容的提问来源于stack exchange,提问作者ryanwacker
相关产品推荐
相关产品推荐

