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"]