airflow에서 제공하는 공식 docker-compose.yaml 을 통해 빌드하였다.
curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.10.3/docker-compose.yaml'
컨테이너 빌드하는 과정에서 airflow UID를 설정하라는 메세지가 나오면서 처음에 빌드가 되지 않았다.
docker compose 파일만 다운받고 빌드하려니 문제가 생겼던것 같다.
.env파일을 따로 작성해서AIRFLOW_UID를 설정해주니 컨테이너가 잘 빌드 되었다.
포트는 80:80 형태로 :앞에 숫자는 호스트 포트의 번호를 뒤의 숫자는 컨테이너의 포트를 지칭한다.
컨테이너간의 포트번호는 같아도 상관없지만, 호스트포트의 번호는 꼭 다르게 설정해주어야 한다.

cfg에서 base_url도 수정해주니 해결됐다.
*** Could not read served logs: Invalid URL 'http://:8793/log/dag_id=pro_dags_python_operator_get_data/run_id=manual__2024-12-11T05:34:31.732682+00:00/task_id=get_data_/attempt=1.log': No host supplied
- 원래는
8080:8080포트가 기본인데 스터디에서 해당 포트를 사용하고 있어서 다음과 같이 수정해주었다.airflow-webserver: <<: *airflow-common command: webserver ports: - "8081:8081" healthcheck: test: ["CMD", "curl", "--fail", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 5 start_period: 30s restart: always depends_on: <<: *airflow-common-depends-on airflow-init: condition: service_completed_successfully
/opt/airflow/airflow.cfg 파일을 기본적으로 사용하는데 작업을 좀 쉽게 하기 위해서 local에 airflow.cfg파일을 가져오고 volume도 로컬과 마운트 해주었다.
airflow.cfg파일 수정# The base url of your website: Airflow cannot guess what domain or CNAME you are using.
# This is used to create links in the Log Url column in the Browse - Task Instances menu,
# as well as in any automated emails sent by Airflow that contain links to your webserver.
#
# Variable: AIRFLOW__WEBSERVER__BASE_URL
#
base_url = http://localhost:8081
docker compose파일 volume 설정
AIRFLOW_CONFIG 환경변수는 커스터마이징한 .cfg파일을 사용할때 내 로컬에 있는 .cfg파일의 이름을 작성해서 사용하라는 것 같다.
참고 한 문서
https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html
그대로 airflow.cfg를 적당히 로컬에서 수정하고 마운트해서 사용할거라 해당 환경변수는 필요없지만 직관적인 이해를 위해 활성화 시켜놨다.
plugins 디렉토리에는 shell파일등을 위치시킬 예정이고
data 디렉토리에는 airflow Python Operator을 통해 수집된 데이터를 저장할 디렉토리 이다.
추후에 빌드할 Spark 컨테이너를 로컬의 data디렉토리로부터 읽어가 SparkJob을 실행할 예정이다.
# The following line can be used to set a custom config file, stored in the local config folder
# If you want to use it, outcomment it and replace airflow.cfg with the name of your config file
AIRFLOW_CONFIG: '/opt/airflow/airflow.cfg' # environment 에 들여쓰기된 부분
volumes:
- ./dags:/opt/airflow/dags
- ./plugins:/opt/airflow/plugins
- ./config/airflow.cfg:/opt/airflow/airflow.cfg
- ${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs
- ./data:/opt/airflow/data
-d 옵션을 주면 백그라운드에서 컨테이너를 빌드한다.$ docker compose up -d
localhost:8081로 접속도 잘 되었다.bokjunsoo@BRIAN:~/rankingflow$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0d8cfe12233 apache/airflow:2.10.3 "/usr/bin/dumb-init …" 10 minutes ago Up 9 minutes (healthy) 8080/tcp rankingflow-airflow-scheduler-1
0642805fe6d4 apache/airflow:2.10.3 "/usr/bin/dumb-init …" 10 minutes ago Up 9 minutes (unhealthy) 8080/tcp, 0.0.0.0:8081->8081/tcp rankingflow-airflow-webserver-1
9ef845d28e1d apache/airflow:2.10.3 "/usr/bin/dumb-init …" 10 minutes ago Up 9 minutes (healthy) 8080/tcp rankingflow-airflow-triggerer-1
11a7898b80f7 apache/airflow:2.10.3 "/usr/bin/dumb-init …" 10 minutes ago Up 9 minutes (healthy) 8080/tcp rankingflow-airflow-worker-1
ffccde9da5c5 redis:7.2-bookworm "docker-entrypoint.s…" 10 minutes ago Up 10 minutes (healthy) 6379/tcp rankingflow-redis-1
b5a570891541 postgres:13 "docker-entrypoint.s…" 10 minutes ago Up 10 minutes (healthy) 5432/tcp rankingflow-postgres-1
Python Operator을 이용한 API호출airflow의 보안 시스템을 이용한 API KEY 숨기기 - variable 전역변수