yams/Dockerfile
2025-09-20 22:55:34 -04:00

89 lines
4.1 KiB
Docker

# syntax=docker/dockerfile:1.7-labs
# Stage 0: base build dependencies & toolchain
# FROM ubuntu:22.04 AS deps
FROM debian:trixie-slim AS deps
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential git curl pkg-config ca-certificates \
libssl-dev libsqlite3-dev protobuf-compiler libprotobuf-dev \
libncurses-dev libcurl4-openssl-dev \
python3 python3-venv python3-pip \
gcc g++ ninja-build openssl lld llvm clang \
liburing-dev ccache \
cmake \
&& rm -rf /var/lib/apt/lists/*
RUN python3 -m venv /opt/venv \
&& /opt/venv/bin/pip install --upgrade pip \
&& /opt/venv/bin/pip install "conan==2.3.*" "meson==1.4.*" "ninja==1.11.*"
ENV PATH="/opt/venv/bin:${PATH}"
WORKDIR /src
# Stage 1: conan-base (only dependency graph resolution) — leveraged by warm-cache seeding
FROM deps AS conan-base
ARG YAMS_VERSION=dev
ARG GIT_COMMIT=""
ARG GIT_TAG=""
# Copy only dependency graph inputs (limits cache busting). We no longer rely on CMake after Meson migration.
COPY conanfile.py conanfile.txt* ./
COPY conan/ ./conan/
# COPY conan.lock ./ # Uncomment if you maintain a lockfile for deterministic builds
# Detect profile + install dependencies (cached via BuildKit cache mount)
RUN --mount=type=cache,target=/root/.conan2 \
set -eux; \
conan profile detect --force; \
sed -i 's/compiler.cppstd=.*/compiler.cppstd=20/' /root/.conan2/profiles/default; \
echo '=== Conan remotes (before ensure) ==='; conan remote list || true; \
# Ensure conancenter remote exists (some base images may have empty config)
if ! conan remote list | grep -q 'conancenter'; then \
conan remote add conancenter https://center.conan.io; \
fi; \
echo '=== Conan remotes (after ensure) ==='; conan remote list || true; \
echo '=== Searching for libarchive/3.8.1 recipe (pre-install) ==='; conan search libarchive/3.8.1 -r=conancenter || true; \
if ! conan install . --output-folder=build/yams-release -s build_type=Release --build=missing; then \
echo 'Initial conan install failed; dumping remotes and attempting a retry with cache clean.'; \
conan cache clean --temp --locks || true; \
conan search libarchive -r=conancenter || true; \
conan install . --output-folder=build/yams-release -s build_type=Release --build=missing; \
fi
# Stage 2: full build
FROM conan-base AS builder
ARG BUILD_TESTS=false
ARG BUILD_BENCHMARKS=false
ARG BUILD_DOCS=false
COPY . .
# Configure & build (reuse Conan cache) — keep runtime lean by default
RUN --mount=type=cache,target=/root/.conan2 \
conan install . --output-folder=build/yams-release -s build_type=Release --build=missing && \
meson setup build/yams-release \
--native-file build/yams-release/build-release/conan/conan_meson_native.ini \
-Dbuild-tests=${BUILD_TESTS} || (echo 'Meson setup failed' && cat build/yams-release/meson-logs/meson-log.txt && false) && \
meson compile -C build/yams-release && \
meson install -C build/yams-release --destdir /opt/yams
FROM debian:trixie-slim AS runtime
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates liburing2 \
&& rm -rf /var/lib/apt/lists/*
RUN groupadd -r yams && useradd -r -g yams -s /bin/false yams
COPY --from=builder /opt/yams /opt/yams
ENV PATH="/opt/yams/bin:${PATH}"
# Backward compatibility: retain standalone yams symlink
RUN ln -sf /opt/yams/bin/yams /usr/local/bin/yams && \
if [ -f /opt/yams/bin/yams-daemon ]; then ln -sf /opt/yams/bin/yams-daemon /usr/local/bin/yams-daemon; fi && \
mkdir -p /usr/local/share/yams/data && \
[ -f /src/data/magic_numbers.json ] || true
COPY --from=builder /src/data/magic_numbers.json /usr/local/share/yams/data
RUN mkdir -p /home/yams/.local/share/yams /home/yams/.config/yams && chown -R yams:yams /home/yams
USER yams
WORKDIR /home/yams
ENV YAMS_STORAGE="/home/yams/.local/share/yams" \
XDG_DATA_HOME="/home/yams/.local/share" \
XDG_CONFIG_HOME="/home/yams/.config"
LABEL org.opencontainers.image.description="YAMS server & daemon. Run 'yams serve' for MCP or 'yams-daemon' for socket daemon."
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 CMD yams --version || exit 1
ENTRYPOINT ["yams"]
CMD ["--help"]