From 96688c5079273b6849bca36a3d44def5f24a6290 Mon Sep 17 00:00:00 2001 From: David Pine Date: Tue, 15 Sep 2026 14:55:07 -0500 Subject: [PATCH 1/5] Rename Aspire Dashboard image to aspire/dashboard family (#7337) Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b8c2a84d-ea5c-4c33-af40-3734a5cc3b24 --- .../docker-hub/README.aspire-dashboard.md | 148 ------------------ .portal-docs/docker-hub/README.aspnet.md | 1 - .../docker-hub/README.monitor-base.md | 1 - .portal-docs/docker-hub/README.monitor.md | 1 - .../docker-hub/README.runtime-deps.md | 1 - .portal-docs/docker-hub/README.runtime.md | 1 - .portal-docs/docker-hub/README.samples.md | 1 - .portal-docs/docker-hub/README.sdk.md | 1 - .../mar/README.aspire-dashboard.portal.md | 7 +- .portal-docs/mar/README.aspnet.portal.md | 1 - .../mar/README.monitor-base.portal.md | 1 - .portal-docs/mar/README.monitor.portal.md | 1 - .../mar/README.runtime-deps.portal.md | 1 - .portal-docs/mar/README.runtime.portal.md | 1 - .portal-docs/mar/README.samples.portal.md | 1 - .portal-docs/mar/README.sdk.portal.md | 1 - README.aspire-dashboard.md | 9 +- README.aspnet.md | 1 - README.md | 2 - README.monitor-base.md | 1 - README.monitor.md | 1 - README.runtime-deps.md | 1 - README.runtime.md | 1 - README.samples.md | 1 - README.sdk.md | 1 - documentation/image-signatures.md | 1 + .../About.aspire-dashboard.md | 2 +- eng/readme-templates/About.md | 4 +- eng/readme-templates/Announcement.md | 6 +- eng/readme-templates/FeaturedTags.md | 2 +- eng/readme-templates/Get-GeneratedReadmes.ps1 | 1 - eng/readme-templates/GitHub.header.md | 6 +- eng/readme-templates/ReposProvider.md | 3 +- eng/readme-templates/Support.md | 4 +- eng/readme-templates/Url.md | 8 +- eng/readme-templates/Use.md | 4 +- manifest.json | 59 +++++-- .../AspireDashboardManifestTests.cs | 135 ++++++++++++++++ .../ImageData.cs | 4 +- .../Microsoft.DotNet.Docker.Tests/Manifest.cs | 1 + .../StaticTagTests.cs | 8 +- 41 files changed, 223 insertions(+), 212 deletions(-) delete mode 100644 .portal-docs/docker-hub/README.aspire-dashboard.md create mode 100644 tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs diff --git a/.portal-docs/docker-hub/README.aspire-dashboard.md b/.portal-docs/docker-hub/README.aspire-dashboard.md deleted file mode 100644 index 33e2714f3f..0000000000 --- a/.portal-docs/docker-hub/README.aspire-dashboard.md +++ /dev/null @@ -1,148 +0,0 @@ -# Featured Tags - -* `13` - * `docker pull mcr.microsoft.com/dotnet/aspire-dashboard:13` - -# About - -This image contains the Aspire Dashboard. - -Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categories/announcements) for Docker-related .NET announcements. - -# Usage - -The Aspire Dashboard is a browser-based app to view run-time information about your distributed application. - -The dashboard shows: - -* Resources that make up your app, such as .NET projects, executables and containers. -* Live console logs of resources. -* Live telemetry, such as structured logs, traces and metrics. - -## Configuration - -The dashboard must be configured when it is started. The configuration is done via environment variables. The following environment variables are supported: - -* `ASPNETCORE_URLS` specifies one or more HTTP endpoints through which the dashboard frontend is served. The frontend endpoint is used to view the dashboard in a browser. Defaults to `http://localhost:18888`. -* `DOTNET_DASHBOARD_OTLP_ENDPOINT_URL` specifies the [OTLP/gRPC](https://opentelemetry.io/docs/specs/otlp/#otlpgrpc) endpoint. This endpoint hosts an OTLP service and receives telemetry using gRPC. When the dashboard is launched by the Aspire app host this address is secured with HTTPS. Securing the dashboard with HTTPS is recommended. Defaults to `http://localhost:18889`. -* `DOTNET_DASHBOARD_OTLP_HTTP_ENDPOINT_URL` specifies the [OTLP/HTTP](https://opentelemetry.io/docs/specs/otlp/#otlphttp) endpoint. This endpoint hosts an OTLP service and receives telemetry using Protobuf over HTTP. Defaults to `http://localhost:18890`. -* `ASPIRE_DASHBOARD_MCP_ENDPOINT_URL` specifies the Aspire MCP endpoint. When this value isn't specified then the MCP server is hosted with an `ASPNETCORE_URLS` endpoint. The MCP server can be disabled by configuring `Dashboard:Mcp:Disabled` to `true`. Defaults to `http://localhost:18891`. -* `DOTNET_DASHBOARD_UNSECURED_ALLOW_ANONYMOUS` specifies the dashboard doesn't use authentication and accepts anonymous access. This setting is a shortcut to configuring `Dashboard:Frontend:AuthMode`, `Dashboard:Otlp:AuthMode` and `Dashboard:Mcp:AuthMode` to `Unsecured`. -* `DOTNET_DASHBOARD_CONFIG_FILE_PATH` specifies the path for an optional JSON configuration file. - -### Frontend authentication - -The dashboard's frontend supports OpenID Connect (OIDC). Set `Dashboard__Frontend__AuthMode` to `OpenIdConnect`, then add the following configuration: - -* `Authentication__Schemes__OpenIdConnect__Authority` — URL to the identity provider (IdP) -* `Authentication__Schemes__OpenIdConnect__ClientId` — Identity of the relying party (RP) -* `Authentication__Schemes__OpenIdConnect__ClientSecret`— A secret that only the real RP would know -* Other properties of [`OpenIdConnectOptions`](https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.builder.openidconnectoptions) specified in configuration container `Authentication__Schemes__OpenIdConnect__*` - -It may also be run unsecured. Set `Dashboard__Frontend__AuthMode` to `Unsecured`. The frontend endpoint will allow anonymous access. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. - -## OTLP authentication - -The OTLP endpoint can be secured with [client certificate](https://learn.microsoft.com/aspnet/core/security/authentication/certauth) or API key authentication. - -For client certification authentication, set `Dashboard__Otlp__AuthMode` to `Certificate`. - -For API key authentication, set `Dashboard__Otlp__AuthMode` to `ApiKey`, then add the following configuration: - -* `Dashboard__Otlp__PrimaryApiKey` specifies the primary API key. (required, string) -* `Dashboard__Otlp__SecondaryApiKey` specifies the secondary API key. (optional, string) - -It may also be run unsecured. Set `Dashboard__Otlp__AuthMode` to `Unsecured`. The OTLP endpoint will allow anonymous access. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. - -## Resources - -* `Dashboard__ResourceServiceClient__Url` specifies the gRPC endpoint to which the dashboard connects for its data. There's no default. If this variable is unspecified, the dashboard shows OTEL data but no resource list or console logs. - -The resource service client supports certificates. Set `Dashboard__ResourceServiceClient__AuthMode` to `Certificate`, then add the following configuration: - -* `Dashboard__ResourceServiceClient__ClientCertificate__Source` (required) one of: - * `File` to load the cert from a file path, configured with: - * `Dashboard__ResourceServiceClient__ClientCertificate__FilePath` (required, string) - * `Dashboard__ResourceServiceClient__ClientCertificate__Password` (optional, string) - * `KeyStore` to load the cert from a key store, configured with: - * `Dashboard__ResourceServiceClient__ClientCertificate__Subject` (required, string) - * `Dashboard__ResourceServiceClient__ClientCertificate__Store` (optional, [`StoreName`](https://learn.microsoft.com/dotnet/api/system.security.cryptography.x509certificates.storename), defaults to `My`) - * `Dashboard__ResourceServiceClient__ClientCertificate__Location` (optional, [`StoreLocation`](https://learn.microsoft.com/dotnet/api/system.security.cryptography.x509certificates.storelocation), defaults to `CurrentUser`) - -To opt-out of authentication, set `Dashboard__ResourceServiceClient__AuthMode` to `Unsecured`. This completely disables all security for the resource service client. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. - -### Telemetry Limits - -Telemetry is stored in-memory. To avoid excessive memory usage, the dashboard has limits on the count and size of stored telemetry. When a count limit is reached, new telemetry is added, and the oldest telemetry is removed. When a size limit is reached, data is truncated to the limit. - -* `Dashboard__TelemetryLimits__MaxLogCount` specifies the maximum number of log entries. Defaults to 10,000. -* `Dashboard__TelemetryLimits__MaxTraceCount` specifies the maximum number of traces. Defaults to 10,000. -* `Dashboard__TelemetryLimits__MaxMetricsCount` specifies the maximum number of metric data points. Defaults to 50,000. -* `Dashboard__TelemetryLimits__MaxAttributeCount` specifies the maximum number of attributes on telemetry. Defaults to 128. -* `Dashboard__TelemetryLimits__MaxAttributeLength` specifies the maximum length of attributes. Defaults to unlimited. -* `Dashboard__TelemetryLimits__MaxSpanEventCount` specifies the maximum number of events on span attributes. Defaults to unlimited. - -Limits are per-resource. For example, a `MaxLogCount` value of 10,000 configures the dashboard to store up to 10,000 log entries per-resource. - -## Other - -* `Dashboard__ApplicationName` specifies the application name to be displayed in the UI. This applies only when no resource service URL is specified. When a resource service exists, the service specifies the application name. - -# Related Repositories - -.NET: - -* [dotnet](https://hub.docker.com/r/microsoft/dotnet/): .NET -* [dotnet/sdk](https://hub.docker.com/r/microsoft/dotnet-sdk/): .NET SDK -* [dotnet/aspnet](https://hub.docker.com/r/microsoft/dotnet-aspnet/): ASP.NET Core Runtime -* [dotnet/runtime](https://hub.docker.com/r/microsoft/dotnet-runtime/): .NET Runtime -* [dotnet/runtime-deps](https://hub.docker.com/r/microsoft/dotnet-runtime-deps/): .NET Runtime Dependencies -* [dotnet/monitor](https://hub.docker.com/r/microsoft/dotnet-monitor/): .NET Monitor Tool -* [dotnet/nightly/aspire-dashboard](https://hub.docker.com/r/microsoft/dotnet-nightly-aspire-dashboard/): Aspire Dashboard (Preview) -* [dotnet/samples](https://hub.docker.com/r/microsoft/dotnet-samples/): .NET Samples - -.NET Framework: - -* [dotnet/framework](https://hub.docker.com/r/microsoft/dotnet-framework/): .NET Framework, ASP.NET and WCF -* [dotnet/framework/samples](https://hub.docker.com/r/microsoft/dotnet-framework-samples/): .NET Framework, ASP.NET and WCF Samples - -# Full Tag Listing - -View the current tags at the [Microsoft Artifact Registry portal](https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/tags) or on [GitHub](https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md#full-tag-listing). - -# Support - -## Lifecycle - -* [Microsoft Support for .NET](https://github.com/dotnet/core/blob/main/support.md) -* [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md) -* [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md) - -## Image Update Policy - -* **Base Image Updates:** Images are re-built within 12 hours of any updates to their base images (e.g. debian:bookworm-slim, windows/nanoserver:ltsc2022, etc.). -* **.NET Releases:** Images are re-built as part of releasing new .NET versions. This includes new major versions, minor versions, and servicing releases. -* **Critical CVEs:** Images are re-built to pick up critical CVE fixes as described by the CVE Update Policy below. -* **Monthly Re-builds:** Images are re-built monthly, typically on the second Tuesday of the month, in order to pick up lower-severity CVE fixes. -* **Out-Of-Band Updates:** Images can sometimes be re-built when out-of-band updates are necessary to address critical issues. If this happens, new fixed version tags will be updated according to the [Fixed version tags documentation](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md#fixed-version-tags). - -### CVE Update Policy - -.NET container images are regularly monitored for the presence of CVEs. A given image will be rebuilt to pick up fixes for a CVE when: - -* We detect the image contains a CVE with a [CVSS](https://nvd.nist.gov/vuln-metrics/cvss) score of "Critical" -* **AND** the CVE is in a package that is added in our Dockerfile layers (meaning the CVE is in a package we explicitly install or any transitive dependencies of those packages) -* **AND** there is a CVE fix for the package available in the affected base image's package repository. - -Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md) for more detail about what to do when a CVE is encountered in a .NET image. - -## Feedback - -* [File an issue](https://github.com/dotnet/dotnet-docker/issues/new/choose) -* [Contact Microsoft Support](https://support.microsoft.com/contactus/) - -# License - -* Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) -* [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) -* [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) diff --git a/.portal-docs/docker-hub/README.aspnet.md b/.portal-docs/docker-hub/README.aspnet.md index c7c532153e..f2313b3fef 100644 --- a/.portal-docs/docker-hub/README.aspnet.md +++ b/.portal-docs/docker-hub/README.aspnet.md @@ -65,7 +65,6 @@ For more information, see the [composite images section in the Image Variants do * [dotnet/runtime](https://hub.docker.com/r/microsoft/dotnet-runtime/): .NET Runtime * [dotnet/runtime-deps](https://hub.docker.com/r/microsoft/dotnet-runtime-deps/): .NET Runtime Dependencies * [dotnet/monitor](https://hub.docker.com/r/microsoft/dotnet-monitor/): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://hub.docker.com/r/microsoft/dotnet-aspire-dashboard/): Aspire Dashboard * [dotnet/nightly/aspnet](https://hub.docker.com/r/microsoft/dotnet-nightly-aspnet/): ASP.NET Core Runtime (Preview) * [dotnet/samples](https://hub.docker.com/r/microsoft/dotnet-samples/): .NET Samples diff --git a/.portal-docs/docker-hub/README.monitor-base.md b/.portal-docs/docker-hub/README.monitor-base.md index 34696f62b7..948c4b8539 100644 --- a/.portal-docs/docker-hub/README.monitor-base.md +++ b/.portal-docs/docker-hub/README.monitor-base.md @@ -32,7 +32,6 @@ The following Dockerfiles demonstrate how you can use this base image to build a * [dotnet/runtime](https://hub.docker.com/r/microsoft/dotnet-runtime/): .NET Runtime * [dotnet/runtime-deps](https://hub.docker.com/r/microsoft/dotnet-runtime-deps/): .NET Runtime Dependencies * [dotnet/monitor](https://hub.docker.com/r/microsoft/dotnet-monitor/): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://hub.docker.com/r/microsoft/dotnet-aspire-dashboard/): Aspire Dashboard * [dotnet/nightly/monitor/base](https://hub.docker.com/r/microsoft/dotnet-nightly-monitor-base/): .NET Monitor Base (Preview) * [dotnet/samples](https://hub.docker.com/r/microsoft/dotnet-samples/): .NET Samples diff --git a/.portal-docs/docker-hub/README.monitor.md b/.portal-docs/docker-hub/README.monitor.md index 2402775231..1751a12b7f 100644 --- a/.portal-docs/docker-hub/README.monitor.md +++ b/.portal-docs/docker-hub/README.monitor.md @@ -33,7 +33,6 @@ See [documentation](https://go.microsoft.com/fwlink/?linkid=2158052) for how to * [dotnet/runtime](https://hub.docker.com/r/microsoft/dotnet-runtime/): .NET Runtime * [dotnet/runtime-deps](https://hub.docker.com/r/microsoft/dotnet-runtime-deps/): .NET Runtime Dependencies * [dotnet/monitor/base](https://hub.docker.com/r/microsoft/dotnet-monitor-base/): .NET Monitor Base -* [dotnet/aspire-dashboard](https://hub.docker.com/r/microsoft/dotnet-aspire-dashboard/): Aspire Dashboard * [dotnet/nightly/monitor](https://hub.docker.com/r/microsoft/dotnet-nightly-monitor/): .NET Monitor Tool (Preview) * [dotnet/samples](https://hub.docker.com/r/microsoft/dotnet-samples/): .NET Samples diff --git a/.portal-docs/docker-hub/README.runtime-deps.md b/.portal-docs/docker-hub/README.runtime-deps.md index d310ab4499..c63335ee1f 100644 --- a/.portal-docs/docker-hub/README.runtime-deps.md +++ b/.portal-docs/docker-hub/README.runtime-deps.md @@ -47,7 +47,6 @@ They contain the following features: * [dotnet/aspnet](https://hub.docker.com/r/microsoft/dotnet-aspnet/): ASP.NET Core Runtime * [dotnet/runtime](https://hub.docker.com/r/microsoft/dotnet-runtime/): .NET Runtime * [dotnet/monitor](https://hub.docker.com/r/microsoft/dotnet-monitor/): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://hub.docker.com/r/microsoft/dotnet-aspire-dashboard/): Aspire Dashboard * [dotnet/nightly/runtime-deps](https://hub.docker.com/r/microsoft/dotnet-nightly-runtime-deps/): .NET Runtime Dependencies (Preview) * [dotnet/samples](https://hub.docker.com/r/microsoft/dotnet-samples/): .NET Samples diff --git a/.portal-docs/docker-hub/README.runtime.md b/.portal-docs/docker-hub/README.runtime.md index 35a9319254..962ffe6117 100644 --- a/.portal-docs/docker-hub/README.runtime.md +++ b/.portal-docs/docker-hub/README.runtime.md @@ -54,7 +54,6 @@ They contain the following features: * [dotnet/aspnet](https://hub.docker.com/r/microsoft/dotnet-aspnet/): ASP.NET Core Runtime * [dotnet/runtime-deps](https://hub.docker.com/r/microsoft/dotnet-runtime-deps/): .NET Runtime Dependencies * [dotnet/monitor](https://hub.docker.com/r/microsoft/dotnet-monitor/): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://hub.docker.com/r/microsoft/dotnet-aspire-dashboard/): Aspire Dashboard * [dotnet/nightly/runtime](https://hub.docker.com/r/microsoft/dotnet-nightly-runtime/): .NET Runtime (Preview) * [dotnet/samples](https://hub.docker.com/r/microsoft/dotnet-samples/): .NET Samples diff --git a/.portal-docs/docker-hub/README.samples.md b/.portal-docs/docker-hub/README.samples.md index 9488557a36..8629450062 100644 --- a/.portal-docs/docker-hub/README.samples.md +++ b/.portal-docs/docker-hub/README.samples.md @@ -71,7 +71,6 @@ They contain the following features: * [dotnet/runtime](https://hub.docker.com/r/microsoft/dotnet-runtime/): .NET Runtime * [dotnet/runtime-deps](https://hub.docker.com/r/microsoft/dotnet-runtime-deps/): .NET Runtime Dependencies * [dotnet/monitor](https://hub.docker.com/r/microsoft/dotnet-monitor/): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://hub.docker.com/r/microsoft/dotnet-aspire-dashboard/): Aspire Dashboard .NET Framework: diff --git a/.portal-docs/docker-hub/README.sdk.md b/.portal-docs/docker-hub/README.sdk.md index ca05e56b50..97d62dad47 100644 --- a/.portal-docs/docker-hub/README.sdk.md +++ b/.portal-docs/docker-hub/README.sdk.md @@ -50,7 +50,6 @@ The [Image Variants documentation](https://github.com/dotnet/dotnet-docker/blob/ * [dotnet/runtime](https://hub.docker.com/r/microsoft/dotnet-runtime/): .NET Runtime * [dotnet/runtime-deps](https://hub.docker.com/r/microsoft/dotnet-runtime-deps/): .NET Runtime Dependencies * [dotnet/monitor](https://hub.docker.com/r/microsoft/dotnet-monitor/): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://hub.docker.com/r/microsoft/dotnet-aspire-dashboard/): Aspire Dashboard * [dotnet/nightly/sdk](https://hub.docker.com/r/microsoft/dotnet-nightly-sdk/): .NET SDK (Preview) * [dotnet/samples](https://hub.docker.com/r/microsoft/dotnet-samples/): .NET Samples diff --git a/.portal-docs/mar/README.aspire-dashboard.portal.md b/.portal-docs/mar/README.aspire-dashboard.portal.md index 6202b665ee..9d1d7a68c8 100644 --- a/.portal-docs/mar/README.aspire-dashboard.portal.md +++ b/.portal-docs/mar/README.aspire-dashboard.portal.md @@ -1,13 +1,13 @@ ## About -This image contains the Aspire Dashboard. +This image contains the [Aspire Dashboard](https://aspire.dev/dashboard/standalone/), a standalone browser-based app for viewing telemetry and run-time information about distributed applications. The source is available in the [microsoft/aspire](https://github.com/microsoft/aspire) repository. Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categories/announcements) for Docker-related .NET announcements. ## Featured Tags * `13` - * `docker pull mcr.microsoft.com/dotnet/aspire-dashboard:13` + * `docker pull mcr.microsoft.com/aspire/dashboard:13` ## Related Repositories @@ -19,7 +19,6 @@ Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categori * [dotnet/runtime](https://mcr.microsoft.com/artifact/mar/dotnet/runtime/about): .NET Runtime * [dotnet/runtime-deps](https://mcr.microsoft.com/artifact/mar/dotnet/runtime-deps/about): .NET Runtime Dependencies * [dotnet/monitor](https://mcr.microsoft.com/artifact/mar/dotnet/monitor/about): .NET Monitor Tool -* [dotnet/nightly/aspire-dashboard](https://mcr.microsoft.com/artifact/mar/dotnet/nightly/aspire-dashboard/about): Aspire Dashboard (Preview) * [dotnet/samples](https://mcr.microsoft.com/artifact/mar/dotnet/samples/about): .NET Samples .NET Framework: @@ -110,7 +109,7 @@ Limits are per-resource. For example, a `MaxLogCount` value of 10,000 configures ### Lifecycle -* [Microsoft Support for .NET](https://github.com/dotnet/core/blob/main/support.md) +* [Microsoft Support for Aspire](https://aspire.dev/support/) * [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md) * [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md) diff --git a/.portal-docs/mar/README.aspnet.portal.md b/.portal-docs/mar/README.aspnet.portal.md index 5f58eeee7e..2229abc08c 100644 --- a/.portal-docs/mar/README.aspnet.portal.md +++ b/.portal-docs/mar/README.aspnet.portal.md @@ -22,7 +22,6 @@ Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categori * [dotnet/runtime](https://mcr.microsoft.com/artifact/mar/dotnet/runtime/about): .NET Runtime * [dotnet/runtime-deps](https://mcr.microsoft.com/artifact/mar/dotnet/runtime-deps/about): .NET Runtime Dependencies * [dotnet/monitor](https://mcr.microsoft.com/artifact/mar/dotnet/monitor/about): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/about): Aspire Dashboard * [dotnet/nightly/aspnet](https://mcr.microsoft.com/artifact/mar/dotnet/nightly/aspnet/about): ASP.NET Core Runtime (Preview) * [dotnet/samples](https://mcr.microsoft.com/artifact/mar/dotnet/samples/about): .NET Samples diff --git a/.portal-docs/mar/README.monitor-base.portal.md b/.portal-docs/mar/README.monitor-base.portal.md index 9657f57a38..0061a63f93 100644 --- a/.portal-docs/mar/README.monitor-base.portal.md +++ b/.portal-docs/mar/README.monitor-base.portal.md @@ -23,7 +23,6 @@ Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categori * [dotnet/runtime](https://mcr.microsoft.com/artifact/mar/dotnet/runtime/about): .NET Runtime * [dotnet/runtime-deps](https://mcr.microsoft.com/artifact/mar/dotnet/runtime-deps/about): .NET Runtime Dependencies * [dotnet/monitor](https://mcr.microsoft.com/artifact/mar/dotnet/monitor/about): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/about): Aspire Dashboard * [dotnet/nightly/monitor/base](https://mcr.microsoft.com/artifact/mar/dotnet/nightly/monitor/base/about): .NET Monitor Base (Preview) * [dotnet/samples](https://mcr.microsoft.com/artifact/mar/dotnet/samples/about): .NET Samples diff --git a/.portal-docs/mar/README.monitor.portal.md b/.portal-docs/mar/README.monitor.portal.md index a9182fb58f..024730150c 100644 --- a/.portal-docs/mar/README.monitor.portal.md +++ b/.portal-docs/mar/README.monitor.portal.md @@ -23,7 +23,6 @@ Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categori * [dotnet/runtime](https://mcr.microsoft.com/artifact/mar/dotnet/runtime/about): .NET Runtime * [dotnet/runtime-deps](https://mcr.microsoft.com/artifact/mar/dotnet/runtime-deps/about): .NET Runtime Dependencies * [dotnet/monitor/base](https://mcr.microsoft.com/artifact/mar/dotnet/monitor/base/about): .NET Monitor Base -* [dotnet/aspire-dashboard](https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/about): Aspire Dashboard * [dotnet/nightly/monitor](https://mcr.microsoft.com/artifact/mar/dotnet/nightly/monitor/about): .NET Monitor Tool (Preview) * [dotnet/samples](https://mcr.microsoft.com/artifact/mar/dotnet/samples/about): .NET Samples diff --git a/.portal-docs/mar/README.runtime-deps.portal.md b/.portal-docs/mar/README.runtime-deps.portal.md index 8dd96deda1..8e35197cf2 100644 --- a/.portal-docs/mar/README.runtime-deps.portal.md +++ b/.portal-docs/mar/README.runtime-deps.portal.md @@ -22,7 +22,6 @@ Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categori * [dotnet/aspnet](https://mcr.microsoft.com/artifact/mar/dotnet/aspnet/about): ASP.NET Core Runtime * [dotnet/runtime](https://mcr.microsoft.com/artifact/mar/dotnet/runtime/about): .NET Runtime * [dotnet/monitor](https://mcr.microsoft.com/artifact/mar/dotnet/monitor/about): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/about): Aspire Dashboard * [dotnet/nightly/runtime-deps](https://mcr.microsoft.com/artifact/mar/dotnet/nightly/runtime-deps/about): .NET Runtime Dependencies (Preview) * [dotnet/samples](https://mcr.microsoft.com/artifact/mar/dotnet/samples/about): .NET Samples diff --git a/.portal-docs/mar/README.runtime.portal.md b/.portal-docs/mar/README.runtime.portal.md index 3428f36e72..caedce3284 100644 --- a/.portal-docs/mar/README.runtime.portal.md +++ b/.portal-docs/mar/README.runtime.portal.md @@ -22,7 +22,6 @@ Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categori * [dotnet/aspnet](https://mcr.microsoft.com/artifact/mar/dotnet/aspnet/about): ASP.NET Core Runtime * [dotnet/runtime-deps](https://mcr.microsoft.com/artifact/mar/dotnet/runtime-deps/about): .NET Runtime Dependencies * [dotnet/monitor](https://mcr.microsoft.com/artifact/mar/dotnet/monitor/about): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/about): Aspire Dashboard * [dotnet/nightly/runtime](https://mcr.microsoft.com/artifact/mar/dotnet/nightly/runtime/about): .NET Runtime (Preview) * [dotnet/samples](https://mcr.microsoft.com/artifact/mar/dotnet/samples/about): .NET Samples diff --git a/.portal-docs/mar/README.samples.portal.md b/.portal-docs/mar/README.samples.portal.md index 12cbdd1e5e..09780f786a 100644 --- a/.portal-docs/mar/README.samples.portal.md +++ b/.portal-docs/mar/README.samples.portal.md @@ -23,7 +23,6 @@ Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categori * [dotnet/runtime](https://mcr.microsoft.com/artifact/mar/dotnet/runtime/about): .NET Runtime * [dotnet/runtime-deps](https://mcr.microsoft.com/artifact/mar/dotnet/runtime-deps/about): .NET Runtime Dependencies * [dotnet/monitor](https://mcr.microsoft.com/artifact/mar/dotnet/monitor/about): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/about): Aspire Dashboard .NET Framework: diff --git a/.portal-docs/mar/README.sdk.portal.md b/.portal-docs/mar/README.sdk.portal.md index f0ee132ad6..33e92296f1 100644 --- a/.portal-docs/mar/README.sdk.portal.md +++ b/.portal-docs/mar/README.sdk.portal.md @@ -28,7 +28,6 @@ Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categori * [dotnet/runtime](https://mcr.microsoft.com/artifact/mar/dotnet/runtime/about): .NET Runtime * [dotnet/runtime-deps](https://mcr.microsoft.com/artifact/mar/dotnet/runtime-deps/about): .NET Runtime Dependencies * [dotnet/monitor](https://mcr.microsoft.com/artifact/mar/dotnet/monitor/about): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/about): Aspire Dashboard * [dotnet/nightly/sdk](https://mcr.microsoft.com/artifact/mar/dotnet/nightly/sdk/about): .NET SDK (Preview) * [dotnet/samples](https://mcr.microsoft.com/artifact/mar/dotnet/samples/about): .NET Samples diff --git a/README.aspire-dashboard.md b/README.aspire-dashboard.md index c838c9e3d4..76b9dd06d3 100644 --- a/README.aspire-dashboard.md +++ b/README.aspire-dashboard.md @@ -3,11 +3,11 @@ ## Featured Tags * `13` - * `docker pull mcr.microsoft.com/dotnet/aspire-dashboard:13` + * `docker pull mcr.microsoft.com/aspire/dashboard:13` ## About -This image contains the Aspire Dashboard. +This image contains the [Aspire Dashboard](https://aspire.dev/dashboard/standalone/), a standalone browser-based app for viewing telemetry and run-time information about distributed applications. The source is available in the [microsoft/aspire](https://github.com/microsoft/aspire) repository. Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categories/announcements) for Docker-related .NET announcements. @@ -100,7 +100,6 @@ Limits are per-resource. For example, a `MaxLogCount` value of 10,000 configures * [dotnet/runtime](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime.md): .NET Runtime * [dotnet/runtime-deps](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime-deps.md): .NET Runtime Dependencies * [dotnet/monitor](https://github.com/dotnet/dotnet-docker/blob/main/README.monitor.md): .NET Monitor Tool -* [dotnet/nightly/aspire-dashboard](https://github.com/dotnet/dotnet-docker/blob/nightly/README.aspire-dashboard.md): Aspire Dashboard (Preview) * [dotnet/samples](https://github.com/dotnet/dotnet-docker/blob/main/README.samples.md): .NET Samples .NET Framework: @@ -124,13 +123,13 @@ Tags | Dockerfile | OS Version -*Tags not listed in the table above are not supported. See the [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md). See the [full list of tags](https://mcr.microsoft.com/v2/dotnet/aspire-dashboard/tags/list) for all supported and unsupported tags.* +*Tags not listed in the table above are not supported. See the [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md). See the [full list of tags](https://mcr.microsoft.com/v2/aspire/dashboard/tags/list) for all supported and unsupported tags.* ## Support ### Lifecycle -* [Microsoft Support for .NET](https://github.com/dotnet/core/blob/main/support.md) +* [Microsoft Support for Aspire](https://aspire.dev/support/) * [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md) * [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md) diff --git a/README.aspnet.md b/README.aspnet.md index 41ee82716b..5b57afaca7 100644 --- a/README.aspnet.md +++ b/README.aspnet.md @@ -67,7 +67,6 @@ For more information, see the [composite images section in the Image Variants do * [dotnet/runtime](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime.md): .NET Runtime * [dotnet/runtime-deps](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime-deps.md): .NET Runtime Dependencies * [dotnet/monitor](https://github.com/dotnet/dotnet-docker/blob/main/README.monitor.md): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md): Aspire Dashboard * [dotnet/nightly/aspnet](https://github.com/dotnet/dotnet-docker/blob/nightly/README.aspnet.md): ASP.NET Core Runtime (Preview) * [dotnet/samples](https://github.com/dotnet/dotnet-docker/blob/main/README.samples.md): .NET Samples diff --git a/README.md b/README.md index 33999c3fde..bac4c5af68 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ * [dotnet/runtime](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime.md): .NET Runtime * [dotnet/runtime-deps](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime-deps.md): .NET Runtime Dependencies * [dotnet/monitor](https://github.com/dotnet/dotnet-docker/blob/main/README.monitor.md): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md): Aspire Dashboard * [dotnet/samples](https://github.com/dotnet/dotnet-docker/blob/main/README.samples.md): .NET Samples ## About @@ -86,7 +85,6 @@ They contain the following features: * [dotnet/nightly/runtime](https://github.com/dotnet/dotnet-docker/blob/nightly/README.runtime.md): .NET Runtime (Preview) * [dotnet/nightly/runtime-deps](https://github.com/dotnet/dotnet-docker/blob/nightly/README.runtime-deps.md): .NET Runtime Dependencies (Preview) * [dotnet/nightly/monitor](https://github.com/dotnet/dotnet-docker/blob/nightly/README.monitor.md): .NET Monitor Tool (Preview) -* [dotnet/nightly/aspire-dashboard](https://github.com/dotnet/dotnet-docker/blob/nightly/README.aspire-dashboard.md): Aspire Dashboard (Preview) .NET Framework: diff --git a/README.monitor-base.md b/README.monitor-base.md index 6be1c2a608..c8b422c37f 100644 --- a/README.monitor-base.md +++ b/README.monitor-base.md @@ -34,7 +34,6 @@ The following Dockerfiles demonstrate how you can use this base image to build a * [dotnet/runtime](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime.md): .NET Runtime * [dotnet/runtime-deps](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime-deps.md): .NET Runtime Dependencies * [dotnet/monitor](https://github.com/dotnet/dotnet-docker/blob/main/README.monitor.md): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md): Aspire Dashboard * [dotnet/nightly/monitor/base](https://github.com/dotnet/dotnet-docker/blob/nightly/README.monitor-base.md): .NET Monitor Base (Preview) * [dotnet/samples](https://github.com/dotnet/dotnet-docker/blob/main/README.samples.md): .NET Samples diff --git a/README.monitor.md b/README.monitor.md index 407f62348b..eb35034a6f 100644 --- a/README.monitor.md +++ b/README.monitor.md @@ -35,7 +35,6 @@ See [documentation](https://go.microsoft.com/fwlink/?linkid=2158052) for how to * [dotnet/runtime](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime.md): .NET Runtime * [dotnet/runtime-deps](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime-deps.md): .NET Runtime Dependencies * [dotnet/monitor/base](https://github.com/dotnet/dotnet-docker/blob/main/README.monitor-base.md): .NET Monitor Base -* [dotnet/aspire-dashboard](https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md): Aspire Dashboard * [dotnet/nightly/monitor](https://github.com/dotnet/dotnet-docker/blob/nightly/README.monitor.md): .NET Monitor Tool (Preview) * [dotnet/samples](https://github.com/dotnet/dotnet-docker/blob/main/README.samples.md): .NET Samples diff --git a/README.runtime-deps.md b/README.runtime-deps.md index c3e212b043..a45135052d 100644 --- a/README.runtime-deps.md +++ b/README.runtime-deps.md @@ -49,7 +49,6 @@ They contain the following features: * [dotnet/aspnet](https://github.com/dotnet/dotnet-docker/blob/main/README.aspnet.md): ASP.NET Core Runtime * [dotnet/runtime](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime.md): .NET Runtime * [dotnet/monitor](https://github.com/dotnet/dotnet-docker/blob/main/README.monitor.md): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md): Aspire Dashboard * [dotnet/nightly/runtime-deps](https://github.com/dotnet/dotnet-docker/blob/nightly/README.runtime-deps.md): .NET Runtime Dependencies (Preview) * [dotnet/samples](https://github.com/dotnet/dotnet-docker/blob/main/README.samples.md): .NET Samples diff --git a/README.runtime.md b/README.runtime.md index 6c238e79f5..6500f9fa13 100644 --- a/README.runtime.md +++ b/README.runtime.md @@ -56,7 +56,6 @@ They contain the following features: * [dotnet/aspnet](https://github.com/dotnet/dotnet-docker/blob/main/README.aspnet.md): ASP.NET Core Runtime * [dotnet/runtime-deps](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime-deps.md): .NET Runtime Dependencies * [dotnet/monitor](https://github.com/dotnet/dotnet-docker/blob/main/README.monitor.md): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md): Aspire Dashboard * [dotnet/nightly/runtime](https://github.com/dotnet/dotnet-docker/blob/nightly/README.runtime.md): .NET Runtime (Preview) * [dotnet/samples](https://github.com/dotnet/dotnet-docker/blob/main/README.samples.md): .NET Samples diff --git a/README.samples.md b/README.samples.md index cdf280aad3..07b62ab0af 100644 --- a/README.samples.md +++ b/README.samples.md @@ -73,7 +73,6 @@ They contain the following features: * [dotnet/runtime](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime.md): .NET Runtime * [dotnet/runtime-deps](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime-deps.md): .NET Runtime Dependencies * [dotnet/monitor](https://github.com/dotnet/dotnet-docker/blob/main/README.monitor.md): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md): Aspire Dashboard .NET Framework: diff --git a/README.sdk.md b/README.sdk.md index f63bdc257c..c99bcbfcdf 100644 --- a/README.sdk.md +++ b/README.sdk.md @@ -52,7 +52,6 @@ The [Image Variants documentation](https://github.com/dotnet/dotnet-docker/blob/ * [dotnet/runtime](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime.md): .NET Runtime * [dotnet/runtime-deps](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime-deps.md): .NET Runtime Dependencies * [dotnet/monitor](https://github.com/dotnet/dotnet-docker/blob/main/README.monitor.md): .NET Monitor Tool -* [dotnet/aspire-dashboard](https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md): Aspire Dashboard * [dotnet/nightly/sdk](https://github.com/dotnet/dotnet-docker/blob/nightly/README.sdk.md): .NET SDK (Preview) * [dotnet/samples](https://github.com/dotnet/dotnet-docker/blob/main/README.samples.md): .NET Samples diff --git a/documentation/image-signatures.md b/documentation/image-signatures.md index 1cf5f8cbc6..837c9092ed 100644 --- a/documentation/image-signatures.md +++ b/documentation/image-signatures.md @@ -91,6 +91,7 @@ for verifying .NET images: { "name": "supplychain", "registryScopes": [ + "mcr.microsoft.com/aspire/dashboard", "mcr.microsoft.com/dotnet/aspire-dashboard", "mcr.microsoft.com/dotnet/aspnet", "mcr.microsoft.com/dotnet/monitor", diff --git a/eng/readme-templates/About.aspire-dashboard.md b/eng/readme-templates/About.aspire-dashboard.md index 767c957485..280212b5ca 100644 --- a/eng/readme-templates/About.aspire-dashboard.md +++ b/eng/readme-templates/About.aspire-dashboard.md @@ -1 +1 @@ -This image contains the Aspire Dashboard. +This image contains the [Aspire Dashboard](https://aspire.dev/dashboard/standalone/), a standalone browser-based app for viewing telemetry and run-time information about distributed applications. The source is available in the [microsoft/aspire](https://github.com/microsoft/aspire) repository. diff --git a/eng/readme-templates/About.md b/eng/readme-templates/About.md index d2e20f9007..d9d2d63231 100644 --- a/eng/readme-templates/About.md +++ b/eng/readme-templates/About.md @@ -4,7 +4,9 @@ readme-host: Moniker of the site that will host the readme ^ set templateQualifier to when(IS_PRODUCT_FAMILY, "product-family", - when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO)) + when(split(REPO, "/")[0] = "aspire", + "aspire-dashboard", + when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO))) }}{{ARGS["top-header"]}} About {{if ARGS["readme-host"] = "mar":{{InsertTemplate("ReposProvider.md", [ diff --git a/eng/readme-templates/Announcement.md b/eng/readme-templates/Announcement.md index bc0d750f82..9a8d2392d8 100644 --- a/eng/readme-templates/Announcement.md +++ b/eng/readme-templates/Announcement.md @@ -11,6 +11,7 @@ }} ^ set nonNightlyRepo to when(IS_PRODUCT_FAMILY, "dotnet", join(split(REPO, "/nightly"), "")) ^ + set announcementFamily to split(nonNightlyRepo, "/")[0] ^ set isNightlyRepo to match(split(REPO, "/")[1], "nightly") ^ set productFamilyRepo to ARGS["product-family-repos"][0][0] ^ set isNightlyOnly to find(map(ARGS["nightly-only-repos"],getRepoName), nonNightlyRepo) >= 0 ^ @@ -21,8 +22,9 @@ }}{{if isNightlyRepo || VARIABLES["branch"] = "nightly" :{{if ARGS["leading-line-break"]: -}}> **Important**: The images from the dotnet/nightly repositories include last-known-good (LKG) builds for the next release of [.NET](https://github.com/dotnet/core). +}}{{if announcementFamily = "aspire":> **Important**: The {{REPO}} image is a preview build of the Aspire Dashboard and is not signed. See [{{nonNightlyRepo}}]({{url}}) for stable releases. +^else:> **Important**: The images from the dotnet/nightly repositories include last-known-good (LKG) builds for the next release of [.NET](https://github.com/dotnet/core). > > See [dotnet]({{url}}) for images with official releases of [.NET](https://github.com/dotnet/core). -{{if ARGS["trailing-line-break"]: +}}{{if ARGS["trailing-line-break"]: }}}} diff --git a/eng/readme-templates/FeaturedTags.md b/eng/readme-templates/FeaturedTags.md index 2f1810e283..e4c210d7dd 100644 --- a/eng/readme-templates/FeaturedTags.md +++ b/eng/readme-templates/FeaturedTags.md @@ -20,7 +20,7 @@ elif match(REPO, "monitor/base"):* `9` (Standard Support) * `docker pull {{FULL_REPO}}:9` * `8` (Long-Term Support) * `docker pull {{FULL_REPO}}:8`^ -elif match(REPO, "aspire-dashboard"):* `13` +elif split(REPO, "/")[0] = "aspire":* `13` * `docker pull {{FULL_REPO}}:13`^ elif match(REPO, "yarp"):* `2.3-preview` * `docker pull {{FULL_REPO}}:2.3-preview`^ diff --git a/eng/readme-templates/Get-GeneratedReadmes.ps1 b/eng/readme-templates/Get-GeneratedReadmes.ps1 index 97248fd9b9..2aa530a1a2 100644 --- a/eng/readme-templates/Get-GeneratedReadmes.ps1 +++ b/eng/readme-templates/Get-GeneratedReadmes.ps1 @@ -34,7 +34,6 @@ $onDockerfilesGenerated = { CopyReadme $ContainerName "README.samples.md" CopyReadme $ContainerName "README.sdk.md" - CopyReadme $ContainerName ".portal-docs/docker-hub/README.aspire-dashboard.md" CopyReadme $ContainerName ".portal-docs/docker-hub/README.aspnet.md" CopyReadme $ContainerName ".portal-docs/docker-hub/README.monitor.md" CopyReadme $ContainerName ".portal-docs/docker-hub/README.monitor-base.md" diff --git a/eng/readme-templates/GitHub.header.md b/eng/readme-templates/GitHub.header.md index 61a496cacd..9ab7e4661c 100644 --- a/eng/readme-templates/GitHub.header.md +++ b/eng/readme-templates/GitHub.header.md @@ -13,6 +13,10 @@ return shortRepo = SHORT_REPO }} ^ - set currentRepo to when(IS_PRODUCT_FAMILY, ARGS["product-family-repos"], cat(filter(repos, isCurrentRepo))) + set currentRepo to when(IS_PRODUCT_FAMILY, + ARGS["product-family-repos"], + when(split(REPO, "/")[0] = "aspire", + [["aspire/dashboard", "Aspire Dashboard"]], + cat(filter(repos, isCurrentRepo)))) }}# {{currentRepo[0][1]}} diff --git a/eng/readme-templates/ReposProvider.md b/eng/readme-templates/ReposProvider.md index 0431b983e0..442aa3ebe5 100644 --- a/eng/readme-templates/ReposProvider.md +++ b/eng/readme-templates/ReposProvider.md @@ -13,8 +13,7 @@ ["dotnet/runtime", ".NET Runtime"], ["dotnet/runtime-deps", ".NET Runtime Dependencies"], ["dotnet/monitor", ".NET Monitor Tool"], - ["dotnet/monitor/base", ".NET Monitor Base"], - ["dotnet/aspire-dashboard", "Aspire Dashboard"] + ["dotnet/monitor/base", ".NET Monitor Base"] ] ^ set nightlyOnlyRepos to [ ["dotnet/yarp", "YARP (Yet Another Reverse Proxy)"] diff --git a/eng/readme-templates/Support.md b/eng/readme-templates/Support.md index 5315bd4ef1..d4768f10f5 100644 --- a/eng/readme-templates/Support.md +++ b/eng/readme-templates/Support.md @@ -5,7 +5,7 @@ set isRuntimeDeps to match(SHORT_REPO, "runtime-deps") ^ set isSamples to match(SHORT_REPO, "samples") ^ set isMonitor to match(SHORT_REPO, "monitor") || match(SHORT_REPO, "base") ^ - set isAspireDashboard to match(SHORT_REPO, "aspire-dashboard") ^ + set isAspireDashboard to split(REPO, "/")[0] = "aspire" ^ set isReverseProxy to match(SHORT_REPO, "yarp") }}{{ARGS["top-header"]}} Support @@ -15,7 +15,7 @@ }}{{ARGS["top-header"]}}# Lifecycle {{if isReverseProxy:* [Microsoft Support for YARP](https://github.com/dotnet/yarp/blob/main/docs/roadmap.md) -}}* [Microsoft Support for .NET](https://github.com/dotnet/core/blob/main/support.md) +}}* [Microsoft Support for {{when(isAspireDashboard, "Aspire", ".NET")}}]({{when(isAspireDashboard, "https://aspire.dev/support/", "https://github.com/dotnet/core/blob/main/support.md")}}) * [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md) * [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md) diff --git a/eng/readme-templates/Url.md b/eng/readme-templates/Url.md index e5af2b8ba7..b8174853c3 100644 --- a/eng/readme-templates/Url.md +++ b/eng/readme-templates/Url.md @@ -15,7 +15,13 @@ set isFrameworkRepo to match(repoParts[1], "framework") ^ set readmeFileName to cat( "README.", - when(isProductFamily, "", cat(join(slice(repoParts, when(isNightlyRepo || isFrameworkRepo, 2, 1)), "-"), ".")), + when(isProductFamily, + "", + cat( + when(repoParts[0] = "aspire", + "aspire-dashboard", + join(slice(repoParts, when(isNightlyRepo || isFrameworkRepo, 2, 1)), "-")), + ".")), "md") }}{{ diff --git a/eng/readme-templates/Use.md b/eng/readme-templates/Use.md index ead99901ab..a0983080a8 100644 --- a/eng/readme-templates/Use.md +++ b/eng/readme-templates/Use.md @@ -4,7 +4,9 @@ readme-host: Moniker of the site that will host the readme ^ set templateQualifier to when(IS_PRODUCT_FAMILY, "samples", - when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO)) + when(split(REPO, "/")[0] = "aspire", + "aspire-dashboard", + when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO))) }}{{ARGS["top-header"]}} Usage {{ _ Special case while aspire-dashboard image doesn't have any samples. Remove when https://github.com/dotnet/dotnet-docker/issues/5335 is resolved. ^ if templateQualifier != "aspire-dashboard": diff --git a/manifest.json b/manifest.json index 215c1c5d13..dbf4f108f2 100644 --- a/manifest.json +++ b/manifest.json @@ -5,6 +5,7 @@ }, "registry": "mcr.microsoft.com", "variables": { + "syndicatedAspireDashboardRepo": "dotnet/aspire-dashboard", "syndicatedRuntimeDepsRepo": "dotnet/core/runtime-deps", "syndicatedRuntimeRepo": "dotnet/core/runtime", "syndicatedAspnetRepo": "dotnet/core/aspnet", @@ -14196,16 +14197,12 @@ }, { "id": "aspire-dashboard", - "name": "dotnet/aspire-dashboard", + "name": "aspire/dashboard", "readmes": [ { "path": "README.aspire-dashboard.md", "templatePath": "eng/readme-templates/README.github.md" }, - { - "path": ".portal-docs/docker-hub/README.aspire-dashboard.md", - "templatePath": "eng/readme-templates/README.dockerhub.md" - }, { "path": ".portal-docs/mar/README.aspire-dashboard.portal.md", "templatePath": "eng/readme-templates/README.mcr.md" @@ -14216,9 +14213,25 @@ { "productVersion": "$(aspire-dashboard|product-version)", "sharedTags": { - "$(aspire-dashboard|fixed-tag)": {}, - "$(aspire-dashboard|minor-tag)": {}, - "$(aspire-dashboard|major-tag)": {}, + "$(aspire-dashboard|fixed-tag)": { + "syndication": { + "repo": "$(syndicatedAspireDashboardRepo)" + } + }, + "$(aspire-dashboard|minor-tag)": { + "syndication": { + "repo": "$(syndicatedAspireDashboardRepo)" + } + }, + "$(aspire-dashboard|major-tag)": { + "syndication": { + "repo": "$(syndicatedAspireDashboardRepo)", + "destinationTags": [ + "$(aspire-dashboard|major-tag)", + "latest" + ] + } + }, "latest": {} }, "platforms": [ @@ -14232,13 +14245,22 @@ "osVersion": "azurelinux3.0-distroless", "tags": { "$(aspire-dashboard|fixed-tag)-amd64": { - "docType": "Undocumented" + "docType": "Undocumented", + "syndication": { + "repo": "$(syndicatedAspireDashboardRepo)" + } }, "$(aspire-dashboard|minor-tag)-amd64": { - "docType": "Undocumented" + "docType": "Undocumented", + "syndication": { + "repo": "$(syndicatedAspireDashboardRepo)" + } }, "$(aspire-dashboard|major-tag)-amd64": { - "docType": "Undocumented" + "docType": "Undocumented", + "syndication": { + "repo": "$(syndicatedAspireDashboardRepo)" + } } } }, @@ -14253,13 +14275,22 @@ "osVersion": "azurelinux3.0-distroless", "tags": { "$(aspire-dashboard|fixed-tag)-arm64v8": { - "docType": "Undocumented" + "docType": "Undocumented", + "syndication": { + "repo": "$(syndicatedAspireDashboardRepo)" + } }, "$(aspire-dashboard|minor-tag)-arm64v8": { - "docType": "Undocumented" + "docType": "Undocumented", + "syndication": { + "repo": "$(syndicatedAspireDashboardRepo)" + } }, "$(aspire-dashboard|major-tag)-arm64v8": { - "docType": "Undocumented" + "docType": "Undocumented", + "syndication": { + "repo": "$(syndicatedAspireDashboardRepo)" + } } }, "variant": "v8" diff --git a/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs b/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs new file mode 100644 index 0000000000..a7b571bfd2 --- /dev/null +++ b/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs @@ -0,0 +1,135 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using Newtonsoft.Json.Linq; +using Xunit; + +#nullable enable + +namespace Microsoft.DotNet.Docker.Tests; + +[Trait("Category", "pre-build")] +public sealed class AspireDashboardManifestTests +{ + private const string AspireDashboardId = "aspire-dashboard"; + private const string SyndicatedRepoVariable = "$(syndicatedAspireDashboardRepo)"; + + [Theory] + [InlineData("", "aspire/dashboard")] + [InlineData("/nightly", "aspire/nightly/dashboard")] + public void RepoName_UsesAspireProductFamily(string repoNameModifier, string expectedRepoName) + { + Assert.Equal(expectedRepoName, ImageData.GetRepoName(AspireDashboardId, repoNameModifier)); + } + + [Fact] + public void Manifest_UsesCanonicalRepoName() + { + string branch = Config.GetVariableValue("branch"); + string repoNameModifier = branch == "nightly" ? "/nightly" : string.Empty; + + Assert.Equal( + ImageData.GetRepoName(AspireDashboardId, repoNameModifier), + GetAspireDashboardRepo().Value("name")); + } + + [Fact] + public void LegacySyndication_IsLimitedToAspire13() + { + int majorVersion = int.Parse(Config.GetVariableValue("aspire-dashboard|major-tag")); + JObject aspireDashboardRepo = GetAspireDashboardRepo(); + List<(string Tag, string Repo)> syndications = GetSyndications(aspireDashboardRepo).ToList(); + + if (majorVersion != 13) + { + Assert.Empty(syndications); + return; + } + + string branch = Config.GetVariableValue("branch"); + string expectedLegacyRepo = branch == "nightly" + ? "dotnet/nightly/aspire-dashboard" + : "dotnet/aspire-dashboard"; + + Assert.Equal( + expectedLegacyRepo, + Config.Manifest.Value["variables"]?["syndicatedAspireDashboardRepo"]?.Value()); + Assert.All(syndications, syndication => Assert.Equal(SyndicatedRepoVariable, syndication.Repo)); + + string fixedTag = Config.GetVariableValue("aspire-dashboard|fixed-tag"); + string minorTag = Config.GetVariableValue("aspire-dashboard|minor-tag"); + string majorTag = Config.GetVariableValue("aspire-dashboard|major-tag"); + JObject sharedTags = (JObject)aspireDashboardRepo["images"]!.Single()["sharedTags"]!; + Assert.Equal( + [majorTag, "latest"], + sharedTags["$(aspire-dashboard|major-tag)"]!["syndication"]!["destinationTags"]! + .Values() + .Select(destinationTag => ResolveTag(destinationTag!))); + Assert.Null(sharedTags["latest"]!["syndication"]); + + HashSet expectedTags = + [ + fixedTag, + minorTag, + majorTag, + "latest", + $"{fixedTag}-amd64", + $"{minorTag}-amd64", + $"{majorTag}-amd64", + $"{fixedTag}-arm64v8", + $"{minorTag}-arm64v8", + $"{majorTag}-arm64v8" + ]; + + Assert.Equal(expectedTags.Count, syndications.Count); + Assert.True( + expectedTags.SetEquals(syndications.Select(syndication => syndication.Tag)), + $"Expected syndication for: {string.Join(", ", expectedTags.Order())}"); + } + + private static JObject GetAspireDashboardRepo() => + Config.Manifest.Value["repos"]! + .Children() + .Single(repo => repo.Value("id") == AspireDashboardId); + + private static IEnumerable<(string Tag, string Repo)> GetSyndications(JObject repo) + { + foreach (JObject image in repo["images"]!.Children()) + { + IEnumerable tagGroups = + [ + (JObject)image["sharedTags"]!, + .. image["platforms"]! + .Children() + .Select(platform => (JObject)platform["tags"]!) + ]; + + foreach (JProperty tag in tagGroups.SelectMany(tagGroup => tagGroup.Properties())) + { + JToken? syndication = tag.Value["syndication"]; + string? syndicatedRepo = syndication?["repo"]?.Value(); + if (syndicatedRepo is not null) + { + IEnumerable destinationTags = syndication!["destinationTags"] is JArray configuredDestinationTags + ? configuredDestinationTags.Values().Select(destinationTag => destinationTag!) + : [tag.Name]; + + foreach (string destinationTag in destinationTags) + { + yield return (ResolveTag(destinationTag), syndicatedRepo); + } + } + } + } + } + + private static string ResolveTag(string tag) => + Regex.Replace( + tag, + @"\$\((?[\w:\-.|]+)\)", + match => Config.GetVariableValue(match.Groups["variable"].Value)); +} diff --git a/tests/Microsoft.DotNet.Docker.Tests/ImageData.cs b/tests/Microsoft.DotNet.Docker.Tests/ImageData.cs index 9dedc1e7a9..2e6fd768dc 100644 --- a/tests/Microsoft.DotNet.Docker.Tests/ImageData.cs +++ b/tests/Microsoft.DotNet.Docker.Tests/ImageData.cs @@ -143,7 +143,9 @@ public static string GetImageName(string tag, string repoName, string repoNameMo } public static string GetRepoName(string repoName, string repoNameModifier = null) => - $"dotnet{repoNameModifier ?? GetRepoNameModifier()}/{repoName}"; + repoName == "aspire-dashboard" + ? $"aspire{repoNameModifier ?? GetRepoNameModifier()}/dashboard" + : $"dotnet{repoNameModifier ?? GetRepoNameModifier()}/{repoName}"; protected string GetTagName(string tagPrefix, string os, string tagPostfix = null) { diff --git a/tests/Microsoft.DotNet.Docker.Tests/Manifest.cs b/tests/Microsoft.DotNet.Docker.Tests/Manifest.cs index 3fccb3ddf2..e946cb17f5 100644 --- a/tests/Microsoft.DotNet.Docker.Tests/Manifest.cs +++ b/tests/Microsoft.DotNet.Docker.Tests/Manifest.cs @@ -15,6 +15,7 @@ public class Manifest public class Repo { + public string Id { get; set; } = string.Empty; public string Name { get; set; } = string.Empty; public List Images { get; set; } = new List(); } diff --git a/tests/Microsoft.DotNet.Docker.Tests/StaticTagTests.cs b/tests/Microsoft.DotNet.Docker.Tests/StaticTagTests.cs index 8a0da029a8..2d52902c4b 100644 --- a/tests/Microsoft.DotNet.Docker.Tests/StaticTagTests.cs +++ b/tests/Microsoft.DotNet.Docker.Tests/StaticTagTests.cs @@ -32,7 +32,7 @@ public enum VersionType private const string SingleNumberRegex = @"\d+"; private const string MajorVersionRegex = SingleNumberRegex; private const string MajorMinorVersionRegex = @$"{SingleNumberRegex}\.{SingleNumberRegex}"; - private static readonly string[] ApplianceRepos = + private static readonly string[] ApplianceRepoIds = [ "monitor", "monitor-base", @@ -294,7 +294,7 @@ private static IEnumerable GetTagTestObjects(TestType testType) break; case TestType.Platform: - if (ApplianceRepos.Any(repo.Name.Contains)) + if (ApplianceRepoIds.Contains(repo.Id)) { // Only appliance repos have major version tags // Only appliance repos have floating distro tags () @@ -428,7 +428,7 @@ private static IEnumerable GetTagTestObjects(TestType testType) break; case TestType.FloatingAlpine: - if (ApplianceRepos.Any(repo.Name.Contains)) + if (ApplianceRepoIds.Contains(repo.Id)) { // Only appliance repos have major version alpine floating tags // Only appliance repos have major.minor.patch alpine floating tags @@ -482,7 +482,7 @@ private static IEnumerable GetTagTestObjects(TestType testType) break; case TestType.Version: - if (ApplianceRepos.Any(repo.Name.Contains)) + if (ApplianceRepoIds.Contains(repo.Id)) { // Only appliance repos have major version tags testObjects.Add(GetTagTestInput( From f605011afe2d4f2ee45233cfc5b5d7155bdafa22 Mon Sep 17 00:00:00 2001 From: Logan Bussell Date: Tue, 22 Sep 2026 09:46:46 -0700 Subject: [PATCH 2/5] Fix Aspire Dashboard MCR documentation filenames (#7364) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: a9c2f018-e355-4c72-a926-1bd8c8009611 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b8c2a84d-ea5c-4c33-af40-3734a5cc3b24 --- ...{README.aspire-dashboard.portal.md => README.dashboard.md} | 0 .../{aspire-dashboard-tags.yml => dashboard-tags.yml} | 0 eng/readme-templates/Get-GeneratedReadmes.ps1 | 2 +- manifest.json | 4 ++-- 4 files changed, 3 insertions(+), 3 deletions(-) rename .portal-docs/mar/{README.aspire-dashboard.portal.md => README.dashboard.md} (100%) rename eng/mcr-tags-metadata-templates/{aspire-dashboard-tags.yml => dashboard-tags.yml} (100%) diff --git a/.portal-docs/mar/README.aspire-dashboard.portal.md b/.portal-docs/mar/README.dashboard.md similarity index 100% rename from .portal-docs/mar/README.aspire-dashboard.portal.md rename to .portal-docs/mar/README.dashboard.md diff --git a/eng/mcr-tags-metadata-templates/aspire-dashboard-tags.yml b/eng/mcr-tags-metadata-templates/dashboard-tags.yml similarity index 100% rename from eng/mcr-tags-metadata-templates/aspire-dashboard-tags.yml rename to eng/mcr-tags-metadata-templates/dashboard-tags.yml diff --git a/eng/readme-templates/Get-GeneratedReadmes.ps1 b/eng/readme-templates/Get-GeneratedReadmes.ps1 index 2aa530a1a2..664ad95f11 100644 --- a/eng/readme-templates/Get-GeneratedReadmes.ps1 +++ b/eng/readme-templates/Get-GeneratedReadmes.ps1 @@ -42,7 +42,7 @@ $onDockerfilesGenerated = { CopyReadme $ContainerName ".portal-docs/docker-hub/README.samples.md" CopyReadme $ContainerName ".portal-docs/docker-hub/README.sdk.md" - CopyReadme $ContainerName ".portal-docs/mar/README.aspire-dashboard.portal.md" + CopyReadme $ContainerName ".portal-docs/mar/README.dashboard.md" CopyReadme $ContainerName ".portal-docs/mar/README.aspnet.portal.md" CopyReadme $ContainerName ".portal-docs/mar/README.monitor.portal.md" CopyReadme $ContainerName ".portal-docs/mar/README.monitor-base.portal.md" diff --git a/manifest.json b/manifest.json index dbf4f108f2..06a8d5ba29 100644 --- a/manifest.json +++ b/manifest.json @@ -14204,11 +14204,11 @@ "templatePath": "eng/readme-templates/README.github.md" }, { - "path": ".portal-docs/mar/README.aspire-dashboard.portal.md", + "path": ".portal-docs/mar/README.dashboard.md", "templatePath": "eng/readme-templates/README.mcr.md" } ], - "mcrTagsMetadataTemplate": "eng/mcr-tags-metadata-templates/aspire-dashboard-tags.yml", + "mcrTagsMetadataTemplate": "eng/mcr-tags-metadata-templates/dashboard-tags.yml", "images": [ { "productVersion": "$(aspire-dashboard|product-version)", From 7789159859fe97af2e993f7a1dd202728f8bf7b4 Mon Sep 17 00:00:00 2001 From: Logan Bussell Date: Thu, 24 Sep 2026 14:43:13 -0700 Subject: [PATCH 3/5] Fix Aspire Dashboard MCR portal README filename (#7377) Copilot-Session: 8f1e4b02-90fe-4883-a622-8b837c074149 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b8c2a84d-ea5c-4c33-af40-3734a5cc3b24 --- .../mar/{README.dashboard.md => README.dashboard.portal.md} | 0 eng/readme-templates/Get-GeneratedReadmes.ps1 | 2 +- manifest.json | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename .portal-docs/mar/{README.dashboard.md => README.dashboard.portal.md} (100%) diff --git a/.portal-docs/mar/README.dashboard.md b/.portal-docs/mar/README.dashboard.portal.md similarity index 100% rename from .portal-docs/mar/README.dashboard.md rename to .portal-docs/mar/README.dashboard.portal.md diff --git a/eng/readme-templates/Get-GeneratedReadmes.ps1 b/eng/readme-templates/Get-GeneratedReadmes.ps1 index 664ad95f11..4c4920bb73 100644 --- a/eng/readme-templates/Get-GeneratedReadmes.ps1 +++ b/eng/readme-templates/Get-GeneratedReadmes.ps1 @@ -42,7 +42,7 @@ $onDockerfilesGenerated = { CopyReadme $ContainerName ".portal-docs/docker-hub/README.samples.md" CopyReadme $ContainerName ".portal-docs/docker-hub/README.sdk.md" - CopyReadme $ContainerName ".portal-docs/mar/README.dashboard.md" + CopyReadme $ContainerName ".portal-docs/mar/README.dashboard.portal.md" CopyReadme $ContainerName ".portal-docs/mar/README.aspnet.portal.md" CopyReadme $ContainerName ".portal-docs/mar/README.monitor.portal.md" CopyReadme $ContainerName ".portal-docs/mar/README.monitor-base.portal.md" diff --git a/manifest.json b/manifest.json index 06a8d5ba29..7b100350e7 100644 --- a/manifest.json +++ b/manifest.json @@ -14204,7 +14204,7 @@ "templatePath": "eng/readme-templates/README.github.md" }, { - "path": ".portal-docs/mar/README.dashboard.md", + "path": ".portal-docs/mar/README.dashboard.portal.md", "templatePath": "eng/readme-templates/README.mcr.md" } ], From d2069813339c30ba6fa40b5cb360b420654d9d71 Mon Sep 17 00:00:00 2001 From: David Pine Date: Thu, 8 Oct 2026 11:39:02 -0500 Subject: [PATCH 4/5] Update Aspire Dashboard documentation (#7379) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Co-authored-by: Logan Bussell Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com> Copilot-Session: e6169d07-d76f-4cde-8f8a-e6ece5f5fbec Copilot-Session: 4a5e1075-75e2-4664-9367-27ad01499735 Copilot-Session: c8655a27-1c77-4c4b-ad38-7ce0b4f15e77 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b8c2a84d-ea5c-4c33-af40-3734a5cc3b24 --- .portal-docs/docker-hub/README.aspnet.md | 4 +- .portal-docs/docker-hub/README.runtime.md | 4 +- .portal-docs/docker-hub/README.samples.md | 4 +- .portal-docs/docker-hub/README.sdk.md | 4 +- .portal-docs/mar/README.aspnet.portal.md | 4 +- .portal-docs/mar/README.dashboard.portal.md | 141 ++++-------------- .portal-docs/mar/README.runtime.portal.md | 4 +- .portal-docs/mar/README.samples.portal.md | 4 +- .portal-docs/mar/README.sdk.portal.md | 4 +- README.aspire-dashboard.md | 139 ++++------------- README.aspnet.md | 4 +- README.md | 4 +- README.runtime.md | 4 +- README.samples.md | 4 +- README.sdk.md | 4 +- .../About.aspire-dashboard.md | 1 - eng/readme-templates/About.md | 4 +- eng/readme-templates/About.variants.md | 2 +- eng/readme-templates/Announcement.md | 6 +- eng/readme-templates/DefaultLayout.md | 3 +- eng/readme-templates/FeaturedTags.md | 2 - eng/readme-templates/GitHub.header.md | 4 +- .../README.aspire-dashboard.github.md | 1 + .../README.aspire-dashboard.mcr.md | 1 + .../README.aspire-dashboard.md | 92 ++++++++++++ eng/readme-templates/README.mcr.md | 2 +- eng/readme-templates/Support.md | 9 +- eng/readme-templates/Url.md | 4 +- eng/readme-templates/Use.aspire-dashboard.md | 80 ---------- eng/readme-templates/Use.md | 9 +- manifest.json | 4 +- .../AspireDashboardManifestTests.cs | 19 +++ 32 files changed, 219 insertions(+), 356 deletions(-) delete mode 100644 eng/readme-templates/About.aspire-dashboard.md create mode 100644 eng/readme-templates/README.aspire-dashboard.github.md create mode 100644 eng/readme-templates/README.aspire-dashboard.mcr.md create mode 100644 eng/readme-templates/README.aspire-dashboard.md delete mode 100644 eng/readme-templates/Use.aspire-dashboard.md diff --git a/.portal-docs/docker-hub/README.aspnet.md b/.portal-docs/docker-hub/README.aspnet.md index f2313b3fef..44c77ac2c6 100644 --- a/.portal-docs/docker-hub/README.aspnet.md +++ b/.portal-docs/docker-hub/README.aspnet.md @@ -113,5 +113,5 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) -* [Windows base image license](https://docs.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) -* [Pricing and licensing for Windows Server](https://www.microsoft.com/cloud-platform/windows-server-pricing) +* [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) +* [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing) diff --git a/.portal-docs/docker-hub/README.runtime.md b/.portal-docs/docker-hub/README.runtime.md index 962ffe6117..6b1bece74c 100644 --- a/.portal-docs/docker-hub/README.runtime.md +++ b/.portal-docs/docker-hub/README.runtime.md @@ -102,5 +102,5 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) -* [Windows base image license](https://docs.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) -* [Pricing and licensing for Windows Server](https://www.microsoft.com/cloud-platform/windows-server-pricing) +* [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) +* [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing) diff --git a/.portal-docs/docker-hub/README.samples.md b/.portal-docs/docker-hub/README.samples.md index 8629450062..7df2a38986 100644 --- a/.portal-docs/docker-hub/README.samples.md +++ b/.portal-docs/docker-hub/README.samples.md @@ -119,5 +119,5 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) -* [Windows base image license](https://docs.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) -* [Pricing and licensing for Windows Server](https://www.microsoft.com/cloud-platform/windows-server-pricing) +* [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) +* [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing) diff --git a/.portal-docs/docker-hub/README.sdk.md b/.portal-docs/docker-hub/README.sdk.md index 97d62dad47..8b6558615c 100644 --- a/.portal-docs/docker-hub/README.sdk.md +++ b/.portal-docs/docker-hub/README.sdk.md @@ -98,5 +98,5 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) -* [Windows base image license](https://docs.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) -* [Pricing and licensing for Windows Server](https://www.microsoft.com/cloud-platform/windows-server-pricing) +* [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) +* [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing) diff --git a/.portal-docs/mar/README.aspnet.portal.md b/.portal-docs/mar/README.aspnet.portal.md index 2229abc08c..aa2e36851b 100644 --- a/.portal-docs/mar/README.aspnet.portal.md +++ b/.portal-docs/mar/README.aspnet.portal.md @@ -109,5 +109,5 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) -* [Windows base image license](https://docs.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) -* [Pricing and licensing for Windows Server](https://www.microsoft.com/cloud-platform/windows-server-pricing) +* [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) +* [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing) diff --git a/.portal-docs/mar/README.dashboard.portal.md b/.portal-docs/mar/README.dashboard.portal.md index 9d1d7a68c8..56ff3f447f 100644 --- a/.portal-docs/mar/README.dashboard.portal.md +++ b/.portal-docs/mar/README.dashboard.portal.md @@ -1,143 +1,66 @@ -## About - -This image contains the [Aspire Dashboard](https://aspire.dev/dashboard/standalone/), a standalone browser-based app for viewing telemetry and run-time information about distributed applications. The source is available in the [microsoft/aspire](https://github.com/microsoft/aspire) repository. - -Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categories/announcements) for Docker-related .NET announcements. - ## Featured Tags * `13` * `docker pull mcr.microsoft.com/aspire/dashboard:13` -## Related Repositories - -.NET: - -* [dotnet](https://mcr.microsoft.com/catalog?search=dotnet): .NET -* [dotnet/sdk](https://mcr.microsoft.com/artifact/mar/dotnet/sdk/about): .NET SDK -* [dotnet/aspnet](https://mcr.microsoft.com/artifact/mar/dotnet/aspnet/about): ASP.NET Core Runtime -* [dotnet/runtime](https://mcr.microsoft.com/artifact/mar/dotnet/runtime/about): .NET Runtime -* [dotnet/runtime-deps](https://mcr.microsoft.com/artifact/mar/dotnet/runtime-deps/about): .NET Runtime Dependencies -* [dotnet/monitor](https://mcr.microsoft.com/artifact/mar/dotnet/monitor/about): .NET Monitor Tool -* [dotnet/samples](https://mcr.microsoft.com/artifact/mar/dotnet/samples/about): .NET Samples +## About -.NET Framework: +The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). -* [dotnet/framework](https://mcr.microsoft.com/catalog?search=dotnet/framework): .NET Framework, ASP.NET and WCF -* [dotnet/framework/samples](https://mcr.microsoft.com/artifact/mar/dotnet/framework/samples/about): .NET Framework, ASP.NET and WCF Samples +For preview builds, see the [nightly Aspire Dashboard image](https://mcr.microsoft.com/artifact/mar/aspire/nightly/dashboard/about). ## Usage -The Aspire Dashboard is a browser-based app to view run-time information about your distributed application. - -The dashboard shows: - -* Resources that make up your app, such as .NET projects, executables and containers. -* Live console logs of resources. -* Live telemetry, such as structured logs, traces and metrics. - -### Configuration - -The dashboard must be configured when it is started. The configuration is done via environment variables. The following environment variables are supported: - -* `ASPNETCORE_URLS` specifies one or more HTTP endpoints through which the dashboard frontend is served. The frontend endpoint is used to view the dashboard in a browser. Defaults to `http://localhost:18888`. -* `DOTNET_DASHBOARD_OTLP_ENDPOINT_URL` specifies the [OTLP/gRPC](https://opentelemetry.io/docs/specs/otlp/#otlpgrpc) endpoint. This endpoint hosts an OTLP service and receives telemetry using gRPC. When the dashboard is launched by the Aspire app host this address is secured with HTTPS. Securing the dashboard with HTTPS is recommended. Defaults to `http://localhost:18889`. -* `DOTNET_DASHBOARD_OTLP_HTTP_ENDPOINT_URL` specifies the [OTLP/HTTP](https://opentelemetry.io/docs/specs/otlp/#otlphttp) endpoint. This endpoint hosts an OTLP service and receives telemetry using Protobuf over HTTP. Defaults to `http://localhost:18890`. -* `ASPIRE_DASHBOARD_MCP_ENDPOINT_URL` specifies the Aspire MCP endpoint. When this value isn't specified then the MCP server is hosted with an `ASPNETCORE_URLS` endpoint. The MCP server can be disabled by configuring `Dashboard:Mcp:Disabled` to `true`. Defaults to `http://localhost:18891`. -* `DOTNET_DASHBOARD_UNSECURED_ALLOW_ANONYMOUS` specifies the dashboard doesn't use authentication and accepts anonymous access. This setting is a shortcut to configuring `Dashboard:Frontend:AuthMode`, `Dashboard:Otlp:AuthMode` and `Dashboard:Mcp:AuthMode` to `Unsecured`. -* `DOTNET_DASHBOARD_CONFIG_FILE_PATH` specifies the path for an optional JSON configuration file. - -#### Frontend authentication - -The dashboard's frontend supports OpenID Connect (OIDC). Set `Dashboard__Frontend__AuthMode` to `OpenIdConnect`, then add the following configuration: +Run the dashboard locally: -* `Authentication__Schemes__OpenIdConnect__Authority` — URL to the identity provider (IdP) -* `Authentication__Schemes__OpenIdConnect__ClientId` — Identity of the relying party (RP) -* `Authentication__Schemes__OpenIdConnect__ClientSecret`— A secret that only the real RP would know -* Other properties of [`OpenIdConnectOptions`](https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.builder.openidconnectoptions) specified in configuration container `Authentication__Schemes__OpenIdConnect__*` +```console +docker run --rm -d --name aspire-dashboard -p 127.0.0.1:18888:18888 -p 127.0.0.1:4317:18889 -p 127.0.0.1:4318:18890 mcr.microsoft.com/aspire/dashboard:13 +``` -It may also be run unsecured. Set `Dashboard__Frontend__AuthMode` to `Unsecured`. The frontend endpoint will allow anonymous access. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. +Open `http://localhost:18888`. To sign in, use the login URL or token printed in the container logs: -### OTLP authentication +```console +docker logs aspire-dashboard +``` -The OTLP endpoint can be secured with [client certificate](https://learn.microsoft.com/aspnet/core/security/authentication/certauth) or API key authentication. +This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure HTTPS, authentication, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). -For client certification authentication, set `Dashboard__Otlp__AuthMode` to `Certificate`. +### Send telemetry -For API key authentication, set `Dashboard__Otlp__AuthMode` to `ApiKey`, then add the following configuration: +Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter with the matching protocol and endpoint. Starting the dashboard does not instrument your application automatically. For applications running on the host, use: -* `Dashboard__Otlp__PrimaryApiKey` specifies the primary API key. (required, string) -* `Dashboard__Otlp__SecondaryApiKey` specifies the secondary API key. (optional, string) +* OTLP/gRPC: `http://localhost:4317` (mapped to container port `18889`). +* OTLP/HTTP: `http://localhost:4318` (mapped to container port `18890`). -It may also be run unsecured. Set `Dashboard__Otlp__AuthMode` to `Unsecured`. The OTLP endpoint will allow anonymous access. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. +For applications in other containers, use the dashboard container's name and port (`18889` or `18890`) on a shared Docker network, not their own `localhost`. -### Resources +### Operational notes -* `Dashboard__ResourceServiceClient__Url` specifies the gRPC endpoint to which the dashboard connects for its data. There's no default. If this variable is unspecified, the dashboard shows OTEL data but no resource list or console logs. +* Telemetry is stored in memory with configurable limits and is lost when the dashboard restarts. The dashboard is intended for development and short-term diagnostics, not durable telemetry storage. +* Standalone mode displays telemetry without an AppHost. Resource listings and captured console logs require a configured [resource service](https://aspire.dev/dashboard/configuration/#resources). -The resource service client supports certificates. Set `Dashboard__ResourceServiceClient__AuthMode` to `Certificate`, then add the following configuration: +### Documentation and examples -* `Dashboard__ResourceServiceClient__ClientCertificate__Source` (required) one of: - * `File` to load the cert from a file path, configured with: - * `Dashboard__ResourceServiceClient__ClientCertificate__FilePath` (required, string) - * `Dashboard__ResourceServiceClient__ClientCertificate__Password` (optional, string) - * `KeyStore` to load the cert from a key store, configured with: - * `Dashboard__ResourceServiceClient__ClientCertificate__Subject` (required, string) - * `Dashboard__ResourceServiceClient__ClientCertificate__Store` (optional, [`StoreName`](https://learn.microsoft.com/dotnet/api/system.security.cryptography.x509certificates.storename), defaults to `My`) - * `Dashboard__ResourceServiceClient__ClientCertificate__Location` (optional, [`StoreLocation`](https://learn.microsoft.com/dotnet/api/system.security.cryptography.x509certificates.storelocation), defaults to `CurrentUser`) - -To opt-out of authentication, set `Dashboard__ResourceServiceClient__AuthMode` to `Unsecured`. This completely disables all security for the resource service client. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. - -#### Telemetry Limits - -Telemetry is stored in-memory. To avoid excessive memory usage, the dashboard has limits on the count and size of stored telemetry. When a count limit is reached, new telemetry is added, and the oldest telemetry is removed. When a size limit is reached, data is truncated to the limit. - -* `Dashboard__TelemetryLimits__MaxLogCount` specifies the maximum number of log entries. Defaults to 10,000. -* `Dashboard__TelemetryLimits__MaxTraceCount` specifies the maximum number of traces. Defaults to 10,000. -* `Dashboard__TelemetryLimits__MaxMetricsCount` specifies the maximum number of metric data points. Defaults to 50,000. -* `Dashboard__TelemetryLimits__MaxAttributeCount` specifies the maximum number of attributes on telemetry. Defaults to 128. -* `Dashboard__TelemetryLimits__MaxAttributeLength` specifies the maximum length of attributes. Defaults to unlimited. -* `Dashboard__TelemetryLimits__MaxSpanEventCount` specifies the maximum number of events on span attributes. Defaults to unlimited. - -Limits are per-resource. For example, a `MaxLogCount` value of 10,000 configures the dashboard to store up to 10,000 log entries per-resource. - -### Other - -* `Dashboard__ApplicationName` specifies the application name to be displayed in the UI. This applies only when no resource service URL is specified. When a resource service exists, the service specifies the application name. +* [Run the standalone dashboard](https://aspire.dev/dashboard/standalone/). +* [Python telemetry tutorial](https://aspire.dev/dashboard/standalone-for-python/). +* [JavaScript and Node.js telemetry tutorial](https://aspire.dev/dashboard/standalone-for-nodejs/). +* [Standalone dashboard sample (C#)](https://github.com/microsoft/aspire-samples/tree/main/samples/standalone-dashboard). +* [Dashboard configuration reference](https://aspire.dev/dashboard/configuration/). ## Support -### Lifecycle - -* [Microsoft Support for Aspire](https://aspire.dev/support/) -* [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md) -* [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md) - -### Image Update Policy - -* **Base Image Updates:** Images are re-built within 12 hours of any updates to their base images (e.g. debian:bookworm-slim, windows/nanoserver:ltsc2022, etc.). -* **.NET Releases:** Images are re-built as part of releasing new .NET versions. This includes new major versions, minor versions, and servicing releases. -* **Critical CVEs:** Images are re-built to pick up critical CVE fixes as described by the CVE Update Policy below. -* **Monthly Re-builds:** Images are re-built monthly, typically on the second Tuesday of the month, in order to pick up lower-severity CVE fixes. -* **Out-Of-Band Updates:** Images can sometimes be re-built when out-of-band updates are necessary to address critical issues. If this happens, new fixed version tags will be updated according to the [Fixed version tags documentation](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md#fixed-version-tags). - -#### CVE Update Policy - -.NET container images are regularly monitored for the presence of CVEs. A given image will be rebuilt to pick up fixes for a CVE when: - -* We detect the image contains a CVE with a [CVSS](https://nvd.nist.gov/vuln-metrics/cvss) score of "Critical" -* **AND** the CVE is in a package that is added in our Dockerfile layers (meaning the CVE is in a package we explicitly install or any transitive dependencies of those packages) -* **AND** there is a CVE fix for the package available in the affected base image's package repository. +See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). -Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md) for more detail about what to do when a CVE is encountered in a .NET image. +For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). Additional security information can be found on [aspire.dev/dashboard/security-considerations](https://aspire.dev/dashboard/security-considerations/#standalone-mode). ### Feedback -* [File an issue](https://github.com/dotnet/dotnet-docker/issues/new/choose) -* [Contact Microsoft Support](https://support.microsoft.com/contactus/) +* [Dashboard issues and feature requests](https://github.com/microsoft/aspire/issues). +* [Container image issues](https://github.com/dotnet/dotnet-docker/issues/new/choose). +* [Contact Microsoft Support](https://support.microsoft.com/contactus/). ## License * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) -* [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) +* [Aspire MIT license](https://github.com/microsoft/aspire/blob/main/LICENSE.TXT) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) diff --git a/.portal-docs/mar/README.runtime.portal.md b/.portal-docs/mar/README.runtime.portal.md index caedce3284..6d1a591041 100644 --- a/.portal-docs/mar/README.runtime.portal.md +++ b/.portal-docs/mar/README.runtime.portal.md @@ -98,5 +98,5 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) -* [Windows base image license](https://docs.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) -* [Pricing and licensing for Windows Server](https://www.microsoft.com/cloud-platform/windows-server-pricing) +* [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) +* [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing) diff --git a/.portal-docs/mar/README.samples.portal.md b/.portal-docs/mar/README.samples.portal.md index 09780f786a..2985bfbb12 100644 --- a/.portal-docs/mar/README.samples.portal.md +++ b/.portal-docs/mar/README.samples.portal.md @@ -115,5 +115,5 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) -* [Windows base image license](https://docs.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) -* [Pricing and licensing for Windows Server](https://www.microsoft.com/cloud-platform/windows-server-pricing) +* [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) +* [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing) diff --git a/.portal-docs/mar/README.sdk.portal.md b/.portal-docs/mar/README.sdk.portal.md index 33e92296f1..05b7cd9c2b 100644 --- a/.portal-docs/mar/README.sdk.portal.md +++ b/.portal-docs/mar/README.sdk.portal.md @@ -94,5 +94,5 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) -* [Windows base image license](https://docs.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) -* [Pricing and licensing for Windows Server](https://www.microsoft.com/cloud-platform/windows-server-pricing) +* [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) +* [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing) diff --git a/README.aspire-dashboard.md b/README.aspire-dashboard.md index 76b9dd06d3..6425ac17f3 100644 --- a/README.aspire-dashboard.md +++ b/README.aspire-dashboard.md @@ -7,105 +7,47 @@ ## About -This image contains the [Aspire Dashboard](https://aspire.dev/dashboard/standalone/), a standalone browser-based app for viewing telemetry and run-time information about distributed applications. The source is available in the [microsoft/aspire](https://github.com/microsoft/aspire) repository. +The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). -Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categories/announcements) for Docker-related .NET announcements. +For preview builds, see the [nightly Aspire Dashboard image](https://mcr.microsoft.com/artifact/mar/aspire/nightly/dashboard/about). ## Usage -The Aspire Dashboard is a browser-based app to view run-time information about your distributed application. +Run the dashboard locally: -The dashboard shows: +```console +docker run --rm -d --name aspire-dashboard -p 127.0.0.1:18888:18888 -p 127.0.0.1:4317:18889 -p 127.0.0.1:4318:18890 mcr.microsoft.com/aspire/dashboard:13 +``` -* Resources that make up your app, such as .NET projects, executables and containers. -* Live console logs of resources. -* Live telemetry, such as structured logs, traces and metrics. +Open `http://localhost:18888`. To sign in, use the login URL or token printed in the container logs: -### Configuration +```console +docker logs aspire-dashboard +``` -The dashboard must be configured when it is started. The configuration is done via environment variables. The following environment variables are supported: +This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure HTTPS, authentication, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). -* `ASPNETCORE_URLS` specifies one or more HTTP endpoints through which the dashboard frontend is served. The frontend endpoint is used to view the dashboard in a browser. Defaults to `http://localhost:18888`. -* `DOTNET_DASHBOARD_OTLP_ENDPOINT_URL` specifies the [OTLP/gRPC](https://opentelemetry.io/docs/specs/otlp/#otlpgrpc) endpoint. This endpoint hosts an OTLP service and receives telemetry using gRPC. When the dashboard is launched by the Aspire app host this address is secured with HTTPS. Securing the dashboard with HTTPS is recommended. Defaults to `http://localhost:18889`. -* `DOTNET_DASHBOARD_OTLP_HTTP_ENDPOINT_URL` specifies the [OTLP/HTTP](https://opentelemetry.io/docs/specs/otlp/#otlphttp) endpoint. This endpoint hosts an OTLP service and receives telemetry using Protobuf over HTTP. Defaults to `http://localhost:18890`. -* `ASPIRE_DASHBOARD_MCP_ENDPOINT_URL` specifies the Aspire MCP endpoint. When this value isn't specified then the MCP server is hosted with an `ASPNETCORE_URLS` endpoint. The MCP server can be disabled by configuring `Dashboard:Mcp:Disabled` to `true`. Defaults to `http://localhost:18891`. -* `DOTNET_DASHBOARD_UNSECURED_ALLOW_ANONYMOUS` specifies the dashboard doesn't use authentication and accepts anonymous access. This setting is a shortcut to configuring `Dashboard:Frontend:AuthMode`, `Dashboard:Otlp:AuthMode` and `Dashboard:Mcp:AuthMode` to `Unsecured`. -* `DOTNET_DASHBOARD_CONFIG_FILE_PATH` specifies the path for an optional JSON configuration file. +### Send telemetry -#### Frontend authentication +Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter with the matching protocol and endpoint. Starting the dashboard does not instrument your application automatically. For applications running on the host, use: -The dashboard's frontend supports OpenID Connect (OIDC). Set `Dashboard__Frontend__AuthMode` to `OpenIdConnect`, then add the following configuration: +* OTLP/gRPC: `http://localhost:4317` (mapped to container port `18889`). +* OTLP/HTTP: `http://localhost:4318` (mapped to container port `18890`). -* `Authentication__Schemes__OpenIdConnect__Authority` — URL to the identity provider (IdP) -* `Authentication__Schemes__OpenIdConnect__ClientId` — Identity of the relying party (RP) -* `Authentication__Schemes__OpenIdConnect__ClientSecret`— A secret that only the real RP would know -* Other properties of [`OpenIdConnectOptions`](https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.builder.openidconnectoptions) specified in configuration container `Authentication__Schemes__OpenIdConnect__*` +For applications in other containers, use the dashboard container's name and port (`18889` or `18890`) on a shared Docker network, not their own `localhost`. -It may also be run unsecured. Set `Dashboard__Frontend__AuthMode` to `Unsecured`. The frontend endpoint will allow anonymous access. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. +### Operational notes -### OTLP authentication +* Telemetry is stored in memory with configurable limits and is lost when the dashboard restarts. The dashboard is intended for development and short-term diagnostics, not durable telemetry storage. +* Standalone mode displays telemetry without an AppHost. Resource listings and captured console logs require a configured [resource service](https://aspire.dev/dashboard/configuration/#resources). -The OTLP endpoint can be secured with [client certificate](https://learn.microsoft.com/aspnet/core/security/authentication/certauth) or API key authentication. +### Documentation and examples -For client certification authentication, set `Dashboard__Otlp__AuthMode` to `Certificate`. - -For API key authentication, set `Dashboard__Otlp__AuthMode` to `ApiKey`, then add the following configuration: - -* `Dashboard__Otlp__PrimaryApiKey` specifies the primary API key. (required, string) -* `Dashboard__Otlp__SecondaryApiKey` specifies the secondary API key. (optional, string) - -It may also be run unsecured. Set `Dashboard__Otlp__AuthMode` to `Unsecured`. The OTLP endpoint will allow anonymous access. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. - -### Resources - -* `Dashboard__ResourceServiceClient__Url` specifies the gRPC endpoint to which the dashboard connects for its data. There's no default. If this variable is unspecified, the dashboard shows OTEL data but no resource list or console logs. - -The resource service client supports certificates. Set `Dashboard__ResourceServiceClient__AuthMode` to `Certificate`, then add the following configuration: - -* `Dashboard__ResourceServiceClient__ClientCertificate__Source` (required) one of: - * `File` to load the cert from a file path, configured with: - * `Dashboard__ResourceServiceClient__ClientCertificate__FilePath` (required, string) - * `Dashboard__ResourceServiceClient__ClientCertificate__Password` (optional, string) - * `KeyStore` to load the cert from a key store, configured with: - * `Dashboard__ResourceServiceClient__ClientCertificate__Subject` (required, string) - * `Dashboard__ResourceServiceClient__ClientCertificate__Store` (optional, [`StoreName`](https://learn.microsoft.com/dotnet/api/system.security.cryptography.x509certificates.storename), defaults to `My`) - * `Dashboard__ResourceServiceClient__ClientCertificate__Location` (optional, [`StoreLocation`](https://learn.microsoft.com/dotnet/api/system.security.cryptography.x509certificates.storelocation), defaults to `CurrentUser`) - -To opt-out of authentication, set `Dashboard__ResourceServiceClient__AuthMode` to `Unsecured`. This completely disables all security for the resource service client. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. - -#### Telemetry Limits - -Telemetry is stored in-memory. To avoid excessive memory usage, the dashboard has limits on the count and size of stored telemetry. When a count limit is reached, new telemetry is added, and the oldest telemetry is removed. When a size limit is reached, data is truncated to the limit. - -* `Dashboard__TelemetryLimits__MaxLogCount` specifies the maximum number of log entries. Defaults to 10,000. -* `Dashboard__TelemetryLimits__MaxTraceCount` specifies the maximum number of traces. Defaults to 10,000. -* `Dashboard__TelemetryLimits__MaxMetricsCount` specifies the maximum number of metric data points. Defaults to 50,000. -* `Dashboard__TelemetryLimits__MaxAttributeCount` specifies the maximum number of attributes on telemetry. Defaults to 128. -* `Dashboard__TelemetryLimits__MaxAttributeLength` specifies the maximum length of attributes. Defaults to unlimited. -* `Dashboard__TelemetryLimits__MaxSpanEventCount` specifies the maximum number of events on span attributes. Defaults to unlimited. - -Limits are per-resource. For example, a `MaxLogCount` value of 10,000 configures the dashboard to store up to 10,000 log entries per-resource. - -### Other - -* `Dashboard__ApplicationName` specifies the application name to be displayed in the UI. This applies only when no resource service URL is specified. When a resource service exists, the service specifies the application name. - -## Related Repositories - -.NET: - -* [dotnet](https://github.com/dotnet/dotnet-docker/blob/main/README.md): .NET -* [dotnet/sdk](https://github.com/dotnet/dotnet-docker/blob/main/README.sdk.md): .NET SDK -* [dotnet/aspnet](https://github.com/dotnet/dotnet-docker/blob/main/README.aspnet.md): ASP.NET Core Runtime -* [dotnet/runtime](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime.md): .NET Runtime -* [dotnet/runtime-deps](https://github.com/dotnet/dotnet-docker/blob/main/README.runtime-deps.md): .NET Runtime Dependencies -* [dotnet/monitor](https://github.com/dotnet/dotnet-docker/blob/main/README.monitor.md): .NET Monitor Tool -* [dotnet/samples](https://github.com/dotnet/dotnet-docker/blob/main/README.samples.md): .NET Samples - -.NET Framework: - -* [dotnet/framework](https://github.com/microsoft/dotnet-framework-docker/blob/main/README.md): .NET Framework, ASP.NET and WCF -* [dotnet/framework/samples](https://github.com/microsoft/dotnet-framework-docker/blob/main/README.samples.md): .NET Framework, ASP.NET and WCF Samples +* [Run the standalone dashboard](https://aspire.dev/dashboard/standalone/). +* [Python telemetry tutorial](https://aspire.dev/dashboard/standalone-for-python/). +* [JavaScript and Node.js telemetry tutorial](https://aspire.dev/dashboard/standalone-for-nodejs/). +* [Standalone dashboard sample (C#)](https://github.com/microsoft/aspire-samples/tree/main/samples/standalone-dashboard). +* [Dashboard configuration reference](https://aspire.dev/dashboard/configuration/). ## Full Tag Listing @@ -127,37 +69,18 @@ Tags | Dockerfile | OS Version ## Support -### Lifecycle - -* [Microsoft Support for Aspire](https://aspire.dev/support/) -* [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md) -* [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md) - -### Image Update Policy - -* **Base Image Updates:** Images are re-built within 12 hours of any updates to their base images (e.g. debian:bookworm-slim, windows/nanoserver:ltsc2022, etc.). -* **.NET Releases:** Images are re-built as part of releasing new .NET versions. This includes new major versions, minor versions, and servicing releases. -* **Critical CVEs:** Images are re-built to pick up critical CVE fixes as described by the CVE Update Policy below. -* **Monthly Re-builds:** Images are re-built monthly, typically on the second Tuesday of the month, in order to pick up lower-severity CVE fixes. -* **Out-Of-Band Updates:** Images can sometimes be re-built when out-of-band updates are necessary to address critical issues. If this happens, new fixed version tags will be updated according to the [Fixed version tags documentation](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md#fixed-version-tags). - -#### CVE Update Policy - -.NET container images are regularly monitored for the presence of CVEs. A given image will be rebuilt to pick up fixes for a CVE when: - -* We detect the image contains a CVE with a [CVSS](https://nvd.nist.gov/vuln-metrics/cvss) score of "Critical" -* **AND** the CVE is in a package that is added in our Dockerfile layers (meaning the CVE is in a package we explicitly install or any transitive dependencies of those packages) -* **AND** there is a CVE fix for the package available in the affected base image's package repository. +See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). -Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md) for more detail about what to do when a CVE is encountered in a .NET image. +For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). Additional security information can be found on [aspire.dev/dashboard/security-considerations](https://aspire.dev/dashboard/security-considerations/#standalone-mode). ### Feedback -* [File an issue](https://github.com/dotnet/dotnet-docker/issues/new/choose) -* [Contact Microsoft Support](https://support.microsoft.com/contactus/) +* [Dashboard issues and feature requests](https://github.com/microsoft/aspire/issues). +* [Container image issues](https://github.com/dotnet/dotnet-docker/issues/new/choose). +* [Contact Microsoft Support](https://support.microsoft.com/contactus/). ## License * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) -* [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) +* [Aspire MIT license](https://github.com/microsoft/aspire/blob/main/LICENSE.TXT) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) diff --git a/README.aspnet.md b/README.aspnet.md index 5b57afaca7..748d52a838 100644 --- a/README.aspnet.md +++ b/README.aspnet.md @@ -380,5 +380,5 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) -* [Windows base image license](https://docs.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) -* [Pricing and licensing for Windows Server](https://www.microsoft.com/cloud-platform/windows-server-pricing) +* [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) +* [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing) diff --git a/README.md b/README.md index bac4c5af68..80c88e5d62 100644 --- a/README.md +++ b/README.md @@ -127,5 +127,5 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) -* [Windows base image license](https://docs.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) -* [Pricing and licensing for Windows Server](https://www.microsoft.com/cloud-platform/windows-server-pricing) +* [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) +* [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing) diff --git a/README.runtime.md b/README.runtime.md index 6500f9fa13..3f114ec9a5 100644 --- a/README.runtime.md +++ b/README.runtime.md @@ -273,5 +273,5 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) -* [Windows base image license](https://docs.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) -* [Pricing and licensing for Windows Server](https://www.microsoft.com/cloud-platform/windows-server-pricing) +* [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) +* [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing) diff --git a/README.samples.md b/README.samples.md index 07b62ab0af..3a50492222 100644 --- a/README.samples.md +++ b/README.samples.md @@ -157,5 +157,5 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) -* [Windows base image license](https://docs.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) -* [Pricing and licensing for Windows Server](https://www.microsoft.com/cloud-platform/windows-server-pricing) +* [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) +* [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing) diff --git a/README.sdk.md b/README.sdk.md index c99bcbfcdf..66629c9780 100644 --- a/README.sdk.md +++ b/README.sdk.md @@ -212,5 +212,5 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) -* [Windows base image license](https://docs.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) -* [Pricing and licensing for Windows Server](https://www.microsoft.com/cloud-platform/windows-server-pricing) +* [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) +* [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing) diff --git a/eng/readme-templates/About.aspire-dashboard.md b/eng/readme-templates/About.aspire-dashboard.md deleted file mode 100644 index 280212b5ca..0000000000 --- a/eng/readme-templates/About.aspire-dashboard.md +++ /dev/null @@ -1 +0,0 @@ -This image contains the [Aspire Dashboard](https://aspire.dev/dashboard/standalone/), a standalone browser-based app for viewing telemetry and run-time information about distributed applications. The source is available in the [microsoft/aspire](https://github.com/microsoft/aspire) repository. diff --git a/eng/readme-templates/About.md b/eng/readme-templates/About.md index d9d2d63231..d2e20f9007 100644 --- a/eng/readme-templates/About.md +++ b/eng/readme-templates/About.md @@ -4,9 +4,7 @@ readme-host: Moniker of the site that will host the readme ^ set templateQualifier to when(IS_PRODUCT_FAMILY, "product-family", - when(split(REPO, "/")[0] = "aspire", - "aspire-dashboard", - when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO))) + when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO)) }}{{ARGS["top-header"]}} About {{if ARGS["readme-host"] = "mar":{{InsertTemplate("ReposProvider.md", [ diff --git a/eng/readme-templates/About.variants.md b/eng/readme-templates/About.variants.md index 100b41fd19..7f230313d6 100644 --- a/eng/readme-templates/About.variants.md +++ b/eng/readme-templates/About.variants.md @@ -8,7 +8,7 @@ }}{{ARGS["top-header"]}} Image Variants .NET container images have several variants that offer different combinations of flexibility and deployment size. -The [Image Variants documentation](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-variants.md) contains a summary of the image variants and their use-cases.{{if repo != "sdk" && repo != "aspire-dashboard": +The [Image Variants documentation](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-variants.md) contains a summary of the image variants and their use-cases.{{if repo != "sdk": {{InsertTemplate("About.distroless.md", [ "top-header": ARGS["top-header"] ])}}}}{{if repo = "aspnet": diff --git a/eng/readme-templates/Announcement.md b/eng/readme-templates/Announcement.md index 9a8d2392d8..bc0d750f82 100644 --- a/eng/readme-templates/Announcement.md +++ b/eng/readme-templates/Announcement.md @@ -11,7 +11,6 @@ }} ^ set nonNightlyRepo to when(IS_PRODUCT_FAMILY, "dotnet", join(split(REPO, "/nightly"), "")) ^ - set announcementFamily to split(nonNightlyRepo, "/")[0] ^ set isNightlyRepo to match(split(REPO, "/")[1], "nightly") ^ set productFamilyRepo to ARGS["product-family-repos"][0][0] ^ set isNightlyOnly to find(map(ARGS["nightly-only-repos"],getRepoName), nonNightlyRepo) >= 0 ^ @@ -22,9 +21,8 @@ }}{{if isNightlyRepo || VARIABLES["branch"] = "nightly" :{{if ARGS["leading-line-break"]: -}}{{if announcementFamily = "aspire":> **Important**: The {{REPO}} image is a preview build of the Aspire Dashboard and is not signed. See [{{nonNightlyRepo}}]({{url}}) for stable releases. -^else:> **Important**: The images from the dotnet/nightly repositories include last-known-good (LKG) builds for the next release of [.NET](https://github.com/dotnet/core). +}}> **Important**: The images from the dotnet/nightly repositories include last-known-good (LKG) builds for the next release of [.NET](https://github.com/dotnet/core). > > See [dotnet]({{url}}) for images with official releases of [.NET](https://github.com/dotnet/core). -}}{{if ARGS["trailing-line-break"]: +{{if ARGS["trailing-line-break"]: }}}} diff --git a/eng/readme-templates/DefaultLayout.md b/eng/readme-templates/DefaultLayout.md index e8d138b7db..f859e02ae8 100644 --- a/eng/readme-templates/DefaultLayout.md +++ b/eng/readme-templates/DefaultLayout.md @@ -7,7 +7,6 @@ set insertReposListTemplate(template, args) to:{{ return InsertTemplate("ReposProvider.md", union([ "template": template ], commonArgs, args)) }} ^ - set isNightlyRepo to match(split(REPO, "/")[1], "nightly") ^ set readmeRepoName to when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO) @@ -18,7 +17,7 @@ if !IS_PRODUCT_FAMILY:{{InsertTemplate("FeaturedTags.md", commonArgs)}} }} {{InsertTemplate("About.md", commonArgs)}} -{{InsertTemplate("Use.md", commonArgs)}}{{if (find(REPO, "monitor") < 0 && find(REPO, "aspire") < 0 && find(REPO, "yarp") < 0): +{{InsertTemplate("Use.md", commonArgs)}}{{if (find(REPO, "monitor") < 0 && find(REPO, "yarp") < 0): {{InsertTemplate("About.variants.md", commonArgs)}}}} diff --git a/eng/readme-templates/FeaturedTags.md b/eng/readme-templates/FeaturedTags.md index e4c210d7dd..b0a5431943 100644 --- a/eng/readme-templates/FeaturedTags.md +++ b/eng/readme-templates/FeaturedTags.md @@ -20,8 +20,6 @@ elif match(REPO, "monitor/base"):* `9` (Standard Support) * `docker pull {{FULL_REPO}}:9` * `8` (Long-Term Support) * `docker pull {{FULL_REPO}}:8`^ -elif split(REPO, "/")[0] = "aspire":* `13` - * `docker pull {{FULL_REPO}}:13`^ elif match(REPO, "yarp"):* `2.3-preview` * `docker pull {{FULL_REPO}}:2.3-preview`^ else:{{if VARIABLES["branch"] = "nightly":* `11.0` (Release Candidate) diff --git a/eng/readme-templates/GitHub.header.md b/eng/readme-templates/GitHub.header.md index 9ab7e4661c..9cbe8900fa 100644 --- a/eng/readme-templates/GitHub.header.md +++ b/eng/readme-templates/GitHub.header.md @@ -15,8 +15,6 @@ set currentRepo to when(IS_PRODUCT_FAMILY, ARGS["product-family-repos"], - when(split(REPO, "/")[0] = "aspire", - [["aspire/dashboard", "Aspire Dashboard"]], - cat(filter(repos, isCurrentRepo)))) + cat(filter(repos, isCurrentRepo))) }}# {{currentRepo[0][1]}} diff --git a/eng/readme-templates/README.aspire-dashboard.github.md b/eng/readme-templates/README.aspire-dashboard.github.md new file mode 100644 index 0000000000..d0b6536ed8 --- /dev/null +++ b/eng/readme-templates/README.aspire-dashboard.github.md @@ -0,0 +1 @@ +{{InsertTemplate("README.aspire-dashboard.md", [ "readme-host": "github" ])}} diff --git a/eng/readme-templates/README.aspire-dashboard.mcr.md b/eng/readme-templates/README.aspire-dashboard.mcr.md new file mode 100644 index 0000000000..4a365835b8 --- /dev/null +++ b/eng/readme-templates/README.aspire-dashboard.mcr.md @@ -0,0 +1 @@ +{{InsertTemplate("README.aspire-dashboard.md", [ "readme-host": "mar" ])}} diff --git a/eng/readme-templates/README.aspire-dashboard.md b/eng/readme-templates/README.aspire-dashboard.md new file mode 100644 index 0000000000..61a396e24c --- /dev/null +++ b/eng/readme-templates/README.aspire-dashboard.md @@ -0,0 +1,92 @@ +{{ + _ ARGS: + readme-host: Moniker of the site that will host the readme ^ + + set isGitHub to ARGS["readme-host"] = "github" ^ + set isDockerHub to ARGS["readme-host"] = "dockerhub" ^ + set h to when(isDockerHub, "#", "##") ^ + set isNightlyRepo to match(split(REPO, "/")[1], "nightly") || VARIABLES["branch"] = "nightly" ^ + set stableUrl to when( + isGitHub, + "https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md", + "https://mcr.microsoft.com/artifact/mar/aspire/dashboard/about") ^ + set stableName to when(isGitHub, "dotnet/aspire-dashboard", "aspire/dashboard") + +}}{{if isGitHub:# Aspire Dashboard + +}}{{if isNightlyRepo:> **Important**: The {{REPO}} image is a preview build of the Aspire Dashboard and is not signed. See [{{stableName}}]({{stableUrl}}) for stable releases. + +}}{{h}} Featured Tags + +* `13` + * `docker pull {{FULL_REPO}}:13` + +{{h}} About + +The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). +{{if !isNightlyRepo: +For preview builds, see the [nightly Aspire Dashboard image](https://mcr.microsoft.com/artifact/mar/aspire/nightly/dashboard/about). +}} +{{h}} Usage + +Run the dashboard locally: + +```console +docker run --rm -d --name aspire-dashboard -p 127.0.0.1:18888:18888 -p 127.0.0.1:4317:18889 -p 127.0.0.1:4318:18890 {{FULL_REPO}}:13 +``` + +Open `http://localhost:18888`. To sign in, use the login URL or token printed in the container logs: + +```console +docker logs aspire-dashboard +``` + +This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure HTTPS, authentication, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). + +{{h}}# Send telemetry + +Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter with the matching protocol and endpoint. Starting the dashboard does not instrument your application automatically. For applications running on the host, use: + +* OTLP/gRPC: `http://localhost:4317` (mapped to container port `18889`). +* OTLP/HTTP: `http://localhost:4318` (mapped to container port `18890`). + +For applications in other containers, use the dashboard container's name and port (`18889` or `18890`) on a shared Docker network, not their own `localhost`. + +{{h}}# Operational notes + +* Telemetry is stored in memory with configurable limits and is lost when the dashboard restarts. The dashboard is intended for development and short-term diagnostics, not durable telemetry storage. +* Standalone mode displays telemetry without an AppHost. Resource listings and captured console logs require a configured [resource service](https://aspire.dev/dashboard/configuration/#resources). + +{{h}}# Documentation and examples + +* [Run the standalone dashboard](https://aspire.dev/dashboard/standalone/). +* [Python telemetry tutorial](https://aspire.dev/dashboard/standalone-for-python/). +* [JavaScript and Node.js telemetry tutorial](https://aspire.dev/dashboard/standalone-for-nodejs/). +* [Standalone dashboard sample (C#)](https://github.com/microsoft/aspire-samples/tree/main/samples/standalone-dashboard). +* [Dashboard configuration reference](https://aspire.dev/dashboard/configuration/). + +{{if isGitHub:## Full Tag Listing + +*Tags not listed in the table above are not supported. See the [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md). See the [full list of tags](https://mcr.microsoft.com/v2/{{REPO}}/tags/list) for all supported and unsupported tags.* + +^elif isDockerHub:# Full Tag Listing + +View the current tags at the [Microsoft Artifact Registry portal](https://mcr.microsoft.com/artifact/mar/{{REPO}}/tags) or on [GitHub](https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md#full-tag-listing). + +}}{{h}} Support + +See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). + +For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). Additional security information can be found on [aspire.dev/dashboard/security-considerations](https://aspire.dev/dashboard/security-considerations/#standalone-mode). + +{{h}}# Feedback + +* [Dashboard issues and feature requests](https://github.com/microsoft/aspire/issues). +* [Container image issues](https://github.com/dotnet/dotnet-docker/issues/new/choose). +* [Contact Microsoft Support](https://support.microsoft.com/contactus/). + +{{h}} License + +* Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) +* [Aspire MIT license](https://github.com/microsoft/aspire/blob/main/LICENSE.TXT) +* [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) diff --git a/eng/readme-templates/README.mcr.md b/eng/readme-templates/README.mcr.md index f3d8006bb5..6cd3e88435 100644 --- a/eng/readme-templates/README.mcr.md +++ b/eng/readme-templates/README.mcr.md @@ -6,7 +6,7 @@ {{InsertTemplate("ReposProvider.md", union([ "template": "RelatedRepos.md" ], commonArgs))}} -{{InsertTemplate("Use.md", commonArgs)}}{{if (find(REPO, "monitor") < 0 && find(REPO, "aspire") < 0 && find(REPO, "yarp") < 0): +{{InsertTemplate("Use.md", commonArgs)}}{{if (find(REPO, "monitor") < 0 && find(REPO, "yarp") < 0): {{InsertTemplate("About.variants.md", commonArgs)}}}} diff --git a/eng/readme-templates/Support.md b/eng/readme-templates/Support.md index d4768f10f5..5bca50f8a5 100644 --- a/eng/readme-templates/Support.md +++ b/eng/readme-templates/Support.md @@ -5,7 +5,6 @@ set isRuntimeDeps to match(SHORT_REPO, "runtime-deps") ^ set isSamples to match(SHORT_REPO, "samples") ^ set isMonitor to match(SHORT_REPO, "monitor") || match(SHORT_REPO, "base") ^ - set isAspireDashboard to split(REPO, "/")[0] = "aspire" ^ set isReverseProxy to match(SHORT_REPO, "yarp") }}{{ARGS["top-header"]}} Support @@ -15,7 +14,7 @@ }}{{ARGS["top-header"]}}# Lifecycle {{if isReverseProxy:* [Microsoft Support for YARP](https://github.com/dotnet/yarp/blob/main/docs/roadmap.md) -}}* [Microsoft Support for {{when(isAspireDashboard, "Aspire", ".NET")}}]({{when(isAspireDashboard, "https://aspire.dev/support/", "https://github.com/dotnet/core/blob/main/support.md")}}) +}}* [Microsoft Support for .NET](https://github.com/dotnet/core/blob/main/support.md) * [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md) * [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md) @@ -46,6 +45,6 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) -* [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md){{if !(isRuntimeDeps || isMonitor || isAspireDashboard): -* [Windows base image license](https://docs.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) -* [Pricing and licensing for Windows Server](https://www.microsoft.com/cloud-platform/windows-server-pricing)}} +* [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md){{if !(isRuntimeDeps || isMonitor): +* [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) +* [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing)}} diff --git a/eng/readme-templates/Url.md b/eng/readme-templates/Url.md index b8174853c3..cdd8c69ada 100644 --- a/eng/readme-templates/Url.md +++ b/eng/readme-templates/Url.md @@ -18,9 +18,7 @@ when(isProductFamily, "", cat( - when(repoParts[0] = "aspire", - "aspire-dashboard", - join(slice(repoParts, when(isNightlyRepo || isFrameworkRepo, 2, 1)), "-")), + join(slice(repoParts, when(isNightlyRepo || isFrameworkRepo, 2, 1)), "-"), ".")), "md") diff --git a/eng/readme-templates/Use.aspire-dashboard.md b/eng/readme-templates/Use.aspire-dashboard.md deleted file mode 100644 index 7eea5331dd..0000000000 --- a/eng/readme-templates/Use.aspire-dashboard.md +++ /dev/null @@ -1,80 +0,0 @@ -{{ - _ ARGS: - top-header: The string to use as the top-level header. - readme-host: Moniker of the site that will host the readme -}}The Aspire Dashboard is a browser-based app to view run-time information about your distributed application. - -The dashboard shows: - -* Resources that make up your app, such as .NET projects, executables and containers. -* Live console logs of resources. -* Live telemetry, such as structured logs, traces and metrics. - -{{ARGS["top-header"]}}# Configuration - -The dashboard must be configured when it is started. The configuration is done via environment variables. The following environment variables are supported: - -* `ASPNETCORE_URLS` specifies one or more HTTP endpoints through which the dashboard frontend is served. The frontend endpoint is used to view the dashboard in a browser. Defaults to `http://localhost:18888`. -* `DOTNET_DASHBOARD_OTLP_ENDPOINT_URL` specifies the [OTLP/gRPC](https://opentelemetry.io/docs/specs/otlp/#otlpgrpc) endpoint. This endpoint hosts an OTLP service and receives telemetry using gRPC. When the dashboard is launched by the Aspire app host this address is secured with HTTPS. Securing the dashboard with HTTPS is recommended. Defaults to `http://localhost:18889`. -* `DOTNET_DASHBOARD_OTLP_HTTP_ENDPOINT_URL` specifies the [OTLP/HTTP](https://opentelemetry.io/docs/specs/otlp/#otlphttp) endpoint. This endpoint hosts an OTLP service and receives telemetry using Protobuf over HTTP. Defaults to `http://localhost:18890`. -* `ASPIRE_DASHBOARD_MCP_ENDPOINT_URL` specifies the Aspire MCP endpoint. When this value isn't specified then the MCP server is hosted with an `ASPNETCORE_URLS` endpoint. The MCP server can be disabled by configuring `Dashboard:Mcp:Disabled` to `true`. Defaults to `http://localhost:18891`. -* `DOTNET_DASHBOARD_UNSECURED_ALLOW_ANONYMOUS` specifies the dashboard doesn't use authentication and accepts anonymous access. This setting is a shortcut to configuring `Dashboard:Frontend:AuthMode`, `Dashboard:Otlp:AuthMode` and `Dashboard:Mcp:AuthMode` to `Unsecured`. -* `DOTNET_DASHBOARD_CONFIG_FILE_PATH` specifies the path for an optional JSON configuration file. - -{{ARGS["top-header"]}}## Frontend authentication - -The dashboard's frontend supports OpenID Connect (OIDC). Set `Dashboard__Frontend__AuthMode` to `OpenIdConnect`, then add the following configuration: - -* `Authentication__Schemes__OpenIdConnect__Authority` — URL to the identity provider (IdP) -* `Authentication__Schemes__OpenIdConnect__ClientId` — Identity of the relying party (RP) -* `Authentication__Schemes__OpenIdConnect__ClientSecret`— A secret that only the real RP would know -* Other properties of [`OpenIdConnectOptions`](https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.builder.openidconnectoptions) specified in configuration container `Authentication__Schemes__OpenIdConnect__*` - -It may also be run unsecured. Set `Dashboard__Frontend__AuthMode` to `Unsecured`. The frontend endpoint will allow anonymous access. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. - -{{ARGS["top-header"]}}# OTLP authentication - -The OTLP endpoint can be secured with [client certificate](https://learn.microsoft.com/aspnet/core/security/authentication/certauth) or API key authentication. - -For client certification authentication, set `Dashboard__Otlp__AuthMode` to `Certificate`. - -For API key authentication, set `Dashboard__Otlp__AuthMode` to `ApiKey`, then add the following configuration: - -* `Dashboard__Otlp__PrimaryApiKey` specifies the primary API key. (required, string) -* `Dashboard__Otlp__SecondaryApiKey` specifies the secondary API key. (optional, string) - -It may also be run unsecured. Set `Dashboard__Otlp__AuthMode` to `Unsecured`. The OTLP endpoint will allow anonymous access. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. - -{{ARGS["top-header"]}}# Resources - -* `Dashboard__ResourceServiceClient__Url` specifies the gRPC endpoint to which the dashboard connects for its data. There's no default. If this variable is unspecified, the dashboard shows OTEL data but no resource list or console logs. - -The resource service client supports certificates. Set `Dashboard__ResourceServiceClient__AuthMode` to `Certificate`, then add the following configuration: - -* `Dashboard__ResourceServiceClient__ClientCertificate__Source` (required) one of: - * `File` to load the cert from a file path, configured with: - * `Dashboard__ResourceServiceClient__ClientCertificate__FilePath` (required, string) - * `Dashboard__ResourceServiceClient__ClientCertificate__Password` (optional, string) - * `KeyStore` to load the cert from a key store, configured with: - * `Dashboard__ResourceServiceClient__ClientCertificate__Subject` (required, string) - * `Dashboard__ResourceServiceClient__ClientCertificate__Store` (optional, [`StoreName`](https://learn.microsoft.com/dotnet/api/system.security.cryptography.x509certificates.storename), defaults to `My`) - * `Dashboard__ResourceServiceClient__ClientCertificate__Location` (optional, [`StoreLocation`](https://learn.microsoft.com/dotnet/api/system.security.cryptography.x509certificates.storelocation), defaults to `CurrentUser`) - -To opt-out of authentication, set `Dashboard__ResourceServiceClient__AuthMode` to `Unsecured`. This completely disables all security for the resource service client. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. - -{{ARGS["top-header"]}}## Telemetry Limits - -Telemetry is stored in-memory. To avoid excessive memory usage, the dashboard has limits on the count and size of stored telemetry. When a count limit is reached, new telemetry is added, and the oldest telemetry is removed. When a size limit is reached, data is truncated to the limit. - -* `Dashboard__TelemetryLimits__MaxLogCount` specifies the maximum number of log entries. Defaults to 10,000. -* `Dashboard__TelemetryLimits__MaxTraceCount` specifies the maximum number of traces. Defaults to 10,000. -* `Dashboard__TelemetryLimits__MaxMetricsCount` specifies the maximum number of metric data points. Defaults to 50,000. -* `Dashboard__TelemetryLimits__MaxAttributeCount` specifies the maximum number of attributes on telemetry. Defaults to 128. -* `Dashboard__TelemetryLimits__MaxAttributeLength` specifies the maximum length of attributes. Defaults to unlimited. -* `Dashboard__TelemetryLimits__MaxSpanEventCount` specifies the maximum number of events on span attributes. Defaults to unlimited. - -Limits are per-resource. For example, a `MaxLogCount` value of 10,000 configures the dashboard to store up to 10,000 log entries per-resource. - -{{ARGS["top-header"]}}# Other - -* `Dashboard__ApplicationName` specifies the application name to be displayed in the UI. This applies only when no resource service URL is specified. When a resource service exists, the service specifies the application name. diff --git a/eng/readme-templates/Use.md b/eng/readme-templates/Use.md index a0983080a8..b12215edc1 100644 --- a/eng/readme-templates/Use.md +++ b/eng/readme-templates/Use.md @@ -4,14 +4,11 @@ readme-host: Moniker of the site that will host the readme ^ set templateQualifier to when(IS_PRODUCT_FAMILY, "samples", - when(split(REPO, "/")[0] = "aspire", - "aspire-dashboard", - when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO))) + when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO)) }}{{ARGS["top-header"]}} Usage -{{ _ Special case while aspire-dashboard image doesn't have any samples. Remove when https://github.com/dotnet/dotnet-docker/issues/5335 is resolved. ^ -if templateQualifier != "aspire-dashboard": + The [.NET Docker samples](https://github.com/dotnet/dotnet-docker/blob/main/samples/README.md) show various ways to use .NET and Docker together. See [Introduction to .NET and Docker](https://learn.microsoft.com/dotnet/core/docker/introduction){{ if templateQualifier = "aspnet" || templateQualifier = "runtime-deps": and [Host ASP.NET Core in Docker containers](https://learn.microsoft.com/aspnet/core/host-and-deploy/docker)}} to learn more. -}} + {{InsertTemplate(join(["Use", templateQualifier, "md"], "."), [ "top-header": ARGS["top-header"], "readme-host": ARGS["readme-host"]])}} diff --git a/manifest.json b/manifest.json index 7b100350e7..6c3616e7ed 100644 --- a/manifest.json +++ b/manifest.json @@ -14201,11 +14201,11 @@ "readmes": [ { "path": "README.aspire-dashboard.md", - "templatePath": "eng/readme-templates/README.github.md" + "templatePath": "eng/readme-templates/README.aspire-dashboard.github.md" }, { "path": ".portal-docs/mar/README.dashboard.portal.md", - "templatePath": "eng/readme-templates/README.mcr.md" + "templatePath": "eng/readme-templates/README.aspire-dashboard.mcr.md" } ], "mcrTagsMetadataTemplate": "eng/mcr-tags-metadata-templates/dashboard-tags.yml", diff --git a/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs b/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs index a7b571bfd2..c1eb4e5cee 100644 --- a/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs +++ b/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs @@ -37,6 +37,25 @@ public void Manifest_UsesCanonicalRepoName() GetAspireDashboardRepo().Value("name")); } + [Fact] + public void Manifest_DeclaresGitHubAndPortalReadmesWithoutDockerHub() + { + JObject[] readmes = GetAspireDashboardRepo()["readmes"]!.Children().ToArray(); + + Assert.Equal( + [ + "README.aspire-dashboard.md", + ".portal-docs/mar/README.dashboard.portal.md" + ], + readmes.Select(readme => readme.Value("path"))); + Assert.Equal( + [ + "eng/readme-templates/README.aspire-dashboard.github.md", + "eng/readme-templates/README.aspire-dashboard.mcr.md" + ], + readmes.Select(readme => readme.Value("templatePath"))); + } + [Fact] public void LegacySyndication_IsLimitedToAspire13() { From 570e9cba4413d71b66b97adf30a57c1de8573eb3 Mon Sep 17 00:00:00 2001 From: Logan Bussell Date: Thu, 8 Oct 2026 14:16:26 -0700 Subject: [PATCH 5/5] Restore Aspire Dashboard Docker Hub README Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b8c2a84d-ea5c-4c33-af40-3734a5cc3b24 --- .../docker-hub/README.aspire-dashboard.md | 70 +++++++++++++++++++ eng/readme-templates/Get-GeneratedReadmes.ps1 | 1 + .../README.aspire-dashboard.dockerhub.md | 1 + manifest.json | 4 ++ .../AspireDashboardManifestTests.cs | 19 ----- 5 files changed, 76 insertions(+), 19 deletions(-) create mode 100644 .portal-docs/docker-hub/README.aspire-dashboard.md create mode 100644 eng/readme-templates/README.aspire-dashboard.dockerhub.md diff --git a/.portal-docs/docker-hub/README.aspire-dashboard.md b/.portal-docs/docker-hub/README.aspire-dashboard.md new file mode 100644 index 0000000000..3d37aff9e8 --- /dev/null +++ b/.portal-docs/docker-hub/README.aspire-dashboard.md @@ -0,0 +1,70 @@ +# Featured Tags + +* `13` + * `docker pull mcr.microsoft.com/aspire/dashboard:13` + +# About + +The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). + +For preview builds, see the [nightly Aspire Dashboard image](https://mcr.microsoft.com/artifact/mar/aspire/nightly/dashboard/about). + +# Usage + +Run the dashboard locally: + +```console +docker run --rm -d --name aspire-dashboard -p 127.0.0.1:18888:18888 -p 127.0.0.1:4317:18889 -p 127.0.0.1:4318:18890 mcr.microsoft.com/aspire/dashboard:13 +``` + +Open `http://localhost:18888`. To sign in, use the login URL or token printed in the container logs: + +```console +docker logs aspire-dashboard +``` + +This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure HTTPS, authentication, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). + +## Send telemetry + +Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter with the matching protocol and endpoint. Starting the dashboard does not instrument your application automatically. For applications running on the host, use: + +* OTLP/gRPC: `http://localhost:4317` (mapped to container port `18889`). +* OTLP/HTTP: `http://localhost:4318` (mapped to container port `18890`). + +For applications in other containers, use the dashboard container's name and port (`18889` or `18890`) on a shared Docker network, not their own `localhost`. + +## Operational notes + +* Telemetry is stored in memory with configurable limits and is lost when the dashboard restarts. The dashboard is intended for development and short-term diagnostics, not durable telemetry storage. +* Standalone mode displays telemetry without an AppHost. Resource listings and captured console logs require a configured [resource service](https://aspire.dev/dashboard/configuration/#resources). + +## Documentation and examples + +* [Run the standalone dashboard](https://aspire.dev/dashboard/standalone/). +* [Python telemetry tutorial](https://aspire.dev/dashboard/standalone-for-python/). +* [JavaScript and Node.js telemetry tutorial](https://aspire.dev/dashboard/standalone-for-nodejs/). +* [Standalone dashboard sample (C#)](https://github.com/microsoft/aspire-samples/tree/main/samples/standalone-dashboard). +* [Dashboard configuration reference](https://aspire.dev/dashboard/configuration/). + +# Full Tag Listing + +View the current tags at the [Microsoft Artifact Registry portal](https://mcr.microsoft.com/artifact/mar/aspire/dashboard/tags) or on [GitHub](https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md#full-tag-listing). + +# Support + +See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). + +For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). Additional security information can be found on [aspire.dev/dashboard/security-considerations](https://aspire.dev/dashboard/security-considerations/#standalone-mode). + +## Feedback + +* [Dashboard issues and feature requests](https://github.com/microsoft/aspire/issues). +* [Container image issues](https://github.com/dotnet/dotnet-docker/issues/new/choose). +* [Contact Microsoft Support](https://support.microsoft.com/contactus/). + +# License + +* Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) +* [Aspire MIT license](https://github.com/microsoft/aspire/blob/main/LICENSE.TXT) +* [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) diff --git a/eng/readme-templates/Get-GeneratedReadmes.ps1 b/eng/readme-templates/Get-GeneratedReadmes.ps1 index 4c4920bb73..d107d8b4a6 100644 --- a/eng/readme-templates/Get-GeneratedReadmes.ps1 +++ b/eng/readme-templates/Get-GeneratedReadmes.ps1 @@ -34,6 +34,7 @@ $onDockerfilesGenerated = { CopyReadme $ContainerName "README.samples.md" CopyReadme $ContainerName "README.sdk.md" + CopyReadme $ContainerName ".portal-docs/docker-hub/README.aspire-dashboard.md" CopyReadme $ContainerName ".portal-docs/docker-hub/README.aspnet.md" CopyReadme $ContainerName ".portal-docs/docker-hub/README.monitor.md" CopyReadme $ContainerName ".portal-docs/docker-hub/README.monitor-base.md" diff --git a/eng/readme-templates/README.aspire-dashboard.dockerhub.md b/eng/readme-templates/README.aspire-dashboard.dockerhub.md new file mode 100644 index 0000000000..d0fbbc6fab --- /dev/null +++ b/eng/readme-templates/README.aspire-dashboard.dockerhub.md @@ -0,0 +1 @@ +{{InsertTemplate("README.aspire-dashboard.md", [ "readme-host": "dockerhub" ])}} diff --git a/manifest.json b/manifest.json index 6c3616e7ed..deecf50acc 100644 --- a/manifest.json +++ b/manifest.json @@ -14203,6 +14203,10 @@ "path": "README.aspire-dashboard.md", "templatePath": "eng/readme-templates/README.aspire-dashboard.github.md" }, + { + "path": ".portal-docs/docker-hub/README.aspire-dashboard.md", + "templatePath": "eng/readme-templates/README.aspire-dashboard.dockerhub.md" + }, { "path": ".portal-docs/mar/README.dashboard.portal.md", "templatePath": "eng/readme-templates/README.aspire-dashboard.mcr.md" diff --git a/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs b/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs index c1eb4e5cee..a7b571bfd2 100644 --- a/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs +++ b/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs @@ -37,25 +37,6 @@ public void Manifest_UsesCanonicalRepoName() GetAspireDashboardRepo().Value("name")); } - [Fact] - public void Manifest_DeclaresGitHubAndPortalReadmesWithoutDockerHub() - { - JObject[] readmes = GetAspireDashboardRepo()["readmes"]!.Children().ToArray(); - - Assert.Equal( - [ - "README.aspire-dashboard.md", - ".portal-docs/mar/README.dashboard.portal.md" - ], - readmes.Select(readme => readme.Value("path"))); - Assert.Equal( - [ - "eng/readme-templates/README.aspire-dashboard.github.md", - "eng/readme-templates/README.aspire-dashboard.mcr.md" - ], - readmes.Select(readme => readme.Value("templatePath"))); - } - [Fact] public void LegacySyndication_IsLimitedToAspire13() {