Files
metabuilder/deployment/base-images/Dockerfile.conan-deps
2026-03-09 22:30:41 +00:00

112 lines
5.1 KiB
Docker

# metabuilder/base-conan-deps
#
# All Conan C++ packages pre-built and cached in /root/.conan2.
# Covers: DBAL daemon (drogon, sqlite3, postgres, mongo, redis, cassandra...),
# Qt6 frontend, CLI frontend.
#
# Build: docker build -f Dockerfile.conan-deps -t metabuilder/base-conan-deps:latest ../../
# App Dockerfiles:
# COPY --from=metabuilder/base-conan-deps /root/.conan2 /root/.conan2
ARG BASE_REGISTRY=metabuilder
FROM ${BASE_REGISTRY}/base-apt:latest
# Install Conan 2 with retry
RUN for i in 1 2 3 4 5; do \
pip3 install --break-system-packages conan==2.* \
&& break \
|| (echo "pip install failed (attempt $i/5), retrying in $((i*10))s..." && sleep $((i*10))); \
done
# Detect Conan profile (must run inside the container, not from host cache)
RUN conan profile detect --force
# ── DBAL daemon ───────────────────────────────────────────────────────────────
COPY dbal/production/build-config/conanfile.py /deps/dbal/conanfile.py
RUN mkdir -p /tmp/dbal-build && \
for i in 1 2 3 4 5; do \
conan install /deps/dbal/ \
--output-folder=/tmp/dbal-build \
--build=missing \
-s build_type=Release \
-c tools.system.package_manager:mode=install \
-c tools.system.package_manager:mode=install \
&& break \
|| (echo "conan install (dbal) failed attempt $i/5, retrying in $((i*10))s..." && sleep $((i*10))); \
done
# ── Qt6 frontend ──────────────────────────────────────────────────────────────
COPY frontends/qt6/conanfile.txt /deps/qt6/conanfile.txt
# Pre-fetch Qt recipe into Conan cache, then patch source URL to use fast UK
# mirror (default download.qt.io is very slow outside central EU)
ARG QT_MIRROR=https://mirrors.ukfast.co.uk/sites/qt.io
RUN conan graph info /deps/qt6/ -s build_type=Release 2>/dev/null || true && \
find /root/.conan2 -name "conandata.yml" -exec grep -l "download.qt.io" {} \; | \
xargs -r sed -i "s|https://download.qt.io|${QT_MIRROR}|g"
RUN mkdir -p /tmp/qt6-build && \
for i in 1 2 3 4 5; do \
conan install /deps/qt6/ \
--output-folder=/tmp/qt6-build \
--build=missing \
-s build_type=Release \
-c tools.system.package_manager:mode=install \
-c tools.system.package_manager:mode=install \
&& break \
|| (echo "conan install (qt6) failed attempt $i/5, retrying in $((i*10))s..." && sleep $((i*10))); \
done
# ── CLI frontend ──────────────────────────────────────────────────────────────
COPY frontends/cli/conanfile.txt /deps/cli/conanfile.txt
RUN mkdir -p /tmp/cli-build && \
for i in 1 2 3 4 5; do \
conan install /deps/cli/ \
--output-folder=/tmp/cli-build \
--build=missing \
-s build_type=Release \
-c tools.system.package_manager:mode=install \
-c tools.system.package_manager:mode=install \
&& break \
|| (echo "conan install (cli) failed attempt $i/5, retrying in $((i*10))s..." && sleep $((i*10))); \
done
# ── Game engine ───────────────────────────────────────────────────────────────
COPY gameengine/conanfile.py /deps/gameengine/conanfile.py
RUN mkdir -p /tmp/gameengine-build && \
for i in 1 2 3 4 5; do \
conan install /deps/gameengine/ \
--output-folder=/tmp/gameengine-build \
--build=missing \
-s build_type=Release \
-c tools.system.package_manager:mode=install \
-c tools.system.package_manager:mode=install \
&& break \
|| (echo "conan install (gameengine) failed attempt $i/5, retrying in $((i*10))s..." && sleep $((i*10))); \
done
# ── Media daemon ──────────────────────────────────────────────────────────────
COPY services/media_daemon/build-config/conanfile.txt /deps/media-daemon/conanfile.txt
RUN mkdir -p /tmp/media-build && \
for i in 1 2 3 4 5; do \
conan install /deps/media-daemon/ \
--output-folder=/tmp/media-build \
--build=missing \
-s build_type=Release \
-c tools.system.package_manager:mode=install \
-c tools.system.package_manager:mode=install \
&& break \
|| (echo "conan install (media-daemon) failed attempt $i/5, retrying in $((i*10))s..." && sleep $((i*10))); \
done
# Clean up tmp build dirs (keep only the Conan package cache in /root/.conan2)
RUN rm -rf /tmp/dbal-build /tmp/qt6-build /tmp/cli-build \
/tmp/gameengine-build /tmp/media-build
LABEL org.metabuilder.image="base-conan-deps" \
org.metabuilder.description="Pre-built Conan C++ packages (DBAL, Qt6, CLI)"