如何用Docker Compose运行Airflow 1.10.14及权限问题排查
问题
为维护遗留项目需部署Airflow 1.10.14,因本地安装易引发系统依赖冲突,选择Docker Compose部署。该版本无官方docker-compose.yaml,自行编写配置后,运行docker-compose up时持续报错:
Unable to configure handler 'processor': [Errno 13] Permission denied: '/opt/airflow/logs/scheduler'
已尝试生成.env文件(内容如下),但问题未解决:
AIRFLOW_UID=1004 AIRFLOW_GID=0
自行编写的docker-compose.yaml配置:
version: '3' x-airflow-common: &airflow-common image: apache/airflow:1.10.14 environment: - AIRFLOW__CORE__EXECUTOR=CeleryExecutor - AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow - AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://airflow:airflow@postgres/airflow - AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0 - AIRFLOW__CORE__FERNET_KEY=FB0o_zt4e3Ziq3LdUUO7F2Z95cvFFx16hU8jTeR1ASM= - AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION=True volumes: - ./dags:/opt/airflow/dags - ./airflow-data/logs:/opt/airflow/logs - ./airflow-data/plugins:/opt/airflow/plugins depends_on: redis: condition: service_healthy postgres: condition: service_healthy services: postgres: image: postgres:9.5 environment: POSTGRES_USER: airflow POSTGRES_PASSWORD: airflow POSTGRES_DB: airflow volumes: - ./airflow-data/postgres-db-volume:/var/lib/postgresql/data healthcheck: test: ["CMD", "pg_isready", "-U", "airflow"] interval: 30s retries: 5 restart: always redis: image: redis:latest ports: - 6379:6379 healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 30s retries: 50 restart: always airflow-webserver: << : *airflow-common user: "airflow" command: webserver ports: - 8080:8080 healthcheck: test: ["CMD", "curl", "--fail", "http://localhost:8080/health"] interval: 10s timeout: 10s retries: 5 restart: always airflow-scheduler: << : *airflow-common user: "airflow" command: scheduler restart: always airflow-worker: << : *airflow-common user: "airflow" command: worker restart: always airflow-init: << : *airflow-common entrypoint: /bin/bash user: "airflow" command: - -c - airflow list_users || ( airflow initdb && airflow create_user --role Admin --username airflow --password airflow --email airflow@airflow.com --firstname airflow --lastname airflow ) restart: on-failure flower: << : *airflow-common user: "airflow" command: flower ports: - 5555:5555 healthcheck: test: ["CMD", "curl", "--fail", "http://localhost:5555/healthcheck"] interval: 10s timeout: 10s retries: 5 restart: always
操作环境:Ubuntu,拥有sudo权限,Python 3.8,Docker新手。询问问题原因及是否应放弃Docker改用本地安装。
解决方案与分析
问题原因
- 配置中硬编码了
user: "airflow",未引用.env中的AIRFLOW_UID/AIRFLOW_GID变量,导致容器内airflow用户无法访问本地挂载的目录 - 本地挂载的
logs等目录权限未与容器内用户权限匹配,引发读写权限拒绝 - Airflow 1.10.x镜像默认airflow用户UID为50000,若本地UID不匹配且未做映射,会出现权限冲突
修复步骤
清理现有容器与残留数据
docker-compose down -v-v参数会删除关联的卷,避免旧权限数据残留修改docker-compose.yaml配置
将所有服务中的user: "airflow"替换为:user: "${AIRFLOW_UID:-50000}:${AIRFLOW_GID:-50000}"该配置会优先使用
.env中的UID/GID,若未定义则使用镜像默认值,确保权限映射正确设置本地目录权限
手动调整本地挂载目录的所有者与权限,匹配.env中的UID/GID:sudo mkdir -p ./dags ./airflow-data/logs ./airflow-data/plugins ./airflow-data/postgres-db-volume sudo chown -R 1004:0 ./dags ./airflow-data/logs ./airflow-data/plugins sudo chmod -R 775 ./dags ./airflow-data/logs ./airflow-data/plugins重新启动服务
docker-compose up -d
是否放弃Docker?
绝对不建议。Airflow 1.10.14最高仅支持Python 3.7,而你的环境是Python 3.8,本地安装会出现严重的版本兼容性问题,还会污染系统依赖库,后续维护成本极高。Docker是隔离旧版本环境的最优方案,解决权限问题后即可稳定运行。
内容的提问来源于stack exchange,提问作者Vinicius Silva
相关产品推荐
相关产品推荐

