Airflow DAG에서
from pipeline.orders.extract import extract_raw
와 같은 import를 사용했지만, DAG Import Error가 발생하며 pipeline을 찾지 못하는 문제가 발생했다.
처음에는 Python 경로(PYTHONPATH) 문제로 판단하여 Airflow 컨테이너 Web UI 기준으로 sys.path를 확인했다.
하지만 Webserver 컨테이너 기준 경로(/usr/local/lib/...)만 확인될 뿐, 우리가 기대한 /opt/airflow/pipeline은 존재하지 않았다.


그래서 Webserver뿐 아니라 Scheduler / Worker 컨테이너로 직접 진입해 확인해보니,
문제의 핵심은 경로 설정 이전에 pipeline 폴더 자체가 컨테이너에 없다는 점이었다.
원인은 docker-compose.yaml의 volume 설정이었다.
기본 설정에서는 dags, logs, plugins만 마운트되고 있었고,
pipeline 폴더는 컨테이너로 전달되지 않고 있었다.

해결은 두 단계로 진행했다.
첫째, pipeline 폴더를 컨테이너에 마운트했다.
volumes:
- ./pipeline:/opt/airflow/pipeline
둘째, Python이 해당 경로를 모듈 탐색 대상으로 인식하도록 PYTHONPATH를 설정했다.
이 설정은 모든 Airflow 컴포넌트에 적용되도록 공통 환경 설정에 추가했다.


이후 컨테이너를 재시작하자 Webserver와 Scheduler 모두에서
pipeline 모듈을 정상적으로 import할 수 있었고, DAG Import Error도 해결되었다.
이번 문제를 통해
**“Airflow에서 import 에러가 나면 코드보다 먼저 컨테이너의 실제 파일 존재 여부와 PYTHONPATH를 확인해야 한다”**는 점을 명확히 정리할 수 있었다.
Airflow에서 pipeline을 못 찾았던 이유는 경로 문제가 아니라 컨테이너에 마운트되지 않았기 때문이었고,
volume 마운트 + PYTHONPATH 설정을 함께 적용해 해결했다.
'컨테이너·워크플로우 자동화 > Airflow로 워크플로우 자동화하기' 카테고리의 다른 글
| trigger_rule="all_done" 이란 무엇인가 (0) | 2026.02.03 |
|---|---|
| [트러블 슈팅] Airflow + PostgreSQL에서 KST 시간이 UTC처럼 저장되던 문제 (0) | 2026.01.23 |
| [트러블슈팅] BranchOperator 이후 Task가 Skipped 되는 이유와 trigger_rule (1) | 2026.01.22 |
| [트러블슈팅] Airflow FileSensor 실행 실패: fs_default Connection이 없을 때 (0) | 2026.01.21 |
| [트러블슈팅] Docker Compose로 Airflow가 안 뜰 때: health: starting 무한 루프와 PermissionError (0) | 2026.01.21 |