File size: 3,227 Bytes
6e194fa 4c2724a 6e194fa 4c2724a 6e194fa 4c2724a 6e194fa 0f3ecd2 6e194fa 0f3ecd2 6e194fa 0f3ecd2 ef97fda 6e194fa ef97fda 6e194fa ef97fda 6e194fa 4c2724a 6e194fa 0f3ecd2 6e194fa ef97fda 6e194fa 0f3ecd2 6e194fa 0f3ecd2 6e194fa d7d36c6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | # 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 from pip)
# The build script (openenv build) handles context detection and sets appropriate build args.
ARG BASE_IMAGE=ghcr.io/huggingface/openenv-base:latest
FROM ghcr.io/huggingface/openenv-base:latest AS builder
WORKDIR /app
# Build argument to control whether we're building standalone or in-repo
ARG BUILD_MODE=in-repo
# Copy environment code (always at root of build context)
COPY . /app/env
# For in-repo builds, openenv is already in the pyproject.toml dependencies
# For standalone builds, openenv will be installed from pip via pyproject.toml
WORKDIR /app/env
# Ensure uv is available (for local builds where base image lacks it)
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 for building from git repos (build-time only)
RUN apt-get update && apt-get install -y --no-install-recommends \
git \
&& rm -rf /var/lib/apt/lists/*
# Install dependencies using uv sync
# First pass: install dependencies without the project (for better caching)
# Second pass: install the project itself
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
RUN --mount=type=cache,target=/root/.cache/uv \
if [ -f uv.lock ]; then \
uv sync --no-install-project --no-editable; \
else \
uv sync --no-install-project --no-editable; \
fi
RUN --mount=type=cache,target=/root/.cache/uv \
if [ -f uv.lock ]; then \
uv sync --no-editable; \
else \
uv sync --no-editable; \
fi
# Final runtime stage
FROM ghcr.io/huggingface/openenv-base:latest
WORKDIR /app
# Install runtime system libraries required by TextArena (cv2 needs libGL, glib)
RUN apt-get update && apt-get install -y --no-install-recommends \
libgl1 \
libglib2.0-0 \
&& rm -rf /var/lib/apt/lists/*
# Copy the virtual environment from builder
COPY --from=builder /app/env/.venv /app/.venv
# Copy the environment code
COPY --from=builder /app/env /app/env
# Set PATH to use the virtual environment
ENV PATH="/app/.venv/bin:$PATH"
# Set PYTHONPATH so imports work correctly
ENV PYTHONPATH="/app/env:$PYTHONPATH"
ENV ENABLE_WEB_INTERFACE=true
# Health check using Python (more portable than curl/wget)
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
# Run the FastAPI server
# The module path is constructed to work with the /app/env structure
CMD ["sh", "-c", "cd /app/env && uvicorn server.app:app --host 0.0.0.0 --port 8000"]
ENV TEXTARENA_ENV_ID=Wordle-v0
|