# Stage 1: Builder environment
ARG BASE_IMAGE
FROM ${BASE_IMAGE} AS builder
ARG INDEX_URL
WORKDIR /app
COPY foundation ./foundation
COPY management ./management
COPY server ./server
RUN sed -i '/"openjiuwen-runtime-foundation==/d' /app/management/pyproject.toml
RUN sed -i '/"openjiuwen-runtime-foundation==/d' /app/server/pyproject.toml
RUN sed -i '/"openjiuwen-runtime-management==/d' /app/server/pyproject.toml
RUN pip install uv -i ${INDEX_URL}
RUN sed -i "s#url = \"[^\"]*\"#url = \"${INDEX_URL}\"#g" /app/foundation/pyproject.toml
RUN sed -i "s#url = \"[^\"]*\"#url = \"${INDEX_URL}\"#g" /app/management/pyproject.toml
RUN sed -i "s#url = \"[^\"]*\"#url = \"${INDEX_URL}\"#g" /app/server/pyproject.toml
WORKDIR /app/foundation
RUN uv sync --group dev
RUN uv build --out-dir /app/dist
WORKDIR /app/management
RUN uv sync --group dev
RUN uv build --out-dir /app/dist
WORKDIR /app/server
RUN uv sync --group dev
RUN uv build --out-dir /app/dist
# Stage 2: Final image - Only copy necessary files from builder stage
ARG BASE_IMAGE
FROM ${BASE_IMAGE} AS runtime
ARG RUNTIME_FOUNDATION_VERSION
ARG RUNTIME_MANAGEMENT_VERSION
ARG RUNTIME_SERVER_VERSION
ARG INDEX_URL
RUN mkdir -p /app/dist
RUN apt-get update && \
apt-get install -y --no-install-recommends \
docker.io && \
rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/dist/openjiuwen_runtime_foundation-${RUNTIME_FOUNDATION_VERSION}-py3-none-any.whl /app/dist
COPY --from=builder /app/dist/openjiuwen_runtime_management-${RUNTIME_MANAGEMENT_VERSION}-py3-none-any.whl /app/dist
COPY --from=builder /app/dist/agent_runtime_server-${RUNTIME_SERVER_VERSION}-py3-none-any.whl /app/dist
# 当多个包共用同一个根目录 openjiuwen_runtime,不能用pip install: 因为 pip (旧工具)有一个致命 BUG(针对 --target 安装)当目录已存在时,pip 会直接把整个目录删掉,再重新创建!
# 必须要用uv(新一代 Python 包管理器),专门修复了这个 bug,安装共享目录包时,只新增 / 覆盖文件,绝不删除整个目录
RUN pip install uv -i ${INDEX_URL}
RUN uv pip install /app/dist/openjiuwen_runtime_foundation-${RUNTIME_FOUNDATION_VERSION}-py3-none-any.whl --index-url ${INDEX_URL} --target=/app/site-packages
RUN uv pip install /app/dist/openjiuwen_runtime_management-${RUNTIME_MANAGEMENT_VERSION}-py3-none-any.whl --index-url ${INDEX_URL} --target=/app/site-packages
RUN uv pip install /app/dist/agent_runtime_server-${RUNTIME_SERVER_VERSION}-py3-none-any.whl --index-url ${INDEX_URL} --target=/app/site-packages
EXPOSE 8186
HEALTHCHECK --interval=30s --timeout=30s --start-period=30s --retries=5 \
CMD curl -f http://localhost:8186/health || exit 1
WORKDIR /app/
ENV PYTHONPATH=/app/site-packages/openjiuwen_runtime:/app/site-packages
CMD ["python", "-m", "openjiuwen_runtime.server.main"]