FROM oven/bun:canary-slim@sha256:24a8816a7388dd900e851b61b6d44a4a1908f464661a9ffe393e13e661f0ae3e AS bun-bin FROM smanx/opencode:1.18.13@sha256:b976acda21efffacd44abd7847dac7d646910dbaa477d1877e2881b39cf22a91 AS base USER root ARG UBUNTU_APT_MIRROR=mirrors.aliyun.com ARG PYPI_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple ARG PYPI_TRUSTED_HOST=pypi.tuna.tsinghua.edu.cn ARG NPM_REGISTRY=https://registry.npmmirror.com ENV VIRTUAL_ENV=/opt/venv ENV PATH="$VIRTUAL_ENV/bin:/root/.local/bin:$PATH" ENV PIP_INDEX_URL=${PYPI_INDEX_URL} ENV PIP_TRUSTED_HOST=${PYPI_TRUSTED_HOST} ENV UV_INDEX_URL=${PYPI_INDEX_URL} ENV BUN_CONFIG_REGISTRY=${NPM_REGISTRY} RUN sed -i "s|http://archive.ubuntu.com|https://${UBUNTU_APT_MIRROR}|g; s|http://security.ubuntu.com|https://${UBUNTU_APT_MIRROR}|g" /etc/apt/sources.list 2>/dev/null || true && \ sed -i "s|http://archive.ubuntu.com|https://${UBUNTU_APT_MIRROR}|g; s|http://security.ubuntu.com|https://${UBUNTU_APT_MIRROR}|g" /etc/apt/sources.list.d/*.sources 2>/dev/null || true && \ apt-get update && apt-get install -y --no-install-recommends \ curl \ jq \ unzip \ python3 \ python3-venv && \ ln -sf /usr/bin/python3 /usr/local/bin/python && \ mkdir -p /root/.config/pip && \ printf "[global]\nindex-url = %s\ntrusted-host = %s\n" "$PIP_INDEX_URL" "$PIP_TRUSTED_HOST" > /root/.config/pip/pip.conf && \ python3 -m venv "$VIRTUAL_ENV" && \ pip install \ --index-url "$PIP_INDEX_URL" \ --trusted-host "$PIP_TRUSTED_HOST" \ uv \ pip \ setuptools \ wheel \ requests \ httpx \ pydantic \ python-dotenv \ rich \ ipython \ pytest && \ ln -s "$VIRTUAL_ENV/bin/uv" /usr/local/bin/uv && \ rm -rf /var/lib/apt/lists/* COPY --from=bun-bin /usr/local/bin/bun /usr/local/bin/bun FROM base AS deps WORKDIR /app COPY package.json bun.lock ./ COPY .opencode/package.json .opencode/bun.lock ./.opencode/ RUN bun install --frozen-lockfile FROM base AS build WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY --from=deps /app/.opencode/node_modules ./.opencode/node_modules COPY package.json bun.lock ./ COPY tsconfig.json opencode.json README.md .gitignore ./ COPY src ./src COPY .opencode ./.opencode RUN bun run check FROM build AS runner WORKDIR /app ENV NODE_ENV=production ENV HOST=0.0.0.0 ENV PORT=8787 COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] EXPOSE 8787 HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 \ CMD curl --fail --silent --show-error "http://127.0.0.1:${PORT}/health" >/dev/null || exit 1 CMD ["bun", "src/server.ts"]