WeKnora deployment source with the reviewed wiki identity, summary and recovery fixes
Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
# WeKnora Sandbox Image
|
||||
# Pre-built environment for executing agent skill scripts in Docker sandbox
|
||||
# Multi-stage build, minimal dependencies
|
||||
#
|
||||
# Two targets ship from this file:
|
||||
# runtime (default) - the plain environment. Used by the Docker backend and
|
||||
# as the base image of E2B templates, whose builder
|
||||
# injects its own envd.
|
||||
# cube - the same environment plus Cube's envd daemon. Cube
|
||||
# builds templates straight from the image and probes
|
||||
# :49983/health, so an image without envd can only ever
|
||||
# fail. See docs/sandbox-cluster.md.
|
||||
|
||||
# Stage 1: Get Node.js binaries
|
||||
FROM node:20-slim AS node-base
|
||||
|
||||
# Stage 2: Runtime image
|
||||
FROM python:3.11-slim AS runtime
|
||||
|
||||
# Copy Node.js from node image (avoids NodeSource install overhead)
|
||||
COPY --from=node-base /usr/local/bin/node /usr/local/bin/
|
||||
COPY --from=node-base /usr/local/lib/node_modules /usr/local/lib/node_modules
|
||||
RUN ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm && \
|
||||
ln -s /usr/local/lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx
|
||||
|
||||
# Python package manager: uv (fast pip replacement). Preinstalled because each
|
||||
# skill gets its own venv at install time, and building that from a cold pip is
|
||||
# what dominates an install's wall clock.
|
||||
COPY --from=ghcr.io/astral-sh/uv:0.12.4 /uv /usr/local/bin/uv
|
||||
RUN ln -s /usr/local/bin/uv /usr/local/bin/uvx
|
||||
|
||||
# Node package manager: pnpm
|
||||
RUN npm install -g pnpm
|
||||
|
||||
# Install minimal CLI tools (bash/grep/sed/coreutils/findutils already in slim
|
||||
# image). `file` is not in slim; models reach for it after a script-type error.
|
||||
# curl is not optional: the sandbox connectivity check probes egress with it,
|
||||
# and skills that fetch a URL expect it to be there. The compression tools are
|
||||
# here because skill bundles and their assets arrive archived.
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
jq \
|
||||
curl \
|
||||
ca-certificates \
|
||||
file \
|
||||
zip \
|
||||
unzip \
|
||||
bzip2 \
|
||||
xz-utils \
|
||||
zstd \
|
||||
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/*
|
||||
|
||||
# Note: Current preloaded skills only use Python stdlib
|
||||
# Add packages here when skills actually need them:
|
||||
|
||||
# Create non-root user (UID 1000) for sandbox execution. The account is named
|
||||
# "user" because that is the account name E2B templates are expected to expose
|
||||
# and the one WeKnora names when running scripts and file operations against an
|
||||
# E2B-protocol backend; the Docker backend addresses it numerically as
|
||||
# 1000:1000, so both paths land on the same account.
|
||||
RUN groupadd -g 1000 user && \
|
||||
useradd -u 1000 -g user -m -s /bin/bash user
|
||||
|
||||
# Pre-create the two directories every backend writes to and hand them to the
|
||||
# sandbox account. WeKnora otherwise has to create and chown them as root on
|
||||
# each execution, which needs capabilities a hardened container should not
|
||||
# have to keep.
|
||||
RUN mkdir -p /workspace/input /workspace/output && \
|
||||
chown -R user:user /workspace
|
||||
|
||||
WORKDIR /workspace
|
||||
USER user
|
||||
|
||||
# Stage 3: Cube template image
|
||||
#
|
||||
# envd is what Cube talks to for everything — the readiness probe that decides
|
||||
# whether a template build succeeds, plus every later exec and file call. It
|
||||
# runs as root and drops to the account named in each request, which is why
|
||||
# this variant does not keep the runtime's USER user.
|
||||
#
|
||||
# This target is linux/amd64 only: cubesandbox-base publishes no arm64 image,
|
||||
# which matches Cube itself (PVM is x86_64-only).
|
||||
FROM ghcr.io/tencentcloud/cubesandbox-base:2026.16 AS cube-base
|
||||
|
||||
FROM runtime AS cube
|
||||
|
||||
USER root
|
||||
COPY --from=cube-base /usr/bin/envd /usr/bin/envd
|
||||
COPY --from=cube-base /usr/local/bin/cube-entrypoint.sh /usr/local/bin/cube-entrypoint.sh
|
||||
|
||||
EXPOSE 49983
|
||||
# The entrypoint backgrounds envd and then waits on it, since this image
|
||||
# defines no CMD of its own.
|
||||
ENTRYPOINT ["/usr/local/bin/cube-entrypoint.sh"]
|
||||
|
||||
# Stage 4: default target
|
||||
#
|
||||
# Docker builds the last stage when none is named, and that must stay the plain
|
||||
# runtime: a bare `docker build -f docker/Dockerfile.sandbox .` is expected to
|
||||
# produce the image the Docker backend runs, not the Cube variant.
|
||||
FROM runtime AS sandbox
|
||||
Reference in New Issue
Block a user