@cloudflare/sandbox 0.0.0-eec5bb6 → 0.0.0-f06fee3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +136 -15
- package/Dockerfile +100 -53
- package/README.md +92 -769
- package/dist/index.d.ts +1889 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3146 -0
- package/dist/index.js.map +1 -0
- package/package.json +16 -8
- package/src/clients/base-client.ts +295 -0
- package/src/clients/command-client.ts +115 -0
- package/src/clients/file-client.ts +300 -0
- package/src/clients/git-client.ts +91 -0
- package/src/clients/index.ts +60 -0
- package/src/clients/interpreter-client.ts +333 -0
- package/src/clients/port-client.ts +105 -0
- package/src/clients/process-client.ts +180 -0
- package/src/clients/sandbox-client.ts +39 -0
- package/src/clients/types.ts +88 -0
- package/src/clients/utility-client.ts +123 -0
- package/src/errors/adapter.ts +238 -0
- package/src/errors/classes.ts +594 -0
- package/src/errors/index.ts +109 -0
- package/src/file-stream.ts +169 -0
- package/src/index.ts +88 -63
- package/src/interpreter.ts +58 -40
- package/src/request-handler.ts +94 -55
- package/src/sandbox.ts +980 -492
- package/src/security.ts +34 -28
- package/src/sse-parser.ts +8 -11
- package/src/version.ts +6 -0
- package/startup.sh +3 -0
- package/tests/base-client.test.ts +364 -0
- package/tests/command-client.test.ts +444 -0
- package/tests/file-client.test.ts +831 -0
- package/tests/file-stream.test.ts +310 -0
- package/tests/get-sandbox.test.ts +149 -0
- package/tests/git-client.test.ts +415 -0
- package/tests/port-client.test.ts +293 -0
- package/tests/process-client.test.ts +683 -0
- package/tests/request-handler.test.ts +292 -0
- package/tests/sandbox.test.ts +706 -0
- package/tests/sse-parser.test.ts +291 -0
- package/tests/utility-client.test.ts +339 -0
- package/tests/version.test.ts +16 -0
- package/tests/wrangler.jsonc +35 -0
- package/tsconfig.json +9 -1
- package/tsdown.config.ts +12 -0
- package/vitest.config.ts +31 -0
- package/container_src/bun.lock +0 -76
- package/container_src/circuit-breaker.ts +0 -121
- package/container_src/control-process.ts +0 -784
- package/container_src/handler/exec.ts +0 -185
- package/container_src/handler/file.ts +0 -406
- package/container_src/handler/git.ts +0 -130
- package/container_src/handler/ports.ts +0 -314
- package/container_src/handler/process.ts +0 -568
- package/container_src/handler/session.ts +0 -92
- package/container_src/index.ts +0 -592
- package/container_src/interpreter-service.ts +0 -276
- package/container_src/isolation.ts +0 -1038
- package/container_src/mime-processor.ts +0 -255
- package/container_src/package.json +0 -18
- package/container_src/runtime/executors/javascript/node_executor.ts +0 -123
- package/container_src/runtime/executors/python/ipython_executor.py +0 -338
- package/container_src/runtime/executors/typescript/ts_executor.ts +0 -138
- package/container_src/runtime/process-pool.ts +0 -464
- package/container_src/shell-escape.ts +0 -42
- package/container_src/startup.sh +0 -11
- package/container_src/types.ts +0 -131
- package/src/client.ts +0 -1009
- package/src/errors.ts +0 -219
- package/src/interpreter-client.ts +0 -352
- package/src/interpreter-types.ts +0 -390
- package/src/types.ts +0 -502
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,129 @@
|
|
|
1
1
|
# @cloudflare/sandbox
|
|
2
2
|
|
|
3
|
+
## 0.4.14
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#172](https://github.com/cloudflare/sandbox-sdk/pull/172) [`1bf3576`](https://github.com/cloudflare/sandbox-sdk/commit/1bf35768b02532c77df6f30a2f2eb08cb2b12115) Thanks [@threepointone](https://github.com/threepointone)! - Update dependencies
|
|
8
|
+
|
|
9
|
+
- [#176](https://github.com/cloudflare/sandbox-sdk/pull/176) [`7edbfa9`](https://github.com/cloudflare/sandbox-sdk/commit/7edbfa906668d75f540527f50b52483dc787192c) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Add cache mounts to Dockerfile for faster builds
|
|
10
|
+
|
|
11
|
+
Adds cache mounts for npm, apt, and pip package managers in the Dockerfile. This speeds up Docker image builds when dependencies change, particularly beneficial for users building from source.
|
|
12
|
+
|
|
13
|
+
- [#172](https://github.com/cloudflare/sandbox-sdk/pull/172) [`1bf3576`](https://github.com/cloudflare/sandbox-sdk/commit/1bf35768b02532c77df6f30a2f2eb08cb2b12115) Thanks [@threepointone](https://github.com/threepointone)! - Fix type generation
|
|
14
|
+
|
|
15
|
+
We inline types from `@repo/shared` so that it includes the types we reexport. Fixes #165
|
|
16
|
+
|
|
17
|
+
- [#175](https://github.com/cloudflare/sandbox-sdk/pull/175) [`77cb937`](https://github.com/cloudflare/sandbox-sdk/commit/77cb93762a619523758f769a10509e665ca819fe) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Move .connect to .wsConnect within DO stub
|
|
18
|
+
|
|
19
|
+
## 0.4.13
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- [#168](https://github.com/cloudflare/sandbox-sdk/pull/168) [`6b08f02`](https://github.com/cloudflare/sandbox-sdk/commit/6b08f02c061aef07cc98188abef2973ac92365f8) Thanks [@threepointone](https://github.com/threepointone)! - Fix type generation
|
|
24
|
+
|
|
25
|
+
We inline types from `@repo/shared` so that it includes the types we reexport. Fixes #165
|
|
26
|
+
|
|
27
|
+
- [#162](https://github.com/cloudflare/sandbox-sdk/pull/162) [`c4db459`](https://github.com/cloudflare/sandbox-sdk/commit/c4db459389a7b86048a03410d67d4dd7bf4a6085) Thanks [@whoiskatrin](https://github.com/whoiskatrin)! - Add WebSocket support via connect() method for routing client WebSocket connections directly to container services
|
|
28
|
+
|
|
29
|
+
## 0.4.12
|
|
30
|
+
|
|
31
|
+
### Patch Changes
|
|
32
|
+
|
|
33
|
+
- [#137](https://github.com/cloudflare/sandbox-sdk/pull/137) [`7f4442b`](https://github.com/cloudflare/sandbox-sdk/commit/7f4442b7a097587d8f8e8f9ff2f887df6943a3db) Thanks [@whoiskatrin](https://github.com/whoiskatrin)! - add keepAlive flag to prevent containers from shutting down
|
|
34
|
+
|
|
35
|
+
## 0.4.11
|
|
36
|
+
|
|
37
|
+
### Patch Changes
|
|
38
|
+
|
|
39
|
+
- [#159](https://github.com/cloudflare/sandbox-sdk/pull/159) [`e16659a`](https://github.com/cloudflare/sandbox-sdk/commit/e16659a1815923f1cd1176f51a052725d820ee16) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Use latest containers package version
|
|
40
|
+
|
|
41
|
+
## 0.4.10
|
|
42
|
+
|
|
43
|
+
### Patch Changes
|
|
44
|
+
|
|
45
|
+
- [#156](https://github.com/cloudflare/sandbox-sdk/pull/156) [`b61841c`](https://github.com/cloudflare/sandbox-sdk/commit/b61841cfb3248022ee8136311e54955ed9faa1ee) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Fix WebSocket upgrade requests through exposed ports
|
|
46
|
+
|
|
47
|
+
## 0.4.9
|
|
48
|
+
|
|
49
|
+
### Patch Changes
|
|
50
|
+
|
|
51
|
+
- [#152](https://github.com/cloudflare/sandbox-sdk/pull/152) [`8e7773e`](https://github.com/cloudflare/sandbox-sdk/commit/8e7773ec9571a5f968cbbc5f48e38e01d7d13b77) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Add exists() method to check if a file or directory exists
|
|
52
|
+
|
|
53
|
+
This adds a new `exists()` method to the SDK that checks whether a file or directory exists at a given path. The method returns a boolean indicating existence, similar to Python's `os.path.exists()` and JavaScript's `fs.existsSync()`.
|
|
54
|
+
|
|
55
|
+
The implementation is end-to-end:
|
|
56
|
+
- New `FileExistsResult` and `FileExistsRequest` types in shared package
|
|
57
|
+
- Handler endpoint at `/api/exists` in container layer
|
|
58
|
+
- Client method in `FileClient` and `Sandbox` classes
|
|
59
|
+
- Full test coverage (unit tests and E2E tests)
|
|
60
|
+
|
|
61
|
+
## 0.4.8
|
|
62
|
+
|
|
63
|
+
### Patch Changes
|
|
64
|
+
|
|
65
|
+
- [#153](https://github.com/cloudflare/sandbox-sdk/pull/153) [`f6a5c3e`](https://github.com/cloudflare/sandbox-sdk/commit/f6a5c3e1607fce5fc26f816e9206ae437898d5af) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Fix token extraction regex causing Invalid token errors
|
|
66
|
+
|
|
67
|
+
## 0.4.7
|
|
68
|
+
|
|
69
|
+
### Patch Changes
|
|
70
|
+
|
|
71
|
+
- [#141](https://github.com/cloudflare/sandbox-sdk/pull/141) [`c39674b`](https://github.com/cloudflare/sandbox-sdk/commit/c39674b8fe2e986e59a794b6bb3a5f51a87bae89) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Fix commands hanging when reading stdin by redirecting stdin to /dev/null
|
|
72
|
+
|
|
73
|
+
- [#143](https://github.com/cloudflare/sandbox-sdk/pull/143) [`276efc0`](https://github.com/cloudflare/sandbox-sdk/commit/276efc0ca8776bcc8de79e7e58dd24d9f418cc5c) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Remove unnecessary existing session check
|
|
74
|
+
|
|
75
|
+
## 0.4.6
|
|
76
|
+
|
|
77
|
+
### Patch Changes
|
|
78
|
+
|
|
79
|
+
- [#133](https://github.com/cloudflare/sandbox-sdk/pull/133) [`da2cfb8`](https://github.com/cloudflare/sandbox-sdk/commit/da2cfb876675eb3445970c90b4d70d00288a7c74) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - feat: Add version sync detection between npm package and Docker image
|
|
80
|
+
|
|
81
|
+
## 0.4.5
|
|
82
|
+
|
|
83
|
+
### Patch Changes
|
|
84
|
+
|
|
85
|
+
- [#127](https://github.com/cloudflare/sandbox-sdk/pull/127) [`e79ac80`](https://github.com/cloudflare/sandbox-sdk/commit/e79ac80bc855a3ec527d44cc14585794b23cb129) Thanks [@whoiskatrin](https://github.com/whoiskatrin)! - configurable sleepAfter
|
|
86
|
+
|
|
87
|
+
## 0.4.4
|
|
88
|
+
|
|
89
|
+
### Patch Changes
|
|
90
|
+
|
|
91
|
+
- [#125](https://github.com/cloudflare/sandbox-sdk/pull/125) [`fddccfd`](https://github.com/cloudflare/sandbox-sdk/commit/fddccfdce8204ce2aa7dadc0ad9fb2acbdeaec51) Thanks [@whoiskatrin](https://github.com/whoiskatrin)! - add docker image to pkg workflow
|
|
92
|
+
|
|
93
|
+
## 0.4.3
|
|
94
|
+
|
|
95
|
+
### Patch Changes
|
|
96
|
+
|
|
97
|
+
- [#114](https://github.com/cloudflare/sandbox-sdk/pull/114) [`8c1f440`](https://github.com/cloudflare/sandbox-sdk/commit/8c1f440ad6fd89a5c69f9ca9d055ad9b183dd1c3) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Debloat base docker image (2.63GB → 1.03GB)
|
|
98
|
+
|
|
99
|
+
## 0.4.2
|
|
100
|
+
|
|
101
|
+
### Patch Changes
|
|
102
|
+
|
|
103
|
+
- [`e53d7e7`](https://github.com/cloudflare/sandbox-sdk/commit/e53d7e7ce185f79bdd899029bb532e9651ae7ba5) Thanks [@threepointone](https://github.com/threepointone)! - fix build by inlining repo/shared
|
|
104
|
+
|
|
105
|
+
## 0.4.1
|
|
106
|
+
|
|
107
|
+
### Patch Changes
|
|
108
|
+
|
|
109
|
+
- [#111](https://github.com/cloudflare/sandbox-sdk/pull/111) [`1b5496b`](https://github.com/cloudflare/sandbox-sdk/commit/1b5496bfceaee53c31911b409476ea87bebffe4c) Thanks [@threepointone](https://github.com/threepointone)! - trigger a release
|
|
110
|
+
|
|
111
|
+
## 0.4.0
|
|
112
|
+
|
|
113
|
+
### Minor Changes
|
|
114
|
+
|
|
115
|
+
- [#95](https://github.com/cloudflare/sandbox-sdk/pull/95) [`7aee736`](https://github.com/cloudflare/sandbox-sdk/commit/7aee736bf07a4bf9020e2109bdaaa70214d52a01) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Rewrite SDK with cleaner design patterns and tests. Remove the unnecessary isolation cruft and fix foundational issues with streaming, sessions, validations and error handling. Cover the SDK with unit & e2e tests.
|
|
116
|
+
|
|
117
|
+
### Patch Changes
|
|
118
|
+
|
|
119
|
+
- [#106](https://github.com/cloudflare/sandbox-sdk/pull/106) [`da947cd`](https://github.com/cloudflare/sandbox-sdk/commit/da947cd9543fc99831eefb1e8741fc905cb8fa42) Thanks [@jahands](https://github.com/jahands)! - fix examples failing to deploy and prevent committing node_modules
|
|
120
|
+
|
|
121
|
+
## 0.3.3
|
|
122
|
+
|
|
123
|
+
### Patch Changes
|
|
124
|
+
|
|
125
|
+
- [#83](https://github.com/cloudflare/sandbox-sdk/pull/83) [`eec5bb6`](https://github.com/cloudflare/sandbox-sdk/commit/eec5bb6203dd5d775b4b54e91c26de25eeb767ce) Thanks [@mikenomitch](https://github.com/mikenomitch)! - Bump containers package version
|
|
126
|
+
|
|
3
127
|
## 0.3.2
|
|
4
128
|
|
|
5
129
|
### Patch Changes
|
|
@@ -27,50 +151,47 @@
|
|
|
27
151
|
Implements PID namespace isolation to protect control plane processes (Jupyter, Bun) from sandboxed code. Commands executed via `exec()` now run in isolated namespaces that cannot see or interact with system processes.
|
|
28
152
|
|
|
29
153
|
**Key security improvements:**
|
|
30
|
-
|
|
31
154
|
- Control plane processes are hidden from sandboxed commands
|
|
32
155
|
- Platform secrets in `/proc/1/environ` are inaccessible
|
|
33
156
|
- Ports 8888 (Jupyter) and 3000 (Bun) are protected from hijacking
|
|
34
157
|
|
|
35
158
|
**Breaking changes:**
|
|
36
|
-
|
|
37
159
|
1. **Removed `sessionId` parameter**: The `sessionId` parameter has been removed from all methods (`exec()`, `execStream()`, `startProcess()`, etc.). Each sandbox now maintains its own persistent session automatically.
|
|
38
160
|
|
|
39
161
|
```javascript
|
|
40
162
|
// Before: manual session management
|
|
41
|
-
await sandbox.exec(
|
|
163
|
+
await sandbox.exec('cd /app', { sessionId: 'my-session' });
|
|
42
164
|
|
|
43
165
|
// After: automatic session per sandbox
|
|
44
|
-
await sandbox.exec(
|
|
166
|
+
await sandbox.exec('cd /app');
|
|
45
167
|
```
|
|
46
168
|
|
|
47
169
|
2. **Commands now maintain state**: Commands within the same sandbox now share state (working directory, environment variables, background processes). Previously each command was stateless.
|
|
48
170
|
|
|
49
171
|
```javascript
|
|
50
172
|
// Before: each exec was independent
|
|
51
|
-
await sandbox.exec(
|
|
52
|
-
await sandbox.exec(
|
|
173
|
+
await sandbox.exec('cd /app');
|
|
174
|
+
await sandbox.exec('pwd'); // Output: /workspace
|
|
53
175
|
|
|
54
176
|
// After: state persists in session
|
|
55
|
-
await sandbox.exec(
|
|
56
|
-
await sandbox.exec(
|
|
177
|
+
await sandbox.exec('cd /app');
|
|
178
|
+
await sandbox.exec('pwd'); // Output: /app
|
|
57
179
|
```
|
|
58
180
|
|
|
59
181
|
**Migration guide:**
|
|
60
|
-
|
|
61
182
|
- Remove `sessionId` from all method calls - each sandbox maintains its own session
|
|
62
183
|
- If you need isolated execution contexts within the same sandbox, use `sandbox.createSession()`:
|
|
63
184
|
```javascript
|
|
64
185
|
// Create independent sessions with different environments
|
|
65
186
|
const buildSession = await sandbox.createSession({
|
|
66
|
-
name:
|
|
67
|
-
env: { NODE_ENV:
|
|
68
|
-
cwd:
|
|
187
|
+
name: 'build',
|
|
188
|
+
env: { NODE_ENV: 'production' },
|
|
189
|
+
cwd: '/build'
|
|
69
190
|
});
|
|
70
191
|
const testSession = await sandbox.createSession({
|
|
71
|
-
name:
|
|
72
|
-
env: { NODE_ENV:
|
|
73
|
-
cwd:
|
|
192
|
+
name: 'test',
|
|
193
|
+
env: { NODE_ENV: 'test' },
|
|
194
|
+
cwd: '/test'
|
|
74
195
|
});
|
|
75
196
|
```
|
|
76
197
|
- Environment variables set in one command persist to the next
|
package/Dockerfile
CHANGED
|
@@ -1,43 +1,94 @@
|
|
|
1
|
-
# Sandbox
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
# Sandbox container image with full development environment
|
|
2
|
+
# Multi-stage build optimized for Turborepo monorepo
|
|
3
|
+
|
|
4
|
+
# ============================================================================
|
|
5
|
+
# Stage 1: Prune monorepo to only include necessary packages
|
|
6
|
+
# ============================================================================
|
|
7
|
+
FROM node:20-alpine AS pruner
|
|
8
|
+
|
|
9
|
+
WORKDIR /app
|
|
10
|
+
|
|
11
|
+
# Install Turborepo globally
|
|
12
|
+
RUN npm install -g turbo
|
|
13
|
+
|
|
14
|
+
# Copy entire monorepo
|
|
15
|
+
COPY . .
|
|
16
|
+
|
|
17
|
+
# Prune to only @repo/sandbox-container and its dependencies (@repo/shared)
|
|
18
|
+
# The --docker flag generates out/json and out/full directories
|
|
19
|
+
RUN turbo prune @repo/sandbox-container --docker
|
|
20
|
+
|
|
21
|
+
# ============================================================================
|
|
22
|
+
# Stage 2: Install dependencies and build packages
|
|
23
|
+
# ============================================================================
|
|
24
|
+
FROM node:20-alpine AS builder
|
|
25
|
+
|
|
26
|
+
WORKDIR /app
|
|
27
|
+
|
|
28
|
+
# Copy pruned lockfile and package.json files (for Docker layer caching)
|
|
29
|
+
COPY --from=pruner /app/out/json/ .
|
|
30
|
+
COPY --from=pruner /app/out/package-lock.json ./package-lock.json
|
|
31
|
+
|
|
32
|
+
# Install ALL dependencies with cache mount for npm packages
|
|
33
|
+
RUN --mount=type=cache,target=/root/.npm \
|
|
34
|
+
npm ci
|
|
35
|
+
|
|
36
|
+
# Copy pruned source code
|
|
37
|
+
COPY --from=pruner /app/out/full/ .
|
|
38
|
+
|
|
39
|
+
# Build all packages (Turborepo handles dependency order automatically)
|
|
40
|
+
# This builds @repo/shared first, then @repo/sandbox-container
|
|
41
|
+
RUN npx turbo run build
|
|
42
|
+
|
|
43
|
+
# ============================================================================
|
|
44
|
+
# Stage 3: Install production-only dependencies
|
|
45
|
+
# ============================================================================
|
|
46
|
+
FROM node:20-alpine AS prod-deps
|
|
47
|
+
|
|
48
|
+
WORKDIR /app
|
|
49
|
+
|
|
50
|
+
# Copy package files from builder
|
|
51
|
+
COPY --from=builder /app/package.json ./package.json
|
|
52
|
+
COPY --from=builder /app/package-lock.json ./package-lock.json
|
|
53
|
+
COPY --from=builder /app/packages ./packages
|
|
54
|
+
COPY --from=builder /app/tooling ./tooling
|
|
55
|
+
|
|
56
|
+
# Install ONLY production dependencies (excludes typescript, @types/*, etc.)
|
|
57
|
+
RUN --mount=type=cache,target=/root/.npm \
|
|
58
|
+
npm ci --production
|
|
59
|
+
|
|
60
|
+
# ============================================================================
|
|
61
|
+
# Stage 4: Runtime - Ubuntu 22.04 with only runtime dependencies
|
|
62
|
+
# ============================================================================
|
|
63
|
+
FROM ubuntu:22.04 AS runtime
|
|
64
|
+
|
|
65
|
+
# Accept version as build argument (passed from npm_package_version)
|
|
66
|
+
ARG SANDBOX_VERSION=unknown
|
|
4
67
|
|
|
5
68
|
# Prevent interactive prompts during package installation
|
|
6
69
|
ENV DEBIAN_FRONTEND=noninteractive
|
|
7
70
|
|
|
8
|
-
#
|
|
9
|
-
|
|
10
|
-
|
|
71
|
+
# Set the sandbox version as an environment variable for version checking
|
|
72
|
+
ENV SANDBOX_VERSION=${SANDBOX_VERSION}
|
|
73
|
+
|
|
74
|
+
# Install essential runtime packages with cache mounts
|
|
75
|
+
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
|
76
|
+
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
|
77
|
+
rm -f /etc/apt/apt.conf.d/docker-clean && \
|
|
78
|
+
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' >/etc/apt/apt.conf.d/keep-cache && \
|
|
79
|
+
apt-get update && apt-get install -y --no-install-recommends \
|
|
11
80
|
curl \
|
|
12
81
|
wget \
|
|
82
|
+
ca-certificates \
|
|
83
|
+
python3.11 \
|
|
84
|
+
python3-pip \
|
|
85
|
+
python3.11-venv \
|
|
86
|
+
procps \
|
|
13
87
|
git \
|
|
14
88
|
unzip \
|
|
15
89
|
zip \
|
|
16
|
-
# Process management
|
|
17
|
-
procps \
|
|
18
|
-
htop \
|
|
19
|
-
# Build tools
|
|
20
|
-
build-essential \
|
|
21
|
-
pkg-config \
|
|
22
|
-
# Network tools
|
|
23
|
-
net-tools \
|
|
24
|
-
iputils-ping \
|
|
25
|
-
dnsutils \
|
|
26
|
-
# Text processing
|
|
27
90
|
jq \
|
|
28
|
-
|
|
29
|
-
nano \
|
|
30
|
-
# Python dependencies
|
|
31
|
-
python3.11 \
|
|
32
|
-
python3.11-dev \
|
|
33
|
-
python3-pip \
|
|
34
|
-
python3.11-venv \
|
|
35
|
-
# Other useful tools
|
|
36
|
-
ca-certificates \
|
|
37
|
-
gnupg \
|
|
38
|
-
lsb-release \
|
|
39
|
-
strace \
|
|
40
|
-
&& rm -rf /var/lib/apt/lists/*
|
|
91
|
+
file
|
|
41
92
|
|
|
42
93
|
# Set Python 3.11 as default python3
|
|
43
94
|
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1
|
|
@@ -47,36 +98,34 @@ RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
|
|
|
47
98
|
&& apt-get install -y nodejs \
|
|
48
99
|
&& rm -rf /var/lib/apt/lists/*
|
|
49
100
|
|
|
50
|
-
# Install Bun from official image
|
|
51
|
-
COPY --from=bun
|
|
52
|
-
COPY --from=bun-source /usr/local/bin/bunx /usr/local/bin/bunx
|
|
101
|
+
# Install Bun runtime from official image
|
|
102
|
+
COPY --from=oven/bun:1 /usr/local/bin/bun /usr/local/bin/bun
|
|
53
103
|
|
|
54
|
-
# Install essential Python packages
|
|
55
|
-
RUN
|
|
104
|
+
# Install essential Python packages with cache mount
|
|
105
|
+
RUN --mount=type=cache,target=/root/.cache/pip \
|
|
106
|
+
pip3 install \
|
|
56
107
|
matplotlib \
|
|
57
108
|
numpy \
|
|
58
109
|
pandas \
|
|
59
110
|
ipython
|
|
60
111
|
|
|
61
|
-
# Set up container server directory
|
|
112
|
+
# Set up runtime container server directory
|
|
62
113
|
WORKDIR /container-server
|
|
63
114
|
|
|
64
|
-
#
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
npm --version && \
|
|
68
|
-
bun --version
|
|
115
|
+
# Copy built sandbox-container package
|
|
116
|
+
COPY --from=builder /app/packages/sandbox-container/dist ./dist
|
|
117
|
+
COPY --from=builder /app/packages/sandbox-container/package.json ./package.json
|
|
69
118
|
|
|
70
|
-
# Copy
|
|
71
|
-
COPY
|
|
72
|
-
RUN bun install --frozen-lockfile
|
|
119
|
+
# Copy Python executor to runtime location
|
|
120
|
+
COPY --from=builder /app/packages/sandbox-container/src/runtime/executors/python/ipython_executor.py ./dist/runtime/executors/python/
|
|
73
121
|
|
|
74
|
-
|
|
122
|
+
# Copy production-only node_modules (excludes typescript, @types/*, etc.)
|
|
123
|
+
# Includes: @repo/shared, zod, esbuild (runtime dependencies)
|
|
124
|
+
COPY --from=prod-deps /app/node_modules ./node_modules
|
|
75
125
|
|
|
76
|
-
#
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
RUN cd runtime/executors/typescript && npx tsc ts_executor.ts --module commonjs --target es2020 --esModuleInterop --skipLibCheck
|
|
126
|
+
# Copy workspace packages
|
|
127
|
+
COPY --from=prod-deps /app/packages/shared/dist ./packages/shared/dist
|
|
128
|
+
COPY --from=prod-deps /app/packages/shared/package.json ./packages/shared/package.json
|
|
80
129
|
|
|
81
130
|
# Configure process pool sizes (can be overridden at runtime)
|
|
82
131
|
ENV PYTHON_POOL_MIN_SIZE=3
|
|
@@ -87,15 +136,13 @@ ENV TYPESCRIPT_POOL_MIN_SIZE=3
|
|
|
87
136
|
ENV TYPESCRIPT_POOL_MAX_SIZE=10
|
|
88
137
|
|
|
89
138
|
# Create clean workspace directory for user code
|
|
90
|
-
# Architecture:
|
|
91
|
-
# /container-server/ - SDK infrastructure (server, executors, dependencies)
|
|
92
|
-
# /workspace/ - User's clean workspace for their code
|
|
93
139
|
RUN mkdir -p /workspace
|
|
94
140
|
|
|
95
141
|
# Expose the application port (3000 for control)
|
|
96
142
|
EXPOSE 3000
|
|
97
143
|
|
|
98
|
-
#
|
|
144
|
+
# Copy and make startup script executable
|
|
145
|
+
COPY packages/sandbox/startup.sh ./
|
|
99
146
|
RUN chmod +x startup.sh
|
|
100
147
|
|
|
101
148
|
# Use startup script
|