# cuframes-composer — production Docker image. # # Multi-stage: # 1) builder: nvidia/cuda CUDA-toolkit + build deps + cmake build # 2) runtime: nvidia/cuda base (минимум: libcudart) + runtime deps + бинарь # # Размер runtime image: ~250 MB (cuda runtime + apt-deps). Build image: ~5 GB. # # Использование: # docker build -t gx/cuframes-composer:0.1 -f docker/Dockerfile . # docker run --gpus all --network=cctv --ipc=container:cuframes-ipc-anchor \ # -v cctv_cuframes_sock:/run/cuframes:ro \ # -v cuda_grid_icons:/icons:ro \ # -v /usr/share/fonts/truetype/dejavu:/fonts:ro \ # -p 5599:5599 \ # gx/cuframes-composer:0.1 grid_record --out - --control tcp://0.0.0.0:5599 ... # # Лицензия: LGPL-2.1+ # ── Builder ────────────────────────────────────────────────────────────── # CUDA 12 (не 13) — нужен для sm_61 (Pascal GTX 1050) в production. # CUDA 13 deprecated Pascal. Ubuntu 22.04 jammy glibc 2.35 forward-compat # на хосте 24.04 noble (glibc 2.39). FROM nvidia/cuda:12.4.1-devel-ubuntu22.04 AS builder RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential cmake git pkg-config \ libpng-dev libfreetype-dev \ libzmq3-dev libjson-c-dev libmosquitto-dev \ libavformat-dev libavcodec-dev libavutil-dev \ && rm -rf /var/lib/apt/lists/* WORKDIR /src COPY . . RUN git submodule update --init --recursive || true # CUDA architectures: production targets compiled to real binary, # а sm_89-virtual генерит PTX для forward JIT на newer GPU (Blackwell sm_120 # = JIT на старте при первом kernel'е). Это избавляет нас от требования # CUDA 12.8+ который sm_120 native. CUDA 12.4 здесь — sweet spot между # Pascal (sm_61) и Ada (sm_89). RUN mkdir -p build && cd build && \ cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CUDA_ARCHITECTURES="61-real;75-real;86-real;89-real;89-virtual" \ .. && \ make -j$(nproc) # ── Runtime ────────────────────────────────────────────────────────────── # runtime variant включает libcudart12 (нужен grid_record/simple_record). FROM nvidia/cuda:12.4.1-runtime-ubuntu22.04 AS runtime # Ubuntu 22.04 jammy: package names иные чем noble (libpng16-16 без t64). # libcudart12 уже в runtime image; здесь только наши user-space deps. # netcat-openbsd — для healthcheck'а через ZMQ ping (см. HEALTHCHECK ниже). # ffmpeg — для transmux raw h264 → mpegts (shell pipe chain после # grid_record); без него ffmpeg-mux downstream не справляется с # intra refresh без IDR boundaries. RUN apt-get update && apt-get install -y --no-install-recommends \ libpng16-16 libfreetype6 \ libzmq5 libjson-c5 libmosquitto1 \ libavformat58 libavcodec58 libavutil56 \ fonts-dejavu-core \ netcat-openbsd \ && rm -rf /var/lib/apt/lists/* # Бинари + libcuframes (статически слинкована не вся, libcuframes shared нужен). COPY --from=builder /src/build/examples/grid_record /usr/local/bin/grid_record COPY --from=builder /src/build/examples/simple_record /usr/local/bin/simple_record COPY --from=builder /src/build/third_party/cuframes/libcuframes/libcuframes.so.0.4.0 \ /usr/lib/x86_64-linux-gnu/libcuframes.so.0 COPY --from=builder /src/build/src/libcuframes_composer.so.0.1.0 \ /usr/lib/x86_64-linux-gnu/libcuframes_composer.so.0 # Phase 11 — layout templates.json. Editable in-container или mount override. COPY docker/templates.json /etc/cfc-grid/templates.json # NVIDIA_DRIVER_CAPABILITIES должен включать 'video' для NVENC через libnvidia-encode. ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility,video # Healthcheck — проверяет что ZMQ control plane port слушается. # Полная functional проверка через ZMQ ping требует ZMTP handshake (plain nc # не подходит — это binary wire protocol с greeting), поэтому здесь только # liveness через TCP probe. Composer thread'ы (compose/encode) могут зависнуть # без падения main process'а, но external monitor (MQTT health uptime_s, # Prometheus в Phase 7) дополнит контроль over time. HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ CMD nc -z 127.0.0.1 5599 || exit 1 ENTRYPOINT ["/usr/local/bin/grid_record"] CMD ["--help"]