# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. # Multi-stage build using openenv-base # This Dockerfile is flexible and works for both: # - In-repo environments (with local src/core) # - Standalone environments (with openenv-core from pip) # The build script (openenv build) handles context detection and sets appropriate build args. ARG BASE_IMAGE=ghcr.io/meta-pytorch/openenv-base:latest FROM ghcr.io/meta-pytorch/openenv-base:latest AS builder WORKDIR /app ARG BUILD_MODE=in-repo COPY . /app/env WORKDIR /app/env # Ensure uv is available RUN if ! command -v uv >/dev/null 2>&1; then \ curl -LsSf https://astral.sh/uv/install.sh | sh && \ mv /root/.local/bin/uv /usr/local/bin/uv && \ mv /root/.local/bin/uvx /usr/local/bin/uvx; \ fi # Install git RUN apt-get update && apt-get install -y --no-install-recommends \ git \ && rm -rf /var/lib/apt/lists/* # Install uv properly RUN curl -LsSf https://astral.sh/uv/install.sh | sh && \ install -m 0755 /root/.local/bin/uv /usr/local/bin/uv && \ install -m 0755 /root/.local/bin/uvx /usr/local/bin/uvx # Two-pass install for better layer caching RUN --mount=type=cache,target=/root/.cache/uv \ uv sync --no-install-project --no-editable RUN --mount=type=cache,target=/root/.cache/uv \ uv sync --no-editable # ── Runtime stage ────────────────────────────────────────────────── FROM ghcr.io/meta-pytorch/openenv-base:latest WORKDIR /app # Copy venv and code from builder COPY --from=builder /app/env/.venv /app/.venv COPY --from=builder /app/env /app/env # Environment ENV PATH="/app/.venv/bin:$PATH" ENV PYTHONPATH="/app/env:$PYTHONPATH" ENV PYTHONUNBUFFERED=1 ENV ENABLE_WEB_INTERFACE=true # Expose port EXPOSE 8000 # Health check HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')" || exit 1 # Default: start server # Runtime inference credentials should be passed when needed via # API_BASE_URL, MODEL_NAME, and HF_TOKEN. CMD ["sh", "-c", "cd /app/env && uvicorn server.app:app --host 0.0.0.0 --port 8000"]