# 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. # Compatibility mirror of the repo-root Dockerfile. # For HF Space deployment, prefer the repo-root Dockerfile as the source of # truth so the API and command center UI stay aligned. # Multi-stage build using openenv-base # This Dockerfile is flexible and works for both: # - In-repo environments (with local OpenEnv sources) # - Standalone environments (with openenv from PyPI/Git) # The build script (openenv build) handles context detection and sets appropriate build args. ARG BASE_IMAGE=ghcr.io/meta-pytorch/openenv-base:latest FROM ${BASE_IMAGE} AS builder WORKDIR /app # Ensure git is available (required for installing dependencies from VCS) RUN apt-get update && \ apt-get install -y --no-install-recommends git && \ rm -rf /var/lib/apt/lists/* # Build argument to control whether we're building standalone or in-repo ARG BUILD_MODE=in-repo ARG ENV_NAME=browser_env # Copy environment code (always at root of build context) COPY . /app/env # For in-repo builds, openenv is already vendored in the build context # For standalone builds, openenv will be installed via pyproject.toml WORKDIR /app/env # Never trust a copied local virtualenv from the build context. RUN rm -rf /app/env/.venv # 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 dependencies using uv sync # If uv.lock exists, use it; otherwise resolve on the fly 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 # Install Chromium runtime dependencies explicitly instead of relying on # `playwright install --with-deps`, which can request obsolete package names # on newer Debian/Ubuntu bases. RUN apt-get update && \ apt-get install -y --no-install-recommends \ libasound2 \ libatk-bridge2.0-0 \ libatk1.0-0 \ libatspi2.0-0 \ libcairo2 \ libcups2 \ libdbus-1-3 \ libdrm2 \ libgbm1 \ libglib2.0-0 \ libgtk-3-0 \ libnspr4 \ libnss3 \ libpango-1.0-0 \ libx11-6 \ libx11-xcb1 \ libxcb1 \ libxcb-dri3-0 \ libxcomposite1 \ libxdamage1 \ libxfixes3 \ libxkbcommon0 \ libxrandr2 \ fonts-liberation \ fonts-noto-color-emoji \ fonts-unifont \ fonts-freefont-ttf \ ca-certificates && \ rm -rf /var/lib/apt/lists/* # BrowserGym uses Playwright/Chromium. MiniWoB also needs the static task files. RUN /app/env/.venv/bin/playwright install chromium && \ git clone https://github.com/Farama-Foundation/miniwob-plusplus.git /app/miniwob-plusplus && \ git -C /app/miniwob-plusplus reset --hard 7fd85d71a4b60325c6585396ec4f48377d049838 # Final runtime stage FROM ${BASE_IMAGE} WORKDIR /app RUN apt-get update && \ apt-get install -y --no-install-recommends \ libasound2 \ libatk-bridge2.0-0 \ libatk1.0-0 \ libatspi2.0-0 \ libcairo2 \ libcups2 \ libdbus-1-3 \ libdrm2 \ libgbm1 \ libglib2.0-0 \ libgtk-3-0 \ libnspr4 \ libnss3 \ libpango-1.0-0 \ libx11-6 \ libx11-xcb1 \ libxcb1 \ libxcb-dri3-0 \ libxcomposite1 \ libxdamage1 \ libxfixes3 \ libxkbcommon0 \ libxrandr2 \ fonts-liberation \ fonts-noto-color-emoji \ fonts-unifont \ fonts-freefont-ttf \ ca-certificates && \ 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 COPY --from=builder /app/miniwob-plusplus /app/miniwob-plusplus # 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 MINIWOB_URL="file:///app/miniwob-plusplus/miniwob/html/miniwob/" RUN /app/.venv/bin/playwright install chromium # Health check HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f 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"]