Airflow + docker-compose 환경 구축 (Pycharm)

2025. 1. 12. 18:07·사이드 프로젝트

로컬 환경(window)와 개발환경(linux)환경에서 사용하기 위해 airflow를 docker-compose 환경에서 구축하면서 작성한 포스팅입니다. 참조한 문서입니다

 

https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html

 

Running Airflow in Docker — Airflow Documentation

 

airflow.apache.org

 

1. docker compose.yml 다운로드

curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.10.4/docker-compose.yaml'

airflow에서 제공하는 docker-compose.yaml을 받는다. 

https://airflow.apache.org/docs/apache-airflow/2.10.4/docker-compose.yaml

docker-compose V1에서는 정확하게 작동하지 않을 수 있다고 한다.

 

linux에서 사용할 경우, group ID는 0으로 설정하고 호스트 ID는 airflow 환경 구성에 사용해야한다. 그렇지 않으면 dags, logs, plugin 파일이 모두 root 권한으로 생성된다고 한다.

mkdir -p ./dags ./logs ./plugins ./config
echo -e "AIRFLOW_UID=$(id -u)" > .env

 

다른 운영체제의 경우 AIRFLOW_UID을 설정하지 않는다 warning 메세지를 받을 수도 있는데, 크게 걱정하지 않아도 된다.(불편하면 .env파일에 AIRFLOW_UID를 생성할 것)

 

 

docker compose up airflow-init

docker-compose.yml에 있는 airflow-init 서비스를 우선 실행하여 설정 정보를 초기화한다.

 

  airflow-init:
    <<: *airflow-common
    entrypoint: /bin/bash
    # yamllint disable rule:line-length
    command:
      - -c
      - |
        if [[ -z "${AIRFLOW_UID}" ]]; then
          echo
          echo -e "\033[1;33mWARNING!!!: AIRFLOW_UID not set!\e[0m"
          echo "If you are on Linux, you SHOULD follow the instructions below to set "
          echo "AIRFLOW_UID environment variable, otherwise files will be owned by root."
          echo "For other operating systems you can get rid of the warning with manually created .env file:"
          echo "    See: https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#setting-the-right-airflow-user"
          echo
        fi
        one_meg=1048576
        mem_available=$$(($$(getconf _PHYS_PAGES) * $$(getconf PAGE_SIZE) / one_meg))
        cpus_available=$$(grep -cE 'cpu[0-9]+' /proc/stat)
        disk_available=$$(df / | tail -1 | awk '{print $$4}')
        warning_resources="false"
        if (( mem_available < 4000 )) ; then
          echo
          echo -e "\033[1;33mWARNING!!!: Not enough memory available for Docker.\e[0m"
          echo "At least 4GB of memory required. You have $$(numfmt --to iec $$((mem_available * one_meg)))"
          echo
          warning_resources="true"
        fi
        if (( cpus_available < 2 )); then
          echo
          echo -e "\033[1;33mWARNING!!!: Not enough CPUS available for Docker.\e[0m"
          echo "At least 2 CPUs recommended. You have $${cpus_available}"
          echo
          warning_resources="true"
        fi
        if (( disk_available < one_meg * 10 )); then
          echo
          echo -e "\033[1;33mWARNING!!!: Not enough Disk space available for Docker.\e[0m"
          echo "At least 10 GBs recommended. You have $$(numfmt --to iec $$((disk_available * 1024 )))"
          echo
          warning_resources="true"
        fi
        if [[ $${warning_resources} == "true" ]]; then
          echo
          echo -e "\033[1;33mWARNING!!!: You have not enough resources to run Airflow (see above)!\e[0m"
          echo "Please follow the instructions to increase amount of resources available:"
          echo "   https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#before-you-begin"
          echo
        fi
        mkdir -p /sources/logs /sources/dags /sources/plugins
        chown -R "${AIRFLOW_UID}:0" /sources/{logs,dags,plugins}
        exec /entrypoint airflow version
    # yamllint enable rule:line-length
    environment:
      <<: *airflow-common-env
      _AIRFLOW_DB_MIGRATE: 'true'
      _AIRFLOW_WWW_USER_CREATE: 'true'
      _AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow}
      _AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow}
      _PIP_ADDITIONAL_REQUIREMENTS: ''
    user: "0:0"
    volumes:
      - ${AIRFLOW_PROJ_DIR:-.}:/sources

 

compose 파일의 airflow-init을 살펴보면 시스템 설정을 확인하여 compose 내의 환경 변수를 설정하는 것을 확인할 수 있다.

 

airflow-init-1  | [2025-01-11T06:42:33.244+0000] {override.py:1596} INFO - Added user airflow
airflow-init-1  | User "airflow" created with role "Admin"
airflow-init-1  | 2.10.4
airflow-init-1 exited with code 0

 

실행시 airflow 이라는 admin 계정이 생성된 것을 확인할 수 있다.


2. 실행

docker compose up

 

compose 명령어를 통해 실행해보자

docker desktop
docker ps

8080포트에 접속하면 ui를 확인할 수 있고, 아이디, 비밀번호 모두 airflow으로 root 계정으로 접속할 수 있다.


3. 의존성 라이브러리 추가

dag를 실습하던중에 라이브러리를 인식하지 못하는 문제를 확인하였다.

https://github.com/apache/airflow/discussions/30154

 

Discord Operator? · apache airflow · Discussion #30154

Is the Discord Operator no longer functioning? I've been trying to import it but keep getting a ModuleNotFoundError: No module named 'airflow.providers.discord'

github.com

 

 

사용중인 airflow 이미지는 일부 라이브러리만 포함되어 있지 때문에, 추가적으로 라이프러리를 추가하려면 DockerFile을 직접생성해야한다.

FROM apache/airflow:2.10.4
ADD requirements.txt .
RUN pip install apache-airflow==2.10.4 -r requirements.txt

 

requirement.txt 를 작성한다.

attrs==24.2.0
certifi==2024.8.30
cffi==1.17.1
dnspython==2.6.1
exceptiongroup==1.2.2
h11==0.14.0
idna==3.10
outcome==1.3.0.post0
pycparser==2.22
pymongo==4.10.1
PySocks==1.7.1
selenium==4.27.1
sniffio==1.3.1
sortedcontainers==2.4.0
trio==0.27.0
trio-websocket==0.11.1
typing_extensions==4.12.2
urllib3==2.2.3
websocket-client==1.8.0
wsproto==1.2.0
apache-airflow-providers-discord>=1.0.1

 

docker-compose 에서도 사용하는 &airflow-common alias에 image 부분을 수정한다

x-airflow-common:
  &airflow-common
  # In order to add custom dependencies or upgrade provider packages you can use your extended image.
  # Comment the image line, place your Dockerfile in the directory where you placed the docker-compose.yaml
  # and uncomment the "build" line below, Then run `docker-compose build` to build the images.
  # image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.10.4}
  build: .

 

docker container안에서 라이브러리를 확인할 수 있다.


4. Pycharm 디버그

Pycharm 환경에서 airflow 관련 라이브러리(XXOperator)를 인식하지 못하기 때문에 디버깅에 어려움이 있다. docker-compose를 통해 디버그를 설정할 수 있다.

airflow-python:
    <<: *airflow-common
    profiles:
        - debug
    environment:
        <<: *airflow-common-env
    user: "50000:0"
    entrypoint: [ "/bin/bash", "-c" ]

 

service 하단에 airflow-python을 추가한다.

 

인터프리터 설정에 docker-compose를 추가하여 serivice중에 airflow-python을 선택한다.

pycharm에서 빨간줄없이 제대로 인식됨을 확인할 수 있다.

'사이드 프로젝트' 카테고리의 다른 글

[Github Action] 로컬환경에서 Github Action 테스트하기  (2) 2025.04.10
[아워메뉴] ERD 설계 (엔티티 설계)  (2) 2025.02.08
2024 KUIT 프로젝트 회고  (6) 2024.08.30
네이버 지도 크롤링하기  (7) 2024.08.15
JPA 일대일 연관관계에서 지연로딩이 적용되지 않는 이유  (0) 2024.01.22
'사이드 프로젝트' 카테고리의 다른 글
  • [Github Action] 로컬환경에서 Github Action 테스트하기
  • [아워메뉴] ERD 설계 (엔티티 설계)
  • 2024 KUIT 프로젝트 회고
  • 네이버 지도 크롤링하기
bluesparrow
bluesparrow
개인 공부 목적으로 작성된 블로그 입니다.
  • bluesparrow
    Bluesparrow
    bluesparrow
  • 전체
    오늘
    어제
    • 분류 전체보기 (86)
      • 회고 (3)
      • CS (16)
        • 운영체제 (1)
        • 컴퓨터구조 (2)
        • 데이터베이스 (4)
        • 네트워크 (9)
      • PS (7)
        • 백준 (7)
      • 사이드 프로젝트 (11)
      • AI (6)
        • 강화학습 (0)
        • 기계학습 (3)
      • 보안 (13)
      • Java (10)
        • 스프링 부트 (6)
      • 인프라 (3)
        • 도커 (3)
        • AWS (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 회고
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    컴퓨터구조
    조합론
    이펙티브 자바
    이분탐색
    도커
    자바
    논문
    그리디
    강화학습
    게임이론
    트러블슈팅
    JPA
    Spring
    SpringSecurity
    BFS
    a
    그래프
    회고
    보안
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
bluesparrow
Airflow + docker-compose 환경 구축 (Pycharm)
상단으로

티스토리툴바