diff --git a/Dockerfile.airflow b/Dockerfile.airflow index c2c6865..d366f89 100644 --- a/Dockerfile.airflow +++ b/Dockerfile.airflow @@ -5,15 +5,20 @@ LABEL maintainer="your-email@example.com" LABEL description="Airflow with Greenplum and Pandas dependencies" LABEL version="1.0" +# Устанавливаем psql для ручной диагностики внутри контейнера +USER root +RUN apt-get update \ + && apt-get install -y --no-install-recommends postgresql-client \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + # Копируем requirements в стандартное расположение COPY airflow/requirements.txt /opt/airflow/requirements.txt # Устанавливаем зависимости +USER airflow RUN pip install --no-cache-dir -r /opt/airflow/requirements.txt \ && pip check \ && rm -rf /tmp/pip-* -# Переключаемся на пользователя airflow -USER airflow - WORKDIR /opt/airflow diff --git a/README.md b/README.md index 1a22e46..a1334a8 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,19 @@ Healthcheck сервиса `greenplum` учитывает не только го --- +### Airflow: свой образ + +Airflow тоже собирается из собственного `Dockerfile.airflow`, чтобы зависимости ставились при сборке, а не во время старта контейнеров. В образ включены: + +- Python‑зависимости из `airflow/requirements.txt`; +- утилита `psql` для быстрых проверок внутри контейнера. + +Если меняли `airflow/requirements.txt` или `Dockerfile.airflow`, пересоберите образы: `make build`, затем `make up`. + +В docker-compose по умолчанию задан `AIRFLOW__CORE__EXECUTOR=LocalExecutor` (параллельное выполнение задач). Если нужен последовательный режим — замените на `SequentialExecutor` в `docker-compose.yml`. + +--- + ### Локальное окружение разработчика Локальным окружением управляет [uv](https://docs.astral.sh/uv/) — он скачивает нужный Python и создаёт `.venv` на основе `pyproject.toml` / `uv.lock`. diff --git a/TESTING.md b/TESTING.md index 46cef5e..23437d6 100644 --- a/TESTING.md +++ b/TESTING.md @@ -20,6 +20,7 @@ - `cp .env.example .env` (если файла ещё нет) и проверьте переменные: - `GP_PORT` — внутренний порт Greenplum в Docker-сети (по умолчанию 5432, менять не нужно); внешний порт для подключения с хоста фиксирован на `5435`, поэтому локальный PostgreSQL на 5432 не помешает. - `GP_USE_AIRFLOW_CONN=true` при желании использовать Airflow Connection; `false` — fallback на ENV. +- Если меняли `airflow/requirements.txt` или `Dockerfile.airflow`, выполните `make build` перед `make up`. - `make up` — поднимаем все сервисы. Важно дождаться статуса `healthy` у `pgmeta` и `greenplum` (`docker compose ps`); `greenplum` считается `healthy` только когда поднят и Greenplum, и PXF. - `make logs` — следим, пока webserver и scheduler не перейдут в рабочее состояние (`Listening at: http://0.0.0.0:8080`). diff --git a/TODO.md b/TODO.md index 2c55d2f..ab75533 100644 --- a/TODO.md +++ b/TODO.md @@ -3,14 +3,16 @@ Этот файл собирает идеи по доработке стенда, которые не критичны для текущих задач менти, но улучшат стабильность и удобство сопровождения. -- Собрать свой образ Airflow поверх `apache/airflow:2.9.2`: +Статус: все пункты ниже выполнены и отражены в README/TESTING. + +- [x] Собрать свой образ Airflow поверх `apache/airflow:2.9.2`: - вынести установку Python‑зависимостей из runtime (`pip install ...` при старте контейнеров) в отдельный `Dockerfile`; - переключить `docker-compose.yml` на использование этого образа для `airflow-webserver`, `airflow-scheduler` и `airflow-init`; - обновить документацию (README/TESTING) под новую схему сборки. -- Переключить Airflow с `SequentialExecutor` (SequentialScheduler) на `LocalExecutor` +- [x] Переключить Airflow с `SequentialExecutor` (SequentialScheduler) на `LocalExecutor` для docker‑стенда: - проверить, какие параметры достаточно поменять в env/конфиге (`AIRFLOW__CORE__EXECUTOR`) для образа `apache/airflow:2.9.2`; @@ -18,7 +20,7 @@ предсказуемо в режиме параллельного исполнения; - при необходимости скорректировать тесты и документацию (README/TESTING) с учётом нового executor’а. -- Разобрать и стабилизировать интеграцию с Greenplum/PXF: +- [x] Разобрать и стабилизировать интеграцию с Greenplum/PXF: - убедиться, что PXF в контейнере `greenplum` всегда корректно инициализируется (нет ошибок вида `protocol "pxf" does not exist` при первом запуске `make ddl-gp`); - при необходимости доработать init‑скрипты в `pxf/init/` и/или документацию, @@ -26,16 +28,16 @@ - добавить краткий раздел в README/TESTING о типичных ошибках PXF/Greenplum и шагах по их устранению. - диагностика текущего кейса: `docs/internal/pxf_bookings.md` (раздел «Известная проблема»). -- Разобраться с генератором demodb: +- [x] Разобраться с генератором demodb: - после `make bookings-init` таблица `bookings.bookings` остаётся пустой; - патчи `bookings/patches/engine_jobs1_sync.patch` и `bookings/patches/install_drop_if_exists.patch` падают при применении (hunk failed / garbage in patch); - из‑за этого DAG `bookings_to_gp_stage` валится на проверках (источник пустой). - план: `plans/bookings-demodb-bugfix-plan.md` -- Добавить раздел «Благодарности» в `README.md`: +- [x] Добавить раздел «Благодарности» в `README.md`: - явно поблагодарить Postgres Pro за демо‑БД bookings (репозиторий `postgrespro/demodb`); - указать автора Docker‑сборки Greenplum (`woblerr/docker-greenplum`, образ `woblerr/greenplum`); - при необходимости сослаться на соответствующие лицензии/README исходных проектов. -- Добавить в образ Airflow установку `psql`, чтобы тестировать загрузку CSV из CLI внутри контейнера (без root и дополнительных зависимостей на хосте). +- [x] Добавить в образ Airflow установку `psql`, чтобы тестировать загрузку CSV из CLI внутри контейнера (без root и дополнительных зависимостей на хосте).