From 4cb11b4769978ec1d617aafeaec65a8b6e84e443 Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Sat, 13 Dec 2025 22:21:41 +0300 Subject: [PATCH] feat: use custom docker image for airflow to avoid runtime pip install --- Dockerfile | 4 ++++ Makefile | 5 ++++- docker-compose.yml | 26 ++++++++++++-------------- 3 files changed, 20 insertions(+), 15 deletions(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..fd508b9 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +FROM apache/airflow:2.9.2 + +COPY airflow/requirements.txt /requirements.txt +RUN pip install --no-cache-dir -r /requirements.txt diff --git a/Makefile b/Makefile index 4ea395d..ea563ea 100644 --- a/Makefile +++ b/Makefile @@ -9,12 +9,15 @@ BOOKINGS_INIT_DAYS ?= 1 .PHONY: up stop down clean airflow-init logs gp-psql ddl-gp \ bookings-clone-demodb bookings-init bookings-psql bookings-generate-day \ - dev-setup dev-sync dev-lock test lint fmt clean-venv + dev-setup dev-sync dev-lock test lint fmt clean-venv build SHELL := /bin/bash up: docker compose -f docker-compose.yml up -d +build: + docker compose -f docker-compose.yml build + stop: docker compose -f docker-compose.yml stop diff --git a/docker-compose.yml b/docker-compose.yml index e149ea7..a60b225 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,7 +14,7 @@ services: volumes: - pgmeta:/var/lib/postgresql/data healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${PG_USER} -d ${PG_DB}"] + test: [ "CMD-SHELL", "pg_isready -U ${PG_USER} -d ${PG_DB}" ] interval: 5s timeout: 5s retries: 20 @@ -35,13 +35,13 @@ services: # В этот каталог будет монтироваться генератор demodb - ./bookings:/bookings:ro healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${BOOKINGS_DB_USER} -d ${BOOKINGS_DB_NAME}"] + test: [ "CMD-SHELL", "pg_isready -U ${BOOKINGS_DB_USER} -d ${BOOKINGS_DB_NAME}" ] interval: 5s timeout: 5s retries: 20 greenplum: - image: woblerr/greenplum:6.27.1 # based on https://github.com/woblerr/docker-greenplum + image: woblerr/greenplum:6.27.1 # based on https://github.com/woblerr/docker-greenplum # container_name: gp_single # hostname: gpdbsne environment: @@ -61,13 +61,14 @@ services: - greenplum_data:/data # Простая проверка доступности: psql откликается healthcheck: - test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -p 5432 -U ${GP_USER:-gpadmin} -d ${GP_DB:-gp_dwh} || echo 1"] + test: [ "CMD-SHELL", "pg_isready -h 127.0.0.1 -p 5432 -U ${GP_USER:-gpadmin} -d ${GP_DB:-gp_dwh} || echo 1" ] interval: 10s timeout: 5s retries: 30 airflow-webserver: - image: apache/airflow:2.9.2 + build: . + image: airflow-custom:latest container_name: gp_airflow_web env_file: .env environment: @@ -77,9 +78,7 @@ services: AIRFLOW__WEBSERVER__SECRET_KEY: ${AIRFLOW__WEBSERVER__SECRET_KEY} AIRFLOW_CONN_GREENPLUM_CONN: postgresql://${GP_USER}:${GP_PASSWORD}@greenplum:${GP_PORT:-5432}/${GP_DB} AIRFLOW_CONN_BOOKINGS_DB: postgresql://${BOOKINGS_DB_USER}:${BOOKINGS_DB_PASSWORD}@bookings-db:5432/demo - command: > - bash -lc "pip install --no-cache-dir -r /opt/airflow/requirements.txt && - airflow webserver" + command: airflow webserver ports: - "8080:8080" volumes: @@ -96,7 +95,8 @@ services: condition: service_completed_successfully airflow-scheduler: - image: apache/airflow:2.9.2 + build: . + image: airflow-custom:latest container_name: gp_airflow_sch env_file: .env environment: @@ -106,9 +106,7 @@ services: AIRFLOW__WEBSERVER__SECRET_KEY: ${AIRFLOW__WEBSERVER__SECRET_KEY} AIRFLOW_CONN_GREENPLUM_CONN: postgresql://${GP_USER}:${GP_PASSWORD}@greenplum:${GP_PORT:-5432}/${GP_DB} AIRFLOW_CONN_BOOKINGS_DB: postgresql://${BOOKINGS_DB_USER}:${BOOKINGS_DB_PASSWORD}@bookings-db:5432/demo - command: > - bash -lc "pip install --no-cache-dir -r /opt/airflow/requirements.txt && - airflow scheduler" + command: airflow scheduler volumes: - ./airflow/dags:/opt/airflow/dags - ./airflow/requirements.txt:/opt/airflow/requirements.txt @@ -123,7 +121,8 @@ services: condition: service_completed_successfully airflow-init: - image: apache/airflow:2.9.2 + build: . + image: airflow-custom:latest # container_name: gp_airflow_init user: "0" env_file: .env @@ -143,7 +142,6 @@ services: bash -lc " set -e; mkdir -p /opt/airflow/data && chown -R airflow:root /opt/airflow/data; - su -s /bin/bash airflow -c \"PATH='/home/airflow/.local/bin:$${PATH}' pip install --no-cache-dir -r /opt/airflow/requirements.txt\"; # Дожидаемся готовности БД ретрая миграции for i in {1..30}; do su -s /bin/bash airflow -c \"PATH='/home/airflow/.local/bin:$${PATH}' airflow db migrate\" && break || echo 'waiting for pgmeta' && sleep 3;