Add Deno hosting: AddDenoApp / DenoAppResource in Aspire.Hosting.JavaScript - #18628
Add Deno hosting: AddDenoApp / DenoAppResource in Aspire.Hosting.JavaScript#18628rickylabs wants to merge 88 commits into
Conversation
AddDenoApp previously hardcoded `deno run -A <script>`, which could not express the flags a polyglot framework (NetScript) needs, forcing callers back to raw AddExecutable. Close that gap with a composable fluent flag surface on DenoAppResource. New DenoCommandLineAnnotation captures the complete Deno command line and, when present, fully controls the emitted arg vector in valid CLI order (runtime flags before the entrypoint, script args after). Added WithDeno* extension methods: - Permissions: WithDenoAllowAll + granular allow/deny for net/read/write/run/env/sys/ffi (optional comma-separated value lists), with least-privilege auto-dropping -A once a granular allow is set. - Resolution: WithDenoConfig, WithDenoImportMap, WithDenoLock, WithDenoNoLock, WithDenoNodeModulesDir. - WithDenoUnstable (bare or qualified), WithDenoWatch(hmr), WithDenoInspect/Brk/Wait (optional host:port). - Modes: WithDenoRun / WithDenoTask / WithDenoServe. - Args: WithDenoScriptArgs (after entrypoint) and WithDenoRuntimeArgs (raw escape hatch before entrypoint = AddExecutable parity). The published Dockerfile entrypoint now mirrors the configured command. Bare AddDenoApp remains backward compatible (`deno run -A <entrypoint>`). Documented Aspire-model limitations (least-privilege net/env vs injected endpoints/env/service-discovery, deno serve --port, inspector contention, watch in containers, task permissions) in docs/deno-flag-surface.md. Tests: 13 new cases in AddDenoAppTests cover each flag category, ordering, the three modes, the AddExecutable-replacement path, and backward compat. Full class green: 35/35 passed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012wKHquACkXnWPDgJYhhFjN
…table OTel Close Bun-parity gaps for AddDenoApp so the published Deno image and runtime defaults are at-or-above the Bun block. GAP microsoft#2 (offline/air-gapped + cold start): the generated multi-stage Dockerfile now pre-caches the entrypoint's full module graph into a deterministic DENO_DIR (/deno-dir) in the build stage (`deno cache <entrypoint>`, or `deno cache --frozen <entrypoint>` when a deno.lock exists) and copies /deno-dir into the runtime stage, so the container starts without a network dependency fetch. Deno caches under DENO_DIR (no node_modules stage). GAP microsoft#3: set NODE_ENV=production in the runtime stage and in WithDenoDefaults (development/production by environment), mirroring the Bun publish block, so Deno's Node-compatibility mode behaves. OTEL: verified empirically on Deno 2.9.0 (what denoland/deno:2 resolves to) that native OpenTelemetry is STABLE — OTEL_DENO=true alone activates and exports; `--unstable-otel` is no longer listed by `deno run --help=unstable` and is only a backward-compat no-op. Per the stable-path guidance, no flag is emitted; a code comment documents the verification and version. Tests: add publish tests asserting the `deno cache`/`--frozen` step, DENO_DIR copy, and NODE_ENV; update the Dockerfile/manifest verified snapshots. Document published-image behavior in docs/deno-flag-surface.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The hosting side emits a type:'deno' launch config, but the VS Code extension had a full Bun debug chain with no Deno equivalent, so Deno debug sessions never attached. Mirror the Bun/Node chain for Deno: - languages/deno.ts: new ResourceDebuggerExtension mapping the Deno launch config onto js-debug's built-in pwa-node adapter (no third-party extension). It drives the launch through runtimeExecutable + runtimeArgs and attaches via attachSimplePort to Deno's V8 inspector, injecting `--inspect-wait` after the sub-command (run/serve/task) so attach is reliable (blocks until the debugger connects, no missed early code). Respects a user-configured WithDenoInspect* flag instead of double-injecting. - debuggerExtensions.ts: register denoDebuggerExtension (gated on isDenoInstalled). - capabilities.ts: add the 'deno' capability + isDenoInstalled() (true; Deno uses built-in js-debug). - dcp/types.ts: accept 'deno' in isJavaScriptRuntimeLaunchConfiguration and add DenoLaunchConfiguration + guard. - loc/strings.ts: add denoDisplayName/denoLabel. - test/denoDebugger.test.ts: cover pwa-node mapping, --inspect-wait injection (run + task), user-inspector passthrough, and runtime_executable fallback. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 18628Or
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 18628" |
There was a problem hiding this comment.
Pull request overview
Adds first-party Deno hosting support to Aspire.Hosting.JavaScript, including a new AddDenoApp resource API, a fluent Deno CLI flag surface, publish-time Dockerfile generation (with Deno module graph pre-caching), functional/unit coverage, and VS Code extension support for attaching the built-in js-debug adapter to Deno via the V8 inspector.
Changes:
- Introduces
DenoAppResource+AddDenoAppand aWithDeno*fluent surface for permissions/resolution/watch/inspect/modes/args. - Adds publish-time Dockerfile generation for Deno using
denoland/deno:2with a pinnedDENO_DIRcache copied into runtime. - Adds coverage (unit + functional) and wires VS Code extension support for
type:"deno"debug sessions.
Reviewed changes
Copilot reviewed 28 out of 28 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| src/Aspire.Hosting.JavaScript/JavaScriptHostingExtensions.cs | Adds AddDenoApp, Deno defaults (OTEL/cert trust), publish Dockerfile generation, and WithDeno package-manager integration. |
| src/Aspire.Hosting.JavaScript/DenoHostingExtensions.cs | Adds the WithDeno* fluent Deno CLI flag surface and arg builder logic. |
| src/Aspire.Hosting.JavaScript/DenoCommandLineAnnotation.cs | Adds internal annotation types/enums to model Deno command-line settings. |
| src/Aspire.Hosting.JavaScript/DenoAppResource.cs | Adds the Deno resource type deriving from JavaScriptAppResource. |
| src/Aspire.Hosting.JavaScript/api/Aspire.Hosting.JavaScript.cs | Updates the public API baseline for the new Deno APIs/types. |
| src/Aspire.Hosting.JavaScript/api/Aspire.Hosting.JavaScript.ats.txt | Updates ATS handle/capability declarations for Deno. |
| tests/Aspire.Hosting.JavaScript.Tests/AddDenoAppTests.cs | Adds unit tests for args, permissions, publish Dockerfile content, cert trust, and debug config emission. |
| tests/Aspire.Hosting.JavaScript.Tests/DenoAppFixture.cs | Adds a test fixture that boots real Deno apps (direct + task) under the testing builder. |
| tests/Aspire.Hosting.JavaScript.Tests/DenoFunctionalTests.cs | Adds functional tests that hit real HTTP endpoints from Deno apps. |
| tests/Aspire.Hosting.JavaScript.Tests/Snapshots/AddDenoAppTests.VerifyManifest.verified.txt | Snapshot for Deno executable manifest output. |
| tests/Aspire.Hosting.JavaScript.Tests/Snapshots/AddDenoAppTests.VerifyDockerfile_includePackageJson=True.verified.txt | Snapshot for generated Dockerfile (package.json present). |
| tests/Aspire.Hosting.JavaScript.Tests/Snapshots/AddDenoAppTests.VerifyDockerfile_includePackageJson=False.verified.txt | Snapshot for generated Dockerfile (package.json absent). |
| tests/Aspire.Hosting.JavaScript.Tests/Snapshots/AddDenoAppTests.VerifyDockerfileWithCustomBaseImage.verified.txt | Snapshot for custom build/runtime base images. |
| tests/Aspire.Hosting.JavaScript.Tests/Snapshots/AddDenoAppTests.VerifyDockerfileEmitsPerDockerfileDockerignore.verified.txt | Snapshot for emitted per-Dockerfile dockerignore content. |
| extension/src/debugger/languages/deno.ts | Implements Deno debug configuration mapping to js-debug (pwa-node) and inspector injection. |
| extension/src/debugger/debuggerExtensions.ts | Registers the Deno debugger extension when capability is present. |
| extension/src/dcp/types.ts | Extends launch configuration typing to include type: "deno". |
| extension/src/capabilities.ts | Adds the deno capability and availability check. |
| extension/src/loc/strings.ts | Adds display label helpers for Deno debugging. |
| extension/src/test/denoDebugger.test.ts | Adds unit tests for the Deno debugger extension behavior. |
| docs/deno-flag-surface.md | Documents the supported Deno CLI surface and intentional limitations. |
| playground/AspireWithDeno/aspire.config.json | Adds a playground scenario config for Deno AppHost usage. |
| playground/AspireWithDeno/apphost.mts | Minimal TypeScript AppHost demonstrating addDenoApp direct + task modes. |
| playground/AspireWithDeno/package.json | Playground package metadata and aspire run script. |
| playground/AspireWithDeno/README.md | Playground documentation and rationale for defaults like -A / OTEL. |
| playground/AspireWithDeno/tsconfig.json | Playground TS config for the AppHost. |
| playground/AspireWithDeno/DenoFrontend/main.ts | Minimal Deno HTTP server used by playground and functional tests. |
| playground/AspireWithDeno/DenoFrontend/deno.json | Task definition to exercise deno task start. |
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
PR Testing ReportPR Information
Artifact Version Verification
Changes AnalyzedFiles Changed
Change Categories
Test Scenarios ExecutedScenario 1: Targeted hosting source validationObjective: Verify the new Deno hosting source tests and snapshots pass from the PR checkout. Steps:
Evidence:
Observations:
Scenario 2: VS Code extension build and unit validationObjective: Verify the PR extension source compiles, lints, and passes VS Code unit tests. Steps:
Evidence:
Observations:
Scenario 3: Deno debugger support in a real Extension HostObjective: Verify Deno debugger registration and launch configuration generation from a real VS Code Extension Host, not only unit tests. Steps:
Evidence:
Observations:
Scenario 4: Dogfood CLI Deno run and task appsObjective: Verify the installed PR CLI can create a fresh AppHost that runs both direct Steps:
Evidence:
Observations:
Scenario 5: Deno Dockerfile publishing with WithDenoTaskObjective: Verify publish artifacts for the new Deno Dockerfile support, including cache pre-warming, runtime cache copy, non-root user, and task entrypoint when using the new Deno flag surface. Steps:
Evidence:
Observations:
Scenario 6: Missing Deno task fails safelyObjective: Verify a misconfigured Steps:
Evidence:
Expected Unhappy-Path Outcome: Non-zero wait result, failed/stopped resource, and a clear Deno task error. Observations:
Scenario 7: Least-privilege Deno permissions fail safely without env accessObjective: Verify opting out of the default Steps:
Evidence:
Expected Unhappy-Path Outcome: Non-zero wait result, failed/stopped resource, and Deno Observations:
Scenario 8: Publish mismatch for WithRunScript task appsObjective: Verify published Dockerfile entrypoints match run-mode behavior for Deno task apps configured with Steps:
Evidence:
Expected Outcome: Because run mode described and logged the resource as Actual Outcome: Impact: A Deno app that relies on Scenario 9: Docker Compose deployment and runtime validationObjective: Verify the generated Deno containers build, deploy with Docker Compose, stay running, and serve the expected HTTP responses. Steps:
Evidence:
Expected Outcome: The PR playground's Docker Compose deployment builds both Deno images, starts the Compose services, and both Deno app endpoints return the expected responses. Actual Outcome:
Impact: The generated default Deno Dockerfile image tag prevents real Docker Compose deployment from building/running unless users override the base image to a valid tag. Once a valid image tag is configured, the generated containers run correctly; the task container also requires the explicit Deno task API to avoid the Summary
Overall Result❌ ISSUES FOUND Most Deno hosting and VS Code debugger scenarios passed, including real dogfood CLI run/task behavior, generated Dockerfile behavior with
Recommendations
|
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Avoid emitting task-invalid Deno resolution flags for task mode while preserving supported task flags and run/serve behavior. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4386e8b9-e6f7-4fa2-ab5c-1d243629a555
Adam Ratzman (adamint)
left a comment
There was a problem hiding this comment.
I reviewed and tested the updated Deno hosting implementation. The outstanding runtime, OTLP publishing, Docker layering, and polyglot validation issues are addressed.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4386e8b9-e6f7-4fa2-ab5c-1d243629a555
Replace the blocked third-party setup action with a pinned, checksum-verified local installer so workflows can start under the repository Actions policy. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4386e8b9-e6f7-4fa2-ab5c-1d243629a555
There was a problem hiding this comment.
Review details
Suppressed comments (2)
src/Aspire.Hosting/OtlpConfigurationExtensions.cs:119
- The optional behavior depends on registration order. If a resource already called
WithOtlpExporter()and then calls this new optional overload, the earlier non-optional environment callback still reads the last (HTTP) annotation and callsResolveOtlpEndpoint; with no HTTP endpoint it throws instead of skipping export. Associate each callback with the annotation it registered (and ignore it when that annotation is no longer effective), or carry optionality on the effective annotation, and add coverage for required-then-optional registration.
src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentResource.cs:560 - This changes deployed Kubernetes workloads from always using the dashboard's gRPC collector to selecting the HTTP collector for
HttpProtobuf/HttpJson, but coverage only verifies generated YAML. Add a deployment E2E case that starts the chart and confirms telemetry reaches the dashboard over the selected HTTP protocol; the repository already has deployed Helm coverage intests/Aspire.Deployment.EndToEnd.Tests/KubernetesHelmChartDeploymentTests.cs.
- Files reviewed: 86/87 changed files
- Comments generated: 0 new
- Review effort level: Balanced
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 86 out of 87 changed files in this pull request and generated no new comments.
Suppressed comments (2)
src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentResource.cs:560
- This changes the deployed Kubernetes service/port selected for OTLP, but coverage stops at the rendered
values.yaml. A chart can contain these strings and still fail to route telemetry after deployment. Please add a Kubernetes deployment E2E that deploys an HTTP/protobuf exporter (ideally the Deno resource) and verifies the dashboard receives telemetry throughotlp-http.
src/Aspire.Hosting.Docker/DockerComposeEnvironmentResource.cs:379 - This changes deployed Compose connectivity from the gRPC collector to a protocol-selected endpoint, but the added tests only inspect generated YAML (and use a test-only container annotation). They would not catch a stack that starts successfully but fails to deliver Deno telemetry through the dashboard's HTTP OTLP service. Please add an automated deployment E2E that starts the generated Compose stack with an actual
AddDenoAppresource and verifies telemetry reaches the dashboard over HTTP/protobuf.
var (otlpEndpoint, protocol) = otlpExporter.RequiredProtocol switch
{
OtlpProtocol.HttpProtobuf => (dashboard.OtlpHttpEndpoint, "http/protobuf"),
OtlpProtocol.HttpJson => (dashboard.OtlpHttpEndpoint, "http/json"),
_ => (dashboard.OtlpGrpcEndpoint, "grpc"),
Normalize path separators and Windows casing before locating the Deno entrypoint so inspector-like script arguments are not mistaken for runtime flags. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4386e8b9-e6f7-4fa2-ab5c-1d243629a555
There was a problem hiding this comment.
Review details
Suppressed comments (1)
src/Aspire.Hosting.JavaScript/DenoHostingExtensions.cs:1382
- When
deno.lockexists, a caller usingWithDenoRuntimeArgs("--no-lock")reaches the cache allowlist and emitsdeno cache --no-lock --frozen ...; Deno rejects these mutually exclusive flags, so the generated image cannot build. Treat the raw--no-lockspelling likeWithDenoNoLock()when deciding whether to add--frozen.
if (deno.NoLock)
{
return false;
}
- Files reviewed: 86/87 changed files
- Comments generated: 0 new
- Review effort level: Balanced
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4386e8b9-e6f7-4fa2-ab5c-1d243629a555
There was a problem hiding this comment.
Review details
Suppressed comments (5)
extension/src/debugger/languages/deno.ts:175
- This cleanup is keyed only by
runId, whileAspireDebugSessioncallscleanupRun(runId)whenever any child debug session in that run terminates. A sibling can therefore remove this reservation after allocation but before Deno binds, allowing a concurrent Deno launch to select the same port. The unit test exercises only this file's termination listener and misses the run-level cleanup path; scope cleanup to the resource/debug-session ID.
registerRunCleanup(launchOptions.runId, disposeRelease);
launchOptions.debugSession.registerResourceCleanup({
dispose: disposeRelease
});
src/Aspire.Hosting.JavaScript/JavaScriptHostingExtensions.cs:882
- The generated Deno publisher is covered only by Dockerfile text assertions and snapshots. None of the deployment E2E tests builds and starts the generated image, so regressions in image ownership, the copied
DENO_DIR, shell availability, or the emitted entrypoint can pass CI despite producing an unusable deployment. Add an automated deployment test that publishes, builds, starts, and calls a generated Deno container.
.PublishAsDockerFile(c =>
src/Aspire.Hosting/OtlpConfigurationExtensions.cs:200
- The endpoint/protocol is selected from the last OTLP exporter annotation, but activation variables are collected from every annotation. If a Deno resource's HTTP/protobuf annotation is followed by
WithOtlpExporter(OtlpProtocol.Grpc)orHttpJson, this still enablesOTEL_DENOagainst a protocol Deno's native exporter does not support. Read activation variables only from the effective annotation.
src/Aspire.Hosting.Docker/DockerComposeEnvironmentResource.cs:408 - The effective endpoint/protocol comes from the last exporter annotation, but this activates every exporter annotation. A Deno annotation followed by a gRPC or HTTP/JSON exporter therefore still emits
OTEL_DENOwith an incompatible deployment endpoint. Apply activation variables only from the effective annotation.
foreach (var annotation in resource.Annotations.OfType<OtlpExporterAnnotation>())
{
if (annotation is not IReadOnlyDictionary<string, string> activationEnvironmentVariables)
src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentResource.cs:588
- The effective endpoint/protocol comes from the last exporter annotation, but this activates every exporter annotation. A Deno annotation followed by a gRPC or HTTP/JSON exporter therefore still emits
OTEL_DENOwith an incompatible deployment endpoint. Apply activation variables only from the effective annotation.
- Files reviewed: 87/88 changed files
- Comments generated: 0 new
- Review effort level: Balanced
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4386e8b9-e6f7-4fa2-ab5c-1d243629a555
There was a problem hiding this comment.
Review details
Suppressed comments (1)
src/Aspire.Hosting.JavaScript/README.md:36
runScriptNameis an npm script name, not an entrypoint path. Unless the omittedpackage.jsondefines a script literally namedapp.js, this minimal example fails at startup. Use a real script name such asdevin both samples, or useAddNodeApp/addNodeAppwhenapp.jsis the entrypoint.
- Files reviewed: 87/88 changed files
- Comments generated: 0 new
- Review effort level: Balanced
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4386e8b9-e6f7-4fa2-ab5c-1d243629a555
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4386e8b9-e6f7-4fa2-ab5c-1d243629a555
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 577e9ecd-68d0-4029-b837-7ce00ca1b007
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 577e9ecd-68d0-4029-b837-7ce00ca1b007
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 577e9ecd-68d0-4029-b837-7ce00ca1b007
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 577e9ecd-68d0-4029-b837-7ce00ca1b007
There was a problem hiding this comment.
Review details
Suppressed comments (1)
src/Aspire.Hosting/OtlpConfigurationExtensions.cs:100
- The callback now reads the last exporter annotation, but
skipIfEndpointUnavailablestill belongs to the callback that was originally registered. If a resource callsWithOtlpExporter()and thenWithOtlpExporterIfEndpointAvailable(HttpProtobuf), the earlier mandatory callback sees the final optional HTTP annotation and calls the resolver without an endpoint, which throws instead of leaving telemetry disabled. Make optionality part of the effective annotation (or ensure only the effective registration's callback runs), and add this reverse-order regression case.
- Files reviewed: 70/71 changed files
- Comments generated: 0 new
- Review effort level: Balanced
Add Deno hosting to
Aspire.Hosting.JavaScriptAdds first-class Deno application hosting alongside Node and Bun through
AddDenoAppandDenoAppResource.What
deno run, nameddeno tasktasks, ordeno servehandlers.WithDeno*surface for permissions, config/import maps/locks, node modules, unstable features, watch, inspection, execution modes, and arguments.denoland/deno:2.9.0image.DENO_CERT,DENO_TLS_CA_STORE, andOTEL_EXPORTER_OTLP_CERTIFICATE.runandservelaunches through the built-inpwa-nodeadapter.ASPIREDENO001.Usage
Direct application
Local execution defaults to
deno run -A main.ts. Generated containers use the safer--allow-net --allow-envdefault.Granular permissions
Supported permission kinds are
Net,Read,Write,Run,Env,Import,Sys, andFfi.deno.jsontask{ "tasks": { "start": "deno run --allow-net --allow-env main.ts" } }WithRunScript("start")is also supported. Task permissions are controlled by the task command itself.deno serveWithDenoServecreates the HTTP endpoint automatically. Published containers conventionally use port 8000 as the process-local target while Aspire allocates unique host ports.Configuration and development options
WithDenoRuntimeArgsprovides an escape hatch for runtime flags not represented by a dedicated API.WithDenoInspectsupports--inspect,--inspect-brk, and--inspect-waitwith an optional host and port.TypeScript AppHost
Supported scenarios
AddDenoApp; runs withdeno rundeno.jsontasksWithDenoTaskorWithRunScriptWithDenoServe, including automatic endpoint configurationDenoNodeModulesDirMode.None,Auto, orManuallocallyWithDenoWatchandWithDenoUnstableWithReference, endpoint, and health-check APIsrun/serve; configurable inspector modesRun and publish behavior
Generated publishing:
denoland/deno:2.9.0for build and runtime stages and runs as the non-rootdenouser.run/serveentrypoints to--allow-net --allow-env; deny-only policies narrow those defaults without broadening access to-A.DENO_DIR=/deno-dir, carries the cache into the runtime stage, and starts cached-only unless the caller selects another policy.WithBuildScriptandPublishAsPackageScriptfor task-based images.--env-filerather than copying dotenv files into image layers; Aspire environment/secret injection or a user-authored Dockerfile remains available.--certpaths; app/config/import-map/lock paths that escape the build context are rejected.OtlpExporterAnnotationin publish mode so deployment targets can inject the appropriate collector. Docker Compose supplies Deno with the dashboard's HTTP OTLP endpoint andhttp/protobuf, while default and explicit gRPC exporters continue using gRPC.Intentional limitations:
PATHfor local execution.deno taskbecause Deno rejects inspector flags on task launches.node_modules; useAutoor a user-authored Dockerfile.Validation
Aspire.Hosting.JavaScript.Tests: 384 passed, 0 failed, including real dashboard-free direct/task startup and dashboard telemetry coverage.Aspire.Hosting.Docker.Tests: 100 passed, 0 failed, 1 Windows-only skip.playground/AspireWithDenoAppHost against Deno 2.9.0: direct and task resources were healthy, returned distinct responses, and emitted structured logs and HTTP traces to the dashboard.