Files
attune/docker/Dockerfile.pack-builder
2026-03-04 22:02:34 -06:00

106 lines
3.6 KiB
Docker

# Dockerfile for building Attune pack binaries with maximum GLIBC compatibility
#
# This builds native pack binaries (sensors, etc.) using an older GLIBC version
# to ensure forward compatibility across different deployment environments.
#
# GLIBC compatibility:
# - Binaries built with GLIBC 2.36 work on 2.36, 2.38, 2.39, etc. (forward compatible)
# - Binaries built with GLIBC 2.39 only work on 2.39+ (not backward compatible)
#
# Usage:
# docker build -f docker/Dockerfile.pack-builder -t attune-pack-builder .
# docker run --rm -v $(pwd)/packs:/output attune-pack-builder
#
# This will build all pack binaries and copy them to ./packs with GLIBC 2.36 compatibility
ARG RUST_VERSION=1.92
ARG DEBIAN_VERSION=bookworm
# ============================================================================
# Stage 1: Build Environment
# ============================================================================
FROM rust:${RUST_VERSION}-${DEBIAN_VERSION} AS builder
# Install build dependencies
RUN apt-get update && apt-get install -y \
pkg-config \
libssl-dev \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /build
# Increase rustc stack size to prevent SIGSEGV during release builds
ENV RUST_MIN_STACK=16777216
# Copy workspace files
COPY Cargo.toml Cargo.lock ./
COPY crates/ ./crates/
COPY .sqlx/ ./.sqlx/
# Build all pack binaries in release mode with BuildKit cache
RUN --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked \
--mount=type=cache,target=/usr/local/cargo/git,sharing=locked \
--mount=type=cache,target=/build/target,sharing=locked \
cargo build --release --bin attune-core-timer-sensor && \
cargo build --release --bin attune-timer-sensor && \
mkdir -p /build/binaries && \
cp /build/target/release/attune-core-timer-sensor /build/binaries/ && \
cp /build/target/release/attune-timer-sensor /build/binaries/
# Verify GLIBC version used
RUN ldd --version | head -1 && \
echo "Binaries built with the above GLIBC version for maximum compatibility"
# ============================================================================
# Stage 2: Output Stage
# ============================================================================
FROM debian:${DEBIAN_VERSION}-slim AS output
WORKDIR /output
# Copy built binaries
COPY --from=builder /build/binaries/* ./
# Create a script to copy binaries to the correct pack locations
RUN cat > /copy-to-packs.sh << 'EOF'
#!/bin/bash
set -e
OUTPUT_DIR=${OUTPUT_DIR:-/output}
PACKS_DIR=${PACKS_DIR:-/packs}
echo "Copying pack binaries from /build to $PACKS_DIR..."
# Copy timer sensor binaries
if [ -f /build/attune-core-timer-sensor ]; then
mkdir -p "$PACKS_DIR/core/sensors"
cp /build/attune-core-timer-sensor "$PACKS_DIR/core/sensors/"
chmod +x "$PACKS_DIR/core/sensors/attune-core-timer-sensor"
echo "✓ Copied attune-core-timer-sensor to core pack"
fi
if [ -f /build/attune-timer-sensor ]; then
mkdir -p "$PACKS_DIR/core/sensors"
cp /build/attune-timer-sensor "$PACKS_DIR/core/sensors/"
chmod +x "$PACKS_DIR/core/sensors/attune-timer-sensor"
echo "✓ Copied attune-timer-sensor to core pack"
fi
# Verify GLIBC requirements
echo ""
echo "Verifying GLIBC compatibility..."
ldd /build/attune-core-timer-sensor 2>/dev/null | grep GLIBC || echo "Built with GLIBC $(ldd --version | head -1)"
echo ""
echo "Pack binaries built successfully with GLIBC 2.36 compatibility"
echo "These binaries will work on any system with GLIBC 2.36 or newer"
EOF
RUN chmod +x /copy-to-packs.sh
# Copy binaries to /build for the script
COPY --from=builder /build/binaries/* /build/
CMD ["/copy-to-packs.sh"]