docker/execd/v1.0.20

opensandbox-group/OpenSandboxdocker/execd/v1.0.20Jun 29, 2026by Pangjiping

AI Summary

The execd component gains filesystem isolation using bubblewrap and fixes issues related to signal interference and directory ownership during uploads.

Key Highlights

  • Filesystem isolation with bubblewrap (bwrap) for sandbox command execution.
  • Fix for false command failures caused by global signal interference.
  • Auto-created parent directories now inherit owner/group metadata.

New Features

  • New pkg/isolation/ package with bubblewrap-based isolation layer.
  • MkdirAllWithOwnership helper for consistent directory metadata propagation.
  • Static linking of the bwrap binary via init container.

Full Release Notes

## What's New

### ✨ Features

- **Filesystem isolation with bubblewrap (bwrap).** New `pkg/isolation/` package adds a `bubblewrap`-based filesystem isolation layer for sandbox command execution. Includes an `Isolator` interface, bwrap argv builder, startup probe, upper directory management, and seccomp loading. The bwrap binary is now statically built (musl-gcc) and injected into the execd container image via init container alongside execd itself. Configurable via isolation flags (`upper root`, `max bytes`, `diff max bytes`, `allowed writable`) with env var overrides. Diff/commit support deferred to Phase 2 (returns 503). Includes a CI smoke test validating static linking and bwrap namespace creation. (#1008)

### 🐛 Bug Fixes

- **False command failures from global signal interference resolved.** `execd` could report a successfully-executed command as `CommandExecError` when `cmd.Wait()` returned a spurious `ECHILD` ("waitid: no child processes"). Root cause: `signal.Notify(signals)` with no signal list captured ALL signals (including SIGCHLD/SIGURG used by Go runtime for child reaping and async preemption), and `signal.Reset()` was process-global, racing across concurrent commands. Now uses an explicit signal set with `signal.Stop()` for scoped cleanup, and ignores spurious `ECHILD` from `Wait()` when the child already ran to completion. (#1042)

- **Auto-created parent directories now inherit owner/group.** When uploading a file to a path whose parent directories don't exist, `resolveUploadTarget` now propagates `owner`/`group` metadata to each newly created parent directory via the new `MkdirAllWithOwnership` helper. Pre-existing directories are left untouched. The `MakeDir` API also uses this helper for consistent behavior during multi-level directory creation. (#1075)

### 📖 Documentation

- **DEVELOPMENT.md rewritten.** Reduced from 598 to 99 lines — removed generic Go boilerplate and fixed all code examples from Beego to Gin to match the current codebase (migrated in v1.0.3). (#1071)

- **Missing `EXECD_ACCESS_TOKEN` env var documented.** The README env var table now includes `EXECD_ACCESS_TOKEN`, which `parser.go` defines but was previously undocumented. (#1071)

- **Docs site links updated.** execd component docs updated as part of the VitePress docs site restructure — fixed broken cross-references and aligned with the new section-based information architecture. (#1090)

## 👥 Contributors

Thanks to these contributors ❤️

- @LavenderQAQ
- @ninan-nn
- @Pangjiping

---
- Docker Hub: opensandbox/execd:v1.0.20
- Aliyun Registry: sandbox-registry.cn-zhangjiakou.cr.aliyuncs.com/opensandbox/execd:v1.0.20