File size: 5,968 Bytes
cc6e5ac | 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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | # # 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 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=tice
# # 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
# # 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 --frozen --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 --frozen --no-editable; \
# else \
# uv sync --no-editable; \
# fi
# # Final runtime stage
# FROM ${BASE_IMAGE}
# WORKDIR /app
# # 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"
# # 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"]
# 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 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=tice
# 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
# 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
# Create a Python virtual environment inside Docker.
# Without this, uv may detect a stale/invalid `/app/env/.venv` copied from host
# and fail with: "no Python executable was found".
RUN python -m venv /app/env/.venv
# Tell uv to use that venv.
ENV UV_VENV_PATH=/app/env/.venv
ENV PATH="/app/env/.venv/bin:$PATH"
# 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 --frozen --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 --frozen --no-editable; \
else \
uv sync --no-editable; \
fi
# Final runtime stage
FROM ${BASE_IMAGE}
WORKDIR /app
# 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
# Web UI README loader expects /app/README.md
COPY --from=builder /app/env/README.md /app/README.md
# Set PATH to use the virtual environment
ENV PATH="/app/.venv/bin:$PATH"
ENV ENABLE_WEB_INTERFACE=true
# Set PYTHONPATH so imports work correctly
ENV PYTHONPATH="/app/env:$PYTHONPATH"
# 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"]
|