# syntax=docker/dockerfile:1 # Сборка и запуск Lark DE в контейнере. # # Этапы: # builder — Rust, библиотеки разработки и `cargo build --release` # runtime — библиотеки времени выполнения и сам композитор # headless — runtime плюс Xvfb и клиент: проверка без дисплея # binary — только исполняемый файл, чтобы забрать его из образа # # Примеры: # docker build -t lark . # образ для запуска # docker build --target binary -o dist . # только бинарник: dist/lark # docker build --target headless -t lark:headless . # образ для проверки # # Сборка на удалённой машине и возврат бинарника: scripts/build-remote.sh. # --- Этап сборки ------------------------------------------------------------- FROM rust:1-bookworm AS builder ENV DEBIAN_FRONTEND=noninteractive # Системные зависимости из docs/BUILD.md. clang и cmake нужны крейтам, # которые генерируют привязки во время сборки, остальное находит pkg-config. RUN apt-get update \ && apt-get install -y --no-install-recommends \ build-essential \ ca-certificates \ clang \ cmake \ git \ libclang-dev \ libdbus-1-dev \ libdrm-dev \ libexpat1-dev \ libffi-dev \ libgbm-dev \ libinput-dev \ libpipewire-0.3-dev \ libseat-dev \ libudev-dev \ libwayland-dev \ libxkbcommon-dev \ pkg-config \ && rm -rf /var/lib/apt/lists/* WORKDIR /src COPY . . # Реестр Cargo, git-зависимости и target подключены как кэш: повторная # сборка после правки кода не скачивает и не компилирует всё заново. RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/usr/local/cargo/git \ --mount=type=cache,target=/src/target \ cargo build --release --locked \ && install -m755 target/release/lark /usr/local/bin/lark # --- Этап запуска ------------------------------------------------------------ FROM debian:bookworm-slim AS runtime ENV DEBIAN_FRONTEND=noninteractive # Библиотеки времени выполнения: Wayland, xkbcommon, DRM и GBM нужны # композитору; libX11, libxcursor, libxi, libxrandr и libxkbcommon-x11 — # окну winit в X-сессии; libEGL и llvmpipe (libgl1-mesa-dri) — OpenGL ES, # в том числе программный рендеринг; DejaVu — кириллица в подписях. RUN apt-get update \ && apt-get install -y --no-install-recommends \ fonts-dejavu-core \ libdrm2 \ libegl-mesa0 \ libegl1 \ libgbm1 \ libgl1 \ libgl1-mesa-dri \ libglx-mesa0 \ libinput10 \ libseat1 \ libudev1 \ libwayland-client0 \ libwayland-server0 \ libx11-6 \ libx11-xcb1 \ libxcursor1 \ libxi6 \ libxkbcommon-x11-0 \ libxkbcommon0 \ libxrandr2 \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /usr/local/bin/lark /usr/local/bin/lark ENTRYPOINT ["/usr/local/bin/lark"] # --- Этап проверки без дисплея ----------------------------------------------- FROM runtime AS headless # Xvfb даёт виртуальный X-сервер, import снимает экран, xdotool позволяет # «нажать» кнопку перед снимком. weston-terminal и foot — клиенты с # .desktop-файлами: на них видно, что меню читает установленные приложения, # а окна появляются в сессии. RUN apt-get update \ && apt-get install -y --no-install-recommends \ foot \ imagemagick \ weston \ x11-utils \ xdotool \ xvfb \ && rm -rf /var/lib/apt/lists/* COPY scripts/dev-run.sh /usr/local/share/lark/dev-run.sh # Рендеринг программный: доступа к видеокарте у контейнера нет. ENV LIBGL_ALWAYS_SOFTWARE=1 \ LARK_BIN=/usr/local/bin/lark \ LARK_TEST_CLIENT=weston-terminal \ LARK_TEST_RUNTIME=/tmp/lark-test-run \ LARK_TEST_SHOT=/tmp/lark-shot.png \ LARK_TEST_LOG=/tmp/lark-dev-run.log # Точку входа runtime переопределяем: контейнер запускает проверку, а не # композитор напрямую. ENTRYPOINT [] CMD ["/usr/local/share/lark/dev-run.sh"] # --- Только бинарник --------------------------------------------------------- FROM scratch AS binary COPY --from=builder /usr/local/bin/lark /lark