Docker Compose로 Airflow + git-sync 구성
- git sync sidecar 컨테이너를 통해 주기적으로 동기화
- dev/staging/production 환경 구분에도 활용
- (k8s 환경의 helm chart 기반 설정은 별도 포스팅)
docker-compose 구성
- Airflow는
AIRFLOW__CORE__DAGS_FOLDER
에서 DAG 스캔
x-airflow-common: &airflow-common
image: <...>
environment: &airflow-common-env
AIRFLOW__CORE__DAGS_FOLDER: /opt/airflow/dags/git-sync/current/airflow/dags
volumes:
- airflow-dags-volume:/opt/airflow/dags
user: "50000:0"
services:
git-sync:
image: registry.k8s.io/git-sync/git-sync:v4.3.0
user: "50000:0"
restart: always
env_file:
- .env
environment:
GITSYNC_REPO: ${GITSYNC_REPO}
GITSYNC_USERNAME: ${GITSYNC_USERNAME}
GITSYNC_PASSWORD: ${GITSYNC_PASSWORD}
GITSYNC_REF: ${GITSYNC_REF:-next}
GITSYNC_PERIOD: ${GITSYNC_PERIOD:-30s}
GITSYNC_DEPTH: ${GITSYNC_DEPTH:-1}
GITSYNC_ROOT: /dags/git-sync
GITSYNC_DEST: repo
GITSYNC_LINK: current
GITSYNC_ONE_TIME: "false"
GITSYNC_ADD_USER: "true"
GITSYNC_STALE_WORKTREE_TIMEOUT: ${GITSYNC_STALE_WORKTREE_TIMEOUT:-24h}
volumes:
- airflow-dags-volume:/dags
healthcheck:
test: ["CMD-SHELL", "test -L /dags/git-sync/current && test -d /dags/git-sync/current/airflow/dags && [ \"$(ls -A /dags/git-sync/current/airflow/dags 2>/dev/null)\" ]"]
interval: 10s
timeout: 3s
retries: 10
start_period: 10s
airflow-webserver:
<<: *airflow-common
depends_on:
git-sync: { condition: service_healthy }
airflow-scheduler:
<<: *airflow-common
depends_on:
git-sync: { condition: service_healthy }
volumes:
airflow-dags-volume:
git sync variables
GITSYNC_ROOT
: git-sync root 디렉토리
- git clone, revision
- ex.
/dags/git-sync
GITSYNC_DEST
: GITSYNC_ROOT
하위의 repo 디렉토리명
GITSYNC_LINK
: symlink 이름
- ex)
current
- ->
GITSYNC_ROOT
+ GITSYNC_DEST
+ GITSYNC_LINK
가 컨테이너 내 최신 dag 경로
- airflow 에서
AIRFLOW__CORE__DAGS_FOLDER
를 위 경로로 설정
GITSYNC_DEPTH
: shallow clone 깊이
GITSYNC_REF
: git repo 에 대한 reference 지정
- git ref. branch, tag, commit hash 등
- branch, tag 를 통해 staging, production 환경 구분
GITSYNC_PERIOD
: 동기화 주기 ex. 30s
GITSYNC_STALE_WORKTREE_TIMEOUT
: stale worktree (prev revision) 보존하는 timeout
- 위 동기화 주기마다 timeout 체크 후 제거
GITSYNC_ONE_TIME
: 한번만 동기화할 것인지