|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ARG BASE_IMAGE=ghcr.io/meta-pytorch/openenv-openspiel-base:latest |
|
|
FROM ${BASE_IMAGE} AS builder |
|
|
|
|
|
|
|
|
WORKDIR /app |
|
|
|
|
|
ARG BUILD_MODE=in-repo |
|
|
|
|
|
|
|
|
COPY . /app/env |
|
|
|
|
|
WORKDIR /app/env |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
FROM ${BASE_IMAGE} |
|
|
|
|
|
WORKDIR /app |
|
|
|
|
|
|
|
|
COPY --from=builder /app/env/.venv /app/.venv |
|
|
|
|
|
|
|
|
COPY --from=builder /app/env /app/env |
|
|
|
|
|
|
|
|
ENV PATH="/app/.venv/bin:$PATH" |
|
|
|
|
|
|
|
|
|
|
|
ENV PYTHONPATH="/repo:/repo/build/python:/app/env:$PYTHONPATH" |
|
|
|
|
|
|
|
|
ENV OPENSPIEL_GAME=catch |
|
|
ENV OPENSPIEL_AGENT_PLAYER=0 |
|
|
ENV OPENSPIEL_OPPONENT_POLICY=random |
|
|
|
|
|
|
|
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ |
|
|
CMD curl -f http://localhost:8000/health || exit 1 |
|
|
|
|
|
|
|
|
|
|
|
ENV ENABLE_WEB_INTERFACE=true |
|
|
CMD ["sh", "-c", "cd /app/env && uvicorn server.app:app --host 0.0.0.0 --port 8000"] |