From d9c1469b73f8cc1742693ee19dda1619415f6d4e Mon Sep 17 00:00:00 2001 From: David Karlsson <35727626+dvdksn@users.noreply.github.com> Date: Mon, 9 Dec 2024 12:57:51 +0100 Subject: [PATCH 001/699] build: add oci-artifact exporter opt Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com> --- .../manuals/build/exporters/image-registry.md | 2 + .../build/metadata/attestations/_index.md | 81 +++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/content/manuals/build/exporters/image-registry.md b/content/manuals/build/exporters/image-registry.md index f807c2980a4f..159be14265fa 100644 --- a/content/manuals/build/exporters/image-registry.md +++ b/content/manuals/build/exporters/image-registry.md @@ -37,6 +37,7 @@ The following table describes the available parameters that you can pass to | `force-compression` | `true`,`false` | `false` | Forcefully apply compression, see [compression][1] | | `rewrite-timestamp` | `true`,`false` | `false` | Rewrite the file timestamps to the `SOURCE_DATE_EPOCH` value. See [build reproducibility][4] for how to specify the `SOURCE_DATE_EPOCH` value. | | `oci-mediatypes` | `true`,`false` | `false` | Use OCI media types in exporter manifests, see [OCI Media types][2] | +| `oci-artifact` | `true`,`false` | `false` | Attestations are formatted as OCI artifacts, see [OCI Media types][2] | | `unpack` | `true`,`false` | `false` | Unpack image after creation (for use with containerd) | | `store` | `true`,`false` | `true` | Store the result images to the worker's (for example, containerd) image store, and ensures that the image has all blobs in the content store. Ignored if the worker doesn't have image store (when using OCI workers, for example). | | `annotation.` | String | | Attach an annotation with the respective `key` and `value` to the built image,see [annotations][3] | @@ -45,6 +46,7 @@ The following table describes the available parameters that you can pass to [2]: _index.md#oci-media-types [3]: #annotations [4]: https://github.com/moby/buildkit/blob/master/docs/build-repro.md +[5]: /manuals/build/metadata/attestations/_index.md#attestations-as-oci-artifacts ## Annotations diff --git a/content/manuals/build/metadata/attestations/_index.md b/content/manuals/build/metadata/attestations/_index.md index fc9530a05b5e..e18977bf4679 100644 --- a/content/manuals/build/metadata/attestations/_index.md +++ b/content/manuals/build/metadata/attestations/_index.md @@ -95,6 +95,8 @@ the attestations to an image manifest, since it's outputting a directory of files or a tarball, not an image. Instead, these exporters write the attestations to one or more JSON files in the root directory of the export. +## Example + The following example shows a truncated in-toto JSON representation of an SBOM attestation. @@ -161,6 +163,85 @@ attestation. To deep-dive into the specifics about how attestations are stored, see [Image Attestation Storage (BuildKit)](attestation-storage.md). +## Attestation manifest format + +Attestations are stored as manifests, referenced by the image's index. Each +_attestation manifest_ refers to a single _image manifest_ (one +platform-variant of the image). Attestation manifests contain a single layer, +the "value" of the attestation. + +The following example shows the structure of an attestation manifest: + +```json +{ + "schemaVersion": 2, + "mediaType": "application/vnd.oci.image.manifest.v1+json", + "config": { + "mediaType": "application/vnd.oci.image.config.v1+json", + "size": 167, + "digest": "sha256:916d7437a36dd0e258e64d9c5a373ca5c9618eeb1555e79bd82066e593f9afae" + }, + "layers": [ + { + "mediaType": "application/vnd.in-toto+json", + "size": 1833349, + "digest": "sha256:3138024b98ed5aa8e3008285a458cd25a987202f2500ce1a9d07d8e1420f5491", + "annotations": { + "in-toto.io/predicate-type": "https://spdx.dev/Document" + } + } + ] +} +``` + +### Attestations as OCI artifacts + +You can configure the format of the attestation manifest using the +[`oci-artifact` option](/manuals/build/exporters/image-registry.md#synopsis) +for the `image` and `registry` exporters. If set to `true`, the structure of +the attestation manifest changes as follows: + +- An `artifactType` field is added to the attestation manifest, with a value of `application/vnd.docker.attestation.manifest.v1+json`. +- The `config` field is an [empty descriptor] instead of a "dummy" config. +- A `subject` field is also added, pointing to the image manifest that the attestation refers to. + +[empty descriptor]: https://github.com/opencontainers/image-spec/blob/main/manifest.md#guidance-for-an-empty-descriptor + +The following example shows an attestation with the OCI artifact format: + +```json +{ + "schemaVersion": 2, + "mediaType": "application/vnd.oci.image.manifest.v1+json", + "artifactType": "application/vnd.docker.attestation.manifest.v1+json", + "config": { + "mediaType": "application/vnd.oci.empty.v1+json", + "size": 2, + "digest": "sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "data": "e30=" + }, + "layers": [ + { + "mediaType": "application/vnd.in-toto+json", + "size": 2208, + "digest": "sha256:6d2f2c714a6bee3cf9e4d3cb9a966b629efea2dd8556ed81f19bd597b3325286", + "annotations": { + "in-toto.io/predicate-type": "https://slsa.dev/provenance/v0.2" + } + } + ], + "subject": { + "mediaType": "application/vnd.oci.image.manifest.v1+json", + "size": 1054, + "digest": "sha256:bc2046336420a2852ecf915786c20f73c4c1b50d7803aae1fd30c971a7d1cead", + "platform": { + "architecture": "amd64", + "os": "linux" + } + } +} +``` + ## What's next Learn more about the available attestation types and how to use them: From 1a9dc69bd0c2f425673ad3ca088b5b8cd947f004 Mon Sep 17 00:00:00 2001 From: David Karlsson <35727626+dvdksn@users.noreply.github.com> Date: Fri, 17 Jan 2025 17:06:00 +0100 Subject: [PATCH 002/699] chore: tidy templates, add comments Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com> --- layouts/_default/search.html | 8 ++++++++ layouts/index.metadata.json | 2 +- layouts/index.redirects.json | 22 ++++++++++++++++++++++ layouts/index.robots.txt | 6 ++++++ layouts/partials/github-links.html | 5 +++++ layouts/partials/head.html | 11 ----------- layouts/partials/meta.html | 9 ++++----- layouts/partials/pagemeta.html | 7 +++++++ layouts/partials/search-bar.html | 8 ++++++++ layouts/partials/sidebar/guides.html | 8 ++++++++ layouts/partials/sidebar/mainnav.html | 6 ++++++ layouts/partials/sidebar/sections.html | 8 ++++++++ layouts/partials/sidebar/tags.html | 5 +++++ layouts/partials/tooltip.html | 4 ++++ layouts/partials/utils/css.html | 5 +++++ layouts/partials/utils/description.html | 6 ++++++ layouts/partials/utils/keywords.html | 6 ++++++ layouts/partials/utils/title.html | 17 ----------------- layouts/sitemap.xml | 5 +++++ tailwind.config.js | 6 ------ 20 files changed, 114 insertions(+), 40 deletions(-) delete mode 100644 layouts/partials/utils/title.html diff --git a/layouts/_default/search.html b/layouts/_default/search.html index 1f9a03e168ab..f4e70cfe061f 100644 --- a/layouts/_default/search.html +++ b/layouts/_default/search.html @@ -35,6 +35,14 @@

{{ .Title }}

window.addEventListener("load", async function () { // Hydrate pagefind pagefind = await import("/pagefind/pagefind.js"); + await pagefind.options({ + ranking: { + termFrequency: 0.2, + pageLength: 0.75, + termSaturation: 1.4, + termSimilarity: 6.0, + }, + }); // Get the query parameter from the URL const urlParams = new URLSearchParams(window.location.search); diff --git a/layouts/index.metadata.json b/layouts/index.metadata.json index e3426bb18d26..acfaf21f2b80 100644 --- a/layouts/index.metadata.json +++ b/layouts/index.metadata.json @@ -1,6 +1,6 @@ [ {{- range where site.Pages "Params.sitemap" "!=" false -}} - {{- $title := partialCached "utils/title.html" . . -}} + {{- $title := .LinkTitle -}} {{- $desc := partialCached "utils/description.html" . . -}} {{- $kwd := partialCached "utils/keywords.html" . . -}} {{- $tags := slice -}} diff --git a/layouts/index.redirects.json b/layouts/index.redirects.json index 5add5074019b..6229dfc8d185 100644 --- a/layouts/index.redirects.json +++ b/layouts/index.redirects.json @@ -1,3 +1,25 @@ +{{- /* + + This template generates the redirects.json file used to generate 301 + redirects in production. It takes all the redirects defined in + data/redirects.yml, as well as all the aliases defined in front matter, and + outputs a simple key-value JSON file: + + { + "": "", + ... + } + + e.g. + + { + "/engine/reference/builder/": "/reference/dockerfile/", + ... + } + + */ +-}} + {{- $redirects := newScratch }} {{- range $i, $e := site.AllPages -}} {{- if .Params.aliases -}} diff --git a/layouts/index.robots.txt b/layouts/index.robots.txt index d3590928c9e8..3e9a658fdf96 100644 --- a/layouts/index.robots.txt +++ b/layouts/index.robots.txt @@ -1,3 +1,9 @@ +{{- /* + For Netlify deployments, we disallow all routes to prevent search + engines from indexing our preview sites. + */ +-}} + {{- if hugo.IsProduction -}} User-agent: * diff --git a/layouts/partials/github-links.html b/layouts/partials/github-links.html index 75ce8d543290..1f7e518b7393 100644 --- a/layouts/partials/github-links.html +++ b/layouts/partials/github-links.html @@ -1,3 +1,8 @@ +{{- /* + Adds links for editing the page or requesting changes: + - "Edit this page": Only in production, skips files from `_vendor/` (upstream repositories). + - "Request changes": Links to a pre-filled issue form. +*/ -}} {{ if hugo.IsProduction }} {{ with .File }} {{ if not (in .Filename "/_vendor/") }} diff --git a/layouts/partials/head.html b/layouts/partials/head.html index cadc04249b8e..0edada5a576b 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -1,16 +1,5 @@ - {{ partial "meta.html" . }} {{- if hugo.IsProduction -}} + diff --git a/layouts/partials/pagemeta.html b/layouts/partials/pagemeta.html index f799522409eb..426897e23e74 100644 --- a/layouts/partials/pagemeta.html +++ b/layouts/partials/pagemeta.html @@ -1,3 +1,10 @@ +{{- /* + Renders a table of contents (ToC) for the page. + - Uses `.Fragments.Headings` to generate a nested ToC if headings exist and `notoc` is not set to `true`. + - Limits heading levels to a min and max range (`$min` and `$max`). + - Wraps the ToC in a `data-pagefind-ignore` container to exclude it from search indexing. + - Includes a recursive template (`walkHeadingFragments`) to handle nested headings. +*/ -}} {{- $toc := false }} {{- with .Fragments }} {{- $toc = and (ne page.Params.notoc true) .Headings }} diff --git a/layouts/partials/search-bar.html b/layouts/partials/search-bar.html index 72da1f4e5c0e..6595e32d3ff7 100644 --- a/layouts/partials/search-bar.html +++ b/layouts/partials/search-bar.html @@ -43,6 +43,14 @@ \ No newline at end of file diff --git a/layouts/partials/sidebar/sections.html b/layouts/partials/sidebar/sections.html index 168c534f89de..25c84cbf3b75 100644 --- a/layouts/partials/sidebar/sections.html +++ b/layouts/partials/sidebar/sections.html @@ -104,4 +104,4 @@ {{- with .Params.sidebar.badge }} {{- partial "components/badge.html" (dict "color" .color "content" .text) }} {{- end }} -{{ end }} +{{ end }} \ No newline at end of file From 477ecdaacebbce022b753c7f405a7f716a62b5f8 Mon Sep 17 00:00:00 2001 From: Craig Osterhout <103533812+craig-osterhout@users.noreply.github.com> Date: Wed, 2 Apr 2025 12:21:50 -0700 Subject: [PATCH 263/699] hub: fix typo (#22351) ## Description Fixed typo for limits. 100 for unauthenticated and 200 for Personal. ## Related issues or tickets ## Reviews - [ ] Editorial review Signed-off-by: Craig --- content/manuals/subscription/details.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/subscription/details.md b/content/manuals/subscription/details.md index db7d160093af..593be8efe66b 100644 --- a/content/manuals/subscription/details.md +++ b/content/manuals/subscription/details.md @@ -42,7 +42,7 @@ Docker Personal includes: - 1 included repository with continuous vulnerability analysis in Docker Scout - Unlimited public Docker Hub repositories -- 100 pulls per 6 hours Docker Hub image pull rate limit for authenticated users +- 200 pulls per 6 hours Docker Hub image pull rate limit for authenticated users - 7-day Docker Build Cloud trial - 7-day Testcontainers Cloud trial From ce09959c3ced91c207357e38a96abc48fe2cc888 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Wed, 2 Apr 2025 15:46:24 -0400 Subject: [PATCH 264/699] fix: pagefind error (#22355) ## Description fix for new llms.txt page options rendering in search titles :') --- hugo_stats.json | 1 + layouts/partials/content-default.html | 2 +- pagefind.yml | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/hugo_stats.json b/hugo_stats.json index 191027bcfd2c..36588423e141 100644 --- a/hugo_stats.json +++ b/hugo_stats.json @@ -369,6 +369,7 @@ "mb-2", "mb-4", "mb-8", + "md-dropdown", "md:block", "md:flex-nowrap", "md:flex-row", diff --git a/layouts/partials/content-default.html b/layouts/partials/content-default.html index db1adbeee763..0c81432398d6 100644 --- a/layouts/partials/content-default.html +++ b/layouts/partials/content-default.html @@ -3,7 +3,7 @@ {{ partial "breadcrumbs.html" . }}

{{ .Title }} - + {{ partial "md-dropdown.html" . }}

diff --git a/pagefind.yml b/pagefind.yml index 9279805183cb..93e0c4385bc3 100644 --- a/pagefind.yml +++ b/pagefind.yml @@ -2,3 +2,4 @@ output_subdir: pagefind site: public exclude_selectors: - "table" + - ".md-dropdown" From 72cd41d94098eb84a1c3aa22cf8a19e28817c38c Mon Sep 17 00:00:00 2001 From: Ali Erturk TURKER Date: Thu, 3 Apr 2025 16:37:43 +0400 Subject: [PATCH 265/699] Fix wording for tmpfs destination path option. (#22339) This is likely a copy&paste error. Can be confusing for new docker users. ## Description ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/engine/storage/tmpfs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/engine/storage/tmpfs.md b/content/manuals/engine/storage/tmpfs.md index b4e186acb3d0..29473ada2bad 100644 --- a/content/manuals/engine/storage/tmpfs.md +++ b/content/manuals/engine/storage/tmpfs.md @@ -135,7 +135,7 @@ Valid options for `--mount type=tmpfs` include: | Option | Description | | :----------------------------- | :--------------------------------------------------------------------------------------------------------------------- | -| `destination`, `dst`, `target` | Size of the tmpfs mount in bytes. If unset, the default maximum size of a tmpfs volume is 50% of the host's total RAM. | +| `destination`, `dst`, `target` | Container path to mount into a tmpfs. | | `tmpfs-size` | Size of the tmpfs mount in bytes. If unset, the default maximum size of a tmpfs volume is 50% of the host's total RAM. | | `tmpfs-mode` | File mode of the tmpfs in octal. For instance, `700` or `0770`. Defaults to `1777` or world-writable. | From 936fad5e499607d0a88e12739ece3a6fbf21af96 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Thu, 3 Apr 2025 14:39:55 +0100 Subject: [PATCH 266/699] ENGDOCS-2515 (#22347) ## Description Freshness to DD setup section. The odd new sentence here and there, but mostly efficiency gains and tidying ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Co-authored-by: Sarah Sanders --- _vale/Docker/Acronyms.yml | 3 + content/manuals/desktop/_index.md | 26 +++-- .../install/enterprise-deployment/faq.md | 13 ++- .../msi-install-and-configure.md | 20 ++-- .../pkg-install-and-configure.md | 18 ++-- .../enterprise-deployment/use-intune.md | 14 +-- .../enterprise-deployment/use-jamf-pro.md | 14 +-- .../desktop/setup/install/linux/_index.md | 14 +-- .../desktop/setup/install/linux/archlinux.md | 4 +- .../desktop/setup/install/linux/debian.md | 7 +- .../desktop/setup/install/linux/fedora.md | 14 ++- .../desktop/setup/install/linux/rhel.md | 70 ++++++-------- .../desktop/setup/install/linux/ubuntu.md | 18 ++-- .../desktop/setup/install/mac-install.md | 24 +++-- .../install/mac-permission-requirements.md | 94 ++----------------- .../desktop/setup/install/windows-install.md | 57 ++++++----- .../windows-permission-requirements.md | 14 +-- content/manuals/desktop/setup/sign-in.md | 69 ++++++-------- content/manuals/desktop/setup/vm-vdi.md | 18 ++-- 19 files changed, 224 insertions(+), 287 deletions(-) diff --git a/_vale/Docker/Acronyms.yml b/_vale/Docker/Acronyms.yml index 1117c8f56b62..b1dc301aa2ee 100644 --- a/_vale/Docker/Acronyms.yml +++ b/_vale/Docker/Acronyms.yml @@ -50,6 +50,7 @@ exceptions: - GDB - GET - GHSA + - GNOME - GNU - GPG - GPL @@ -74,10 +75,12 @@ exceptions: - JIT - JSON - JSX + - KDE - LESS - LLDB - LTS - MAC + - MATE - MCP - mcp - MDM diff --git a/content/manuals/desktop/_index.md b/content/manuals/desktop/_index.md index 17c87b9cfcd5..2a9c655f586a 100644 --- a/content/manuals/desktop/_index.md +++ b/content/manuals/desktop/_index.md @@ -15,10 +15,14 @@ grid: [Windows](/desktop/setup/install/windows-install/), or [Linux](/desktop/setup/install/linux/). icon: download -- title: Explore Docker Desktop - description: Navigate Docker Desktop and learn about its key features. +- title: Learn about Docker Desktop + description: Navigate Docker Desktop. icon: feature_search link: /desktop/use-desktop/ +- title: Explore its key features + description: | + Find information about [Docker VMM](/desktop/features/vmm/), [WSL](/desktop/features/wsl/), [deploying on Kubernetes](/desktop/features/kubernetes/), and more. + icon: category - title: View the release notes description: Find out about new features, improvements, and bug fixes. icon: note_add @@ -27,11 +31,6 @@ grid: description: Explore general FAQs or FAQs for specific platforms. icon: help link: /desktop/troubleshoot-and-support/faqs/general/ -- title: Find additional resources - description: | - Find information on networking features, deploying on Kubernetes, and more. - icon: category - link: /desktop/features/kubernetes/ - title: Give feedback description: Provide feedback on Docker Desktop or Docker Desktop features. icon: sms @@ -51,15 +50,18 @@ It provides a straightforward GUI (Graphical User Interface) that lets you manag Docker Desktop reduces the time spent on complex setups so you can focus on writing code. It takes care of port mappings, file system concerns, and other default settings, and is regularly updated with bug fixes and security updates. +Docker Desktop integrates with your preferred development tools and languages, and gives you access to a vast ecosystem of trusted images and templates via Docker Hub. This empowers teams to accelerate development, automate builds, enable CI/CD workflows, and collaborate securely through shared repositories. + {{< tabs >}} {{< tab name="What's included in Docker Desktop?" >}} - [Docker Engine](/manuals/engine/_index.md) - Docker CLI client -- [Docker Scout](../scout/_index.md) (additional subscription may apply) +- [Docker Scout](../scout/_index.md) - [Docker Build](/manuals/build/_index.md) -- [Docker Extensions](../extensions/_index.md) - [Docker Compose](/manuals/compose/_index.md) +- [Ask Gordon](/manuals/desktop/features/gordon/_index.md) +- [Docker Extensions](../extensions/_index.md) - [Docker Content Trust](/manuals/engine/security/trust/_index.md) - [Kubernetes](https://github.com/kubernetes/kubernetes/) - [Credential Helper](https://github.com/docker/docker-credential-helpers/) @@ -78,10 +80,4 @@ Docker Desktop reduces the time spent on complex setups so you can focus on writ {{< /tab >}} {{< /tabs >}} -Docker Desktop works with your choice of development tools and languages and -gives you access to a vast library of certified images and templates in -[Docker Hub](https://hub.docker.com/). This allows development teams to extend -their environment to rapidly auto-build, continuously integrate, and collaborate -using a secure repository. - {{< grid >}} diff --git a/content/manuals/desktop/setup/install/enterprise-deployment/faq.md b/content/manuals/desktop/setup/install/enterprise-deployment/faq.md index 979485823707..71e689bab4d2 100644 --- a/content/manuals/desktop/setup/install/enterprise-deployment/faq.md +++ b/content/manuals/desktop/setup/install/enterprise-deployment/faq.md @@ -1,5 +1,6 @@ --- title: Enterprise deployment FAQs +linkTitle: FAQs description: Frequently asked questions for deploying Docker Desktop at scale keywords: msi, deploy, docker desktop, faqs, pkg, mdm, jamf, intune, windows, mac, enterprise, admin tags: [FAQ, admin] @@ -10,11 +11,15 @@ aliases: ## MSI +Common questions about installing Docker Desktop using the MSI installer. + ### What happens to user data if they have an older Docker Desktop installation (i.e. `.exe`)? -If they have an older `.exe` installation, users must [uninstall](/manuals/desktop/uninstall.md) this version before using the new MSI version. This deletes all Docker containers, images, volumes, and other Docker-related data local to the machine, and removes the files generated by the application. For older versions, users should [backup](/manuals/desktop/settings-and-maintenance/backup-and-restore.md) any containers that they want to keep. +Users must [uninstall](/manuals/desktop/uninstall.md) older `.exe` installations before using the new MSI version. This deletes all Docker containers, images, volumes, and other Docker-related data local to the machine, and removes the files generated by Docker Desktop. + +To preserve existing data before uninstalling, users should [backup](/manuals/desktop/settings-and-maintenance/backup-and-restore.md) their containers and volumes. -For Docker Desktop versions 4.30 and later of the `exe` installer, a `-keep-data` flag is available. It removes Docker Desktop but keeps underlying data, such as the VMs that run containers. +For Docker Desktop 4.30 and later, the `.exe` installer includes a `-keep-data` flag that removes Docker Desktop while preserving underlying resources such as the container VMs: ```powershell & 'C:\Program Files\Docker\Docker\Docker Desktop Installer.exe' uninstall -keep-data @@ -22,11 +27,11 @@ For Docker Desktop versions 4.30 and later of the `exe` installer, a `-keep-data ### What happens if the user's machine has an older `.exe` installation? -The new MSI installer checks if a previous version was installed and doesn't proceed with the installation. Instead, it prompts the user to uninstall their current/old version first, before retrying to install the MSI version. +The MSI installer detects older `.exe` installations and blocks the installation until the previous version is uninstalled. It prompts the user to uninstall their current/old version first, before retrying to install the MSI version. ### My installation failed, how do I find out what happened? -MSI installations can sometimes fail unexpectedly and not provide users with much information about what went wrong. +MSI installations may fail silently, offering little diagnostic feedback. To debug a failed installation, run the install again with verbose logging enabled: diff --git a/content/manuals/desktop/setup/install/enterprise-deployment/msi-install-and-configure.md b/content/manuals/desktop/setup/install/enterprise-deployment/msi-install-and-configure.md index 2c783f5a862a..48750fc0845a 100644 --- a/content/manuals/desktop/setup/install/enterprise-deployment/msi-install-and-configure.md +++ b/content/manuals/desktop/setup/install/enterprise-deployment/msi-install-and-configure.md @@ -1,5 +1,5 @@ --- -title: Use the MSI installer +title: MSI installer description: Understand how to use the MSI installer. Also explore additional configuration options. keywords: msi, windows, docker desktop, install, deploy, configure, admin, mdm tags: [admin] @@ -21,7 +21,7 @@ The MSI package supports various MDM (Mobile Device Management) solutions, makin 2. Under **Docker Desktop**, select the **Deploy** page. 3. From the **Windows OS** tab, select the **Download MSI installer** button. 4. Once downloaded, double-click `Docker Desktop Installer.msi` to run the installer. -5. Once you've accepted the license agreement, you can choose the install location. By default, Docker Desktop is installed at `C:\Program Files\Docker\Docker`. +5. After accepting the license agreement, choose the install location. By default, Docker Desktop is installed at `C:\Program Files\Docker\Docker`. 6. Configure the Docker Desktop installation. You can: - Create a desktop shortcut @@ -30,11 +30,11 @@ The MSI package supports various MDM (Mobile Device Management) solutions, makin - Disable Windows Container usage - - Select the engine for Docker Desktop. Either WSL or Hyper-V. If your system only supports one of the two options, you won't be able to select which backend to use. + - Select the Docker Desktop backend: WSL or Hyper-V. If only one is supported by your system, you won't be able to choose. 7. Follow the instructions on the installation wizard to authorize the installer and proceed with the install. 8. When the installation is successful, select **Finish** to complete the installation process. -If your administrator account is different to your user account, you must add the user to the **docker-users** group: +If your administrator account is different from your user account, you must add the user to the **docker-users** group: 1. Run **Computer Management** as an **administrator**. 2. Navigate to **Local Users and Groups** > **Groups** > **docker-users**. 3. Right-click to add the user to the group. @@ -42,7 +42,7 @@ If your administrator account is different to your user account, you must add th > [!NOTE] > -> When installing Docker Desktop with the MSI, in-app updates are automatically disabled. This feature ensures your organization maintains the required Docker Desktop version. For Docker Desktop installed with the .exe installer, in-app updates remain supported. +> When installing Docker Desktop with the MSI, in-app updates are automatically disabled. This ensures organizations can maintain version consistency and prevent unapproved updates. For Docker Desktop installed with the .exe installer, in-app updates remain supported. > > Docker Desktop notifies you when an update is available. To update Docker Desktop, download the latest installer from the Docker Admin Console. Navigate to the **Deploy** page > under **Docker Desktop**. > @@ -116,7 +116,7 @@ msiexec /i "DockerDesktop.msi" /L*V ".\msi.log" /passive /norestart > [!TIP] > -> Some useful tips to remember when creating a value that expects a JSON string as it’s value: +> When creating a value that expects a JSON string: > > - The property expects a JSON formatted string > - The string should be wrapped in double quotes @@ -142,7 +142,7 @@ IdentifyingNumber Name ``` > [!NOTE] > -> This command can take some time to return, depending on the number of installed applications. +> This command may take some time, depending on the number of installed applications. `IdentifyingNumber` is the applications product code and can be used to uninstall Docker Desktop. For example: @@ -202,11 +202,11 @@ msiexec /x "DockerDesktop.msi" /quiet Additionally, you can also use `/norestart` or `/forcerestart` to control reboot behaviour. -By default, the installer reboots the machine after a successful installation. When ran silently, the reboot is automatic and the user is not prompted. +By default, the installer reboots the machine after a successful installation. When run silently, the reboot is automatic and the user is not prompted. ## Analytics -The MSI installer collects anonymous usage statistics relating to install only. This is to better understand user behaviour and to improve the user experience by identifying and addressing issues or optimizing popular features. +The MSI installer collects anonymous usage statistics relating to installation only. This is to better understand user behaviour and to improve the user experience by identifying and addressing issues or optimizing popular features. ### How to opt-out @@ -239,7 +239,7 @@ The registry key is as follows: SOFTWARE\Docker Inc.\Docker Desktop\DisableMsiAnalytics ``` -When analytics is disabled, this key has a value of `1`. +When analytics is disabled, this key is set to `1`. ## Additional resources diff --git a/content/manuals/desktop/setup/install/enterprise-deployment/pkg-install-and-configure.md b/content/manuals/desktop/setup/install/enterprise-deployment/pkg-install-and-configure.md index 777d2f774789..94f0ec00e16a 100644 --- a/content/manuals/desktop/setup/install/enterprise-deployment/pkg-install-and-configure.md +++ b/content/manuals/desktop/setup/install/enterprise-deployment/pkg-install-and-configure.md @@ -1,5 +1,5 @@ --- -title: Use the PKG installer +title: PKG installer description: Understand how to use the PKG installer. Also explore additional configuration options. keywords: pkg, mac, docker desktop, install, deploy, configure, admin, mdm tags: [admin] @@ -16,17 +16,17 @@ The PKG package supports various MDM (Mobile Device Management) solutions, makin 2. Under **Docker Desktop**, select the **Deploy** page. 3. From the **macOS** tab, select the **Download PKG installer** button. 4. Once downloaded, double-click `Docker.pkg` to run the installer. -5. Follow the instructions on the installation wizard to authorize the installer and proceed with the install. - - **Introduction**: Select `Continue`. - - **License**: Review the license agreement and select `Agree`. - - **Destination Select**: This step is optional. It is recommended that you don't change the default installation destination (usually `Macintosh HD`). Select `Continue`. - - **Installation Type**: Select `Install`. +5. Follow the instructions on the installation wizard to authorize the installer and proceed with the installation. + - **Introduction**: Select **Continue**. + - **License**: Review the license agreement and select **Agree**. + - **Destination Select**: This step is optional. It is recommended that you keep the default installation destination (usually `Macintosh HD`). Select **Continue**. + - **Installation Type**: Select **Install**. - **Installation**: Authenticate using your administrator password or Touch ID. - - **Summary**: After the installation completes, select `Close`. + - **Summary**: When the installation completes, select **Close**. > [!NOTE] > -> When installing Docker Desktop with the PKG, in-app updates are automatically disabled. This feature ensures your organization maintains the required Docker Desktop version. For Docker Desktop installed with the .dmg installer, in-app updates remain supported. +> When installing Docker Desktop with the PKG, in-app updates are automatically disabled. This ensures organizations can maintain version consistency and prevent unapproved updates. For Docker Desktop installed with the `.dmg` installer, in-app updates remain supported. > > Docker Desktop notifies you when an update is available. To update Docker Desktop, download the latest installer from the Docker Admin Console. Navigate to the **Deploy** page > under **Docker Desktop**. > @@ -45,5 +45,5 @@ The PKG package supports various MDM (Mobile Device Management) solutions, makin ## Additional resources -- See how you can deploy Docker Desktop for Mac via [Intune](use-intune.md) or [Jamf Pro](use-jamf-pro.md) +- See how you can deploy Docker Desktop for Mac using [Intune](use-intune.md) or [Jamf Pro](use-jamf-pro.md) - Explore how to [Enforce sign-in](/manuals/security/for-admins/enforce-sign-in/methods.md#plist-method-mac-only) for your users. \ No newline at end of file diff --git a/content/manuals/desktop/setup/install/enterprise-deployment/use-intune.md b/content/manuals/desktop/setup/install/enterprise-deployment/use-intune.md index 721b60359d5d..7c3a137ebdea 100644 --- a/content/manuals/desktop/setup/install/enterprise-deployment/use-intune.md +++ b/content/manuals/desktop/setup/install/enterprise-deployment/use-intune.md @@ -1,5 +1,5 @@ --- -title: Use Intune +title: Deploy with Intune description: Use Intune, Microsoft's cloud-based device management tool, to deploy Docker Desktop keywords: microsoft, windows, docker desktop, deploy, mdm, enterprise, administrator, mac, pkg, dmg tags: [admin] @@ -11,7 +11,7 @@ aliases: {{< summary-bar feature_name="Intune" >}} -Learn how to deploy Docker Desktop for Windows and Mac using Intune, Microsoft's cloud-based device management tool. +Learn how to deploy Docker Desktop on Windows and macOS devices using Microsoft Intune. It covers app creation, installer configuration, and assignment to users or devices. {{< tabs >}} {{< tab name="Windows" >}} @@ -20,7 +20,7 @@ Learn how to deploy Docker Desktop for Windows and Mac using Intune, Microsoft's 2. Add a new app. Select **Apps**, then **Windows**, then **Add**. 3. For the app type, select **Windows app (Win32)** 4. Select the `intunewin` package. -5. Complete any relevant details such as the description, publisher, or app version and then select **Next**. +5. Fill in the required details, such as the description, publisher, or app version and then select **Next**. 6. Optional: On the **Program** tab, you can update the **Install command** field to suit your needs. The field is pre-populated with `msiexec /i "DockerDesktop.msi" /qn`. See the [Common installation scenarios](msi-install-and-configure.md) for examples on the changes you can make. > [!TIP] @@ -29,9 +29,9 @@ Learn how to deploy Docker Desktop for Windows and Mac using Intune, Microsoft's > > This is because the Docker Desktop installer installs Windows features depending on your engine selection and also updates the membership of the `docker-users` local group. > - > You may also want to set Intune to determine behaviour based on return codes and watch for a return code of `3010`. + > You may also want to set Intune to determine behaviour based on return codes and watch for a return code of `3010`. Return code 3010 means the installation succeeded but a reboot is required. -7. Complete the rest of the tabs and then review and create the app. +7. Complete the remaining tabs, then review and create the app. {{< /tab >}} {{< tab name="Mac" >}} @@ -39,7 +39,7 @@ Learn how to deploy Docker Desktop for Windows and Mac using Intune, Microsoft's First, upload the package: 1. Sign in to your Intune admin center. -2. Add a new app. Select **Apps**, then **macOSs**, then **Add**. +2. Add a new app. Select **Apps**, then **macOS**, then **Add**. 3. Select **Line-of-business app** and then **Select**. 4. Upload the `Docker.pkg` file and fill in the required details. @@ -55,4 +55,4 @@ Next, assign the app: ## Additional resources - [Explore the FAQs](faq.md). -- Learn how to [Enforce sign-in](/manuals/security/for-admins/enforce-sign-in/_index.md) for your users. \ No newline at end of file +- Learn how to [enforce sign-in](/manuals/security/for-admins/enforce-sign-in/_index.md) for your users. \ No newline at end of file diff --git a/content/manuals/desktop/setup/install/enterprise-deployment/use-jamf-pro.md b/content/manuals/desktop/setup/install/enterprise-deployment/use-jamf-pro.md index b0f2d03a9d58..7443d259afa0 100644 --- a/content/manuals/desktop/setup/install/enterprise-deployment/use-jamf-pro.md +++ b/content/manuals/desktop/setup/install/enterprise-deployment/use-jamf-pro.md @@ -1,6 +1,6 @@ --- -title: Use Jamf Pro -description: Use Jamf Pro to deploy Docker Desktop +title: Deploy with Jamf Pro +description: Use Jamf Pro to deploy Docker Desktop for Mac keywords: jamf, mac, docker desktop, deploy, mdm, enterprise, administrator, pkg tags: [admin] weight: 40 @@ -8,25 +8,25 @@ weight: 40 {{< summary-bar feature_name="Jamf Pro" >}} -Learn how to deploy Docker Desktop for Mac using Jamf Pro. +Learn how to deploy Docker Desktop for Mac using Jamf Pro, including uploading the installer and creating a deployment policy. First, upload the package: -1. From the Jamf pro console, Navigate to **Computers** > **Management Settings** > **Computer Management** > **Packages**. +1. From the Jamf Pro console, navigate to **Computers** > **Management Settings** > **Computer Management** > **Packages**. 2. Select **New** to add a new package. 3. Upload the `Docker.pkg` file. Next, create a policy for deployment: 1. Navigate to **Computers** > **Policies**. -2. Select **New**to create a new policy. +2. Select **New** to create a new policy. 3. Enter a name for the policy, for example "Deploy Docker Desktop". 4. Under the **Packages** tab, add the Docker package you uploaded. -5. Configure the scope to target the devices or device groups you want to install Docker on. +5. Configure the scope to target the devices or device groups on which you want to install Docker. 6. Save the policy and deploy. For more information, see [Jamf Pro's official documentation](https://learn.jamf.com/en-US/bundle/jamf-pro-documentation-current/page/Policies.html). ## Additional resources -- Learn how to [Enforce sign-in](/manuals/security/for-admins/enforce-sign-in/_index.md) for your users. \ No newline at end of file +- Learn how to [enforce sign-in](/manuals/security/for-admins/enforce-sign-in/_index.md) for your users. \ No newline at end of file diff --git a/content/manuals/desktop/setup/install/linux/_index.md b/content/manuals/desktop/setup/install/linux/_index.md index 5cd8e9f3ab98..f034da1a6e1f 100644 --- a/content/manuals/desktop/setup/install/linux/_index.md +++ b/content/manuals/desktop/setup/install/linux/_index.md @@ -16,7 +16,7 @@ aliases: > **Docker Desktop terms** > > Commercial use of Docker Desktop in larger enterprises (more than 250 -> employees OR more than $10 million USD in annual revenue) requires a [paid +> employees or more than $10 million USD in annual revenue) requires a [paid > subscription](https://www.docker.com/pricing/). This page contains information about general system requirements, supported platforms, and instructions on how to install Docker Desktop for Linux. @@ -27,11 +27,11 @@ This page contains information about general system requirements, supported plat > >This means images and containers deployed on the Linux Docker Engine (before installation) are not available in Docker Desktop for Linux. > -> {{< accordion title=" What is the difference between Docker Desktop for Linux and Docker Engine?" >}} +> {{< accordion title=" Docker Desktop vs Docker Engine: What's the difference?" >}} > [!IMPORTANT] > -> For commercial use of Docker Engine obtained via Docker Desktop within larger enterprises (exceeding 250 employees OR with annual revenue surpassing $10 million USD), a [paid subscription](https://www.docker.com/pricing/) is required. +> For commercial use of Docker Engine obtained via Docker Desktop within larger enterprises (exceeding 250 employees or with annual revenue surpassing $10 million USD), a [paid subscription](https://www.docker.com/pricing/) is required. Docker Desktop for Linux provides a user-friendly graphical interface that simplifies the management of containers and services. It includes Docker Engine as this is the core technology that powers Docker containers. Docker Desktop for Linux also comes with additional features like Docker Scout and Docker Extensions. @@ -82,7 +82,7 @@ Docker CLI commands target Docker Desktop. On shutdown, Docker Desktop resets the current context to the `default` context. Use the `docker context ls` command to view what contexts are available on your -machine. The current context is indicated with an asterisk (`*`); +machine. The current context is indicated with an asterisk (`*`). ```console $ docker context ls @@ -114,7 +114,7 @@ Refer to the [Docker Context documentation](/manuals/engine/manage-resources/con ## Supported platforms -Docker provides `.deb` and `.rpm` packages from the following Linux distributions +Docker provides `.deb` and `.rpm` packages for the following Linux distributions and architectures: | Platform | x86_64 / amd64 | @@ -137,8 +137,8 @@ To install Docker Desktop successfully, your Linux host must meet the following - KVM virtualization support. Follow the [KVM virtualization support instructions](#kvm-virtualization-support) to check if the KVM kernel modules are enabled and how to provide access to the KVM device. - QEMU must be version 5.2 or later. We recommend upgrading to the latest version. - systemd init system. -- Gnome, KDE, or MATE Desktop environment. - - For many Linux distributions, the Gnome environment does not support tray icons. To add support for tray icons, you need to install a Gnome extension. For example, [AppIndicator](https://extensions.gnome.org/extension/615/appindicator-support/). +- GNOME, KDE, or MATE desktop environment. + - For many Linux distributions, the GNOME environment does not support tray icons. To add support for tray icons, you need to install a GNOME extension. For example, [AppIndicator](https://extensions.gnome.org/extension/615/appindicator-support/). - At least 4 GB of RAM. - Enable configuring ID mapping in user namespaces, see [File sharing](/manuals/desktop/troubleshoot-and-support/faqs/linuxfaqs.md#how-do-i-enable-file-sharing). Note that for Docker Desktop version 4.35 and later, this is not required anymore. - Recommended: [Initialize `pass`](/manuals/desktop/setup/sign-in.md#credentials-management-for-linux-users) for credentials management. diff --git a/content/manuals/desktop/setup/install/linux/archlinux.md b/content/manuals/desktop/setup/install/linux/archlinux.md index 6a6c03bf5f9b..06ea014d235e 100644 --- a/content/manuals/desktop/setup/install/linux/archlinux.md +++ b/content/manuals/desktop/setup/install/linux/archlinux.md @@ -11,6 +11,8 @@ aliases: - /desktop/install/linux/archlinux/ --- +{{< summary-bar feature_name="Docker Desktop Archlinux" >}} + > **Docker Desktop terms** > > Commercial use of Docker Desktop in larger enterprises (more than 250 @@ -19,7 +21,7 @@ aliases: This page contains information on how to install, launch and upgrade Docker Desktop on an Arch-based distribution. -{{< summary-bar feature_name="Docker Desktop Archlinux" >}} + ## Prerequisites diff --git a/content/manuals/desktop/setup/install/linux/debian.md b/content/manuals/desktop/setup/install/linux/debian.md index c18bfbfac204..7938ea07b775 100644 --- a/content/manuals/desktop/setup/install/linux/debian.md +++ b/content/manuals/desktop/setup/install/linux/debian.md @@ -27,8 +27,7 @@ To install Docker Desktop successfully, you must: - Meet the [general system requirements](_index.md#general-system-requirements). - Have a 64-bit version of Debian 12. - For a Gnome Desktop environment, you must also install AppIndicator and KStatusNotifierItem [Gnome extensions](https://extensions.gnome.org/extension/615/appindicator-support/). - -- For non-Gnome Desktop environments, `gnome-terminal` must be installed: +- If you're not using GNOME, you must install `gnome-terminal` to enable terminal access from Docker Desktop: ```console $ sudo apt install gnome-terminal @@ -43,7 +42,7 @@ Recommended approach to install Docker Desktop on Debian: 2. Download the latest [DEB package](https://desktop.docker.com/linux/main/amd64/docker-desktop-amd64.deb?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-linux-amd64). For checksums, see the [Release notes](/manuals/desktop/release-notes.md). -3. Install the package with apt as follows: +3. Install the package using `apt`: ```console $ sudo apt-get update @@ -61,7 +60,7 @@ Recommended approach to install Docker Desktop on Debian: By default, Docker Desktop is installed at `/opt/docker-desktop`. -There are a few post-install configuration steps done through the post-install script contained in the deb package. +The RPM package includes a post-install script that completes additional setup steps automatically. The post-install script: diff --git a/content/manuals/desktop/setup/install/linux/fedora.md b/content/manuals/desktop/setup/install/linux/fedora.md index 67303683eb7b..4148069837ff 100644 --- a/content/manuals/desktop/setup/install/linux/fedora.md +++ b/content/manuals/desktop/setup/install/linux/fedora.md @@ -26,14 +26,12 @@ To install Docker Desktop successfully, you must: - Meet the [general system requirements](_index.md#general-system-requirements). - Have a 64-bit version of Fedora 40 or Fedora 41. +- For a GNOME desktop environment you must install AppIndicator and KStatusNotifierItem [GNOME extensions](https://extensions.gnome.org/extension/615/appindicator-support/). +- If you're not using GNOME, you must install `gnome-terminal` to enable terminal access from Docker Desktop: -Additionally, for a GNOME desktop environment you must install AppIndicator and KStatusNotifierItem [GNOME extensions](https://extensions.gnome.org/extension/615/appindicator-support/). - -For non-GNOME desktop environments, `gnome-terminal` must be installed: - -```console -$ sudo dnf install gnome-terminal -``` + ```console + $ sudo dnf install gnome-terminal + ``` ## Install Docker Desktop @@ -51,7 +49,7 @@ To install Docker Desktop on Fedora: By default, Docker Desktop is installed at `/opt/docker-desktop`. -There are a few post-install configuration steps done through the post-install script contained in the RPM package. +The RPM package includes a post-install script that completes additional setup steps automatically. The post-install script: diff --git a/content/manuals/desktop/setup/install/linux/rhel.md b/content/manuals/desktop/setup/install/linux/rhel.md index d0c2eabf6007..88f0ae7aad74 100644 --- a/content/manuals/desktop/setup/install/linux/rhel.md +++ b/content/manuals/desktop/setup/install/linux/rhel.md @@ -6,11 +6,6 @@ keywords: red hat, red hat enterprise linux, rhel, rpm, title: Install Docker Desktop on RHEL linkTitle: RHEL download-url-base: https://download.docker.com/linux/rhel -params: - sidebar: - badge: - color: green - text: New aliases: - /desktop/install/linux/rhel/ --- @@ -18,7 +13,7 @@ aliases: > **Docker Desktop terms** > > Commercial use of Docker Desktop in larger enterprises (more than 250 -> employees OR more than $10 million USD in annual revenue) requires a [paid +> employees or more than $10 million USD in annual revenue) requires a [paid > subscription](https://www.docker.com/pricing/). This page contains information on how to install, launch and upgrade Docker Desktop on a Red Hat Enterprise Linux (RHEL) distribution. @@ -31,57 +26,54 @@ To install Docker Desktop successfully, you must: - Have a 64-bit version of either RHEL 8 or RHEL 9. - Have a [Docker account](/manuals/accounts/create-account.md), as authentication is required for Docker Desktop on RHEL. -If you don't have `pass` installed, or it can't be installed, you must enable -[CodeReady Linux Builder (CRB) repository](https://access.redhat.com/articles/4348511) -and -[Extra Packages for Enterprise Linux (EPEL)](https://docs.fedoraproject.org/en-US/epel/). +- If `pass` is not installed, or it can't be installed, you must enable [CodeReady Linux Builder (CRB) repository](https://access.redhat.com/articles/4348511) and [Extra Packages for Enterprise Linux (EPEL)](https://docs.fedoraproject.org/en-US/epel/). {{< tabs group="os_version" >}} {{< tab name="RHEL 9" >}} -```console -$ sudo subscription-manager repos --enable codeready-builder-for-rhel-9-$(arch)-rpms -$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm -$ sudo dnf install pass -``` + ```console + $ sudo subscription-manager repos --enable codeready-builder-for-rhel-9-$(arch)-rpms + $ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm + $ sudo dnf install pass + ``` {{< /tab >}} {{< tab name="RHEL 8" >}} -```console -$ sudo subscription-manager repos --enable codeready-builder-for-rhel-8-$(arch)-rpms -$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -$ sudo dnf install pass -``` + ```console + $ sudo subscription-manager repos --enable codeready-builder-for-rhel-8-$(arch)-rpms + $ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm + $ sudo dnf install pass + ``` {{< /tab >}} {{< /tabs >}} -Additionally, for a GNOME desktop environment you must install AppIndicator and KStatusNotifierItem [GNOME extensions](https://extensions.gnome.org/extension/615/appindicator-support/). You must also enable EPEL. +- For a GNOME desktop environment you must install AppIndicator and KStatusNotifierItem [GNOME extensions](https://extensions.gnome.org/extension/615/appindicator-support/). You must also enable EPEL. {{< tabs group="os_version" >}} {{< tab name="RHEL 9" >}} -```console -$ # enable EPEL as described above -$ sudo dnf install gnome-shell-extension-appindicator -$ sudo gnome-extensions enable appindicatorsupport@rgcjonas.gmail.com -``` + ```console + $ # enable EPEL as described above + $ sudo dnf install gnome-shell-extension-appindicator + $ sudo gnome-extensions enable appindicatorsupport@rgcjonas.gmail.com + ``` {{< /tab >}} {{< tab name="RHEL 8" >}} -```console -$ # enable EPEL as described above -$ sudo dnf install gnome-shell-extension-appindicator -$ sudo dnf install gnome-shell-extension-desktop-icons -$ sudo gnome-shell-extension-tool -e appindicatorsupport@rgcjonas.gmail.com -``` + ```console + $ # enable EPEL as described above + $ sudo dnf install gnome-shell-extension-appindicator + $ sudo dnf install gnome-shell-extension-desktop-icons + $ sudo gnome-shell-extension-tool -e appindicatorsupport@rgcjonas.gmail.com + ``` {{< /tab >}} {{< /tabs >}} -For non-GNOME desktop environments, `gnome-terminal` must be installed: +- If you're not using GNOME, you must install `gnome-terminal` to enable terminal access from Docker Desktop: -```console -$ sudo dnf install gnome-terminal -``` + ```console + $ sudo dnf install gnome-terminal + ``` ## Install Docker Desktop @@ -101,14 +93,14 @@ To install Docker Desktop on RHEL: $ sudo dnf install ./docker-desktop-x86_64-rhel.rpm ``` -There are a few post-install configuration steps done through the post-install script contained in the RPM package. +The RPM package includes a post-install script that completes additional setup steps automatically. The post-install script: - Sets the capability on the Docker Desktop binary to map privileged ports and set resource limits. - Adds a DNS name for Kubernetes to `/etc/hosts`. - Creates a symlink from `/usr/local/bin/com.docker.cli` to `/usr/bin/docker`. - This is because the classic Docker CLI is installed at `/usr/bin/docker`. The Docker Desktop installer also installs a Docker CLI binary that includes cloud-integration capabilities and is essentially a wrapper for the Compose CLI, at`/usr/local/bin/com.docker.cli`. The symlink ensures that the wrapper can access the classic Docker CLI. + This is because the classic Docker CLI is installed at `/usr/bin/docker`. The Docker Desktop installer also installs a Docker CLI binary that includes cloud-integration capabilities and is essentially a wrapper for the Compose CLI, at `/usr/local/bin/com.docker.cli`. The symlink ensures that the wrapper can access the classic Docker CLI. - Creates a symlink from `/usr/libexec/qemu-kvm` to `/usr/local/bin/qemu-system-x86_64`. ## Launch Docker Desktop @@ -140,7 +132,7 @@ $ sudo dnf install ./docker-desktop--rhel.rpm ## Next steps -- Explore [Docker's subscriptions](https://www.docker.com/pricing/) to see what Docker can offer you. +- Review [Docker's subscriptions](https://www.docker.com/pricing/) to see what Docker can offer you. - Take a look at the [Docker workshop](/get-started/workshop/_index.md) to learn how to build an image and run it as a containerized application. - [Explore Docker Desktop](/manuals/desktop/use-desktop/_index.md) and all its features. - [Troubleshooting](/manuals/desktop/troubleshoot-and-support/troubleshoot/_index.md) describes common problems, workarounds, how to run and submit diagnostics, and submit issues. diff --git a/content/manuals/desktop/setup/install/linux/ubuntu.md b/content/manuals/desktop/setup/install/linux/ubuntu.md index 43cc7e7e09cc..282bb8d81849 100644 --- a/content/manuals/desktop/setup/install/linux/ubuntu.md +++ b/content/manuals/desktop/setup/install/linux/ubuntu.md @@ -1,5 +1,5 @@ --- -description: Learn how to install, launch and upgrade Docker Desktop on Ubuntu. This +description: Learn how to install, launch, and upgrade Docker Desktop on Ubuntu. This quick guide will cover prerequisites, installation methods, and more. keywords: install docker ubuntu, ubuntu install docker, install docker on ubuntu, docker install ubuntu, how to install docker on ubuntu, ubuntu docker install, docker @@ -18,7 +18,7 @@ aliases: > **Docker Desktop terms** > > Commercial use of Docker Desktop in larger enterprises (more than 250 -> employees OR more than $10 million USD in annual revenue) requires a [paid +> employees or more than $10 million USD in annual revenue) requires a [paid > subscription](https://www.docker.com/pricing/). This page contains information on how to install, launch and upgrade Docker Desktop on an Ubuntu distribution. @@ -29,7 +29,7 @@ To install Docker Desktop successfully, you must: - Meet the [general system requirements](_index.md#general-system-requirements). - Have an x86-64 system with Ubuntu 22.04, 24.04, or the latest non-LTS version. -- For non-Gnome Desktop environments, `gnome-terminal` must be installed: +- If you're not using GNOME, you must install `gnome-terminal` to enable terminal access from Docker Desktop: ```console $ sudo apt install gnome-terminal ``` @@ -43,7 +43,7 @@ Recommended approach to install Docker Desktop on Ubuntu: 2. Download the latest [DEB package](https://desktop.docker.com/linux/main/amd64/docker-desktop-amd64.deb?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-linux-amd64). For checksums, see the [Release notes](/manuals/desktop/release-notes.md). -3. Install the package with apt as follows: +3. Install the package using `apt`: ```console $ sudo apt-get update @@ -61,14 +61,14 @@ Recommended approach to install Docker Desktop on Ubuntu: By default, Docker Desktop is installed at `/opt/docker-desktop`. -There are a few post-install configuration steps done through the post-install script contained in the deb package. +The DEB package includes a post-install script that completes additional setup steps automatically. The post-install script: - Sets the capability on the Docker Desktop binary to map privileged ports and set resource limits. - Adds a DNS name for Kubernetes to `/etc/hosts`. - Creates a symlink from `/usr/local/bin/com.docker.cli` to `/usr/bin/docker`. - This is because the classic Docker CLI is installed at `/usr/bin/docker`. The Docker Desktop installer also installs a Docker CLI binary that includes cloud-integration capabilities and is essentially a wrapper for the Compose CLI, at`/usr/local/bin/com.docker.cli`. The symlink ensures that the wrapper can access the classic Docker CLI. + This is because the classic Docker CLI is installed at `/usr/bin/docker`. The Docker Desktop installer also installs a Docker CLI binary that includes cloud-integration capabilities and is essentially a wrapper for the Compose CLI, at `/usr/local/bin/com.docker.cli`. The symlink ensures that the wrapper can access the classic Docker CLI. ## Launch Docker Desktop @@ -76,7 +76,7 @@ The post-install script: ## Upgrade Docker Desktop -Once a new version for Docker Desktop is released, the Docker UI shows a notification. +When a new version for Docker Desktop is released, the Docker UI shows a notification. You need to download the new package each time you want to upgrade Docker Desktop and run: ```console @@ -85,8 +85,8 @@ $ sudo apt-get install ./docker-desktop-amd64.deb ## Next steps -- Explore [Docker's subscriptions](https://www.docker.com/pricing/) to see what Docker can offer you. -- Take a look at the [Docker workshop](/get-started/workshop/_index.md) to learn how to build an image and run it as a containerized application. +- Review [Docker's subscriptions](https://www.docker.com/pricing/) to see what Docker can offer you. +- Follow the [Docker workshop](/get-started/workshop/_index.md) to learn how to build an image and run it as a containerized application. - [Explore Docker Desktop](/manuals/desktop/use-desktop/_index.md) and all its features. - [Troubleshooting](/manuals/desktop/troubleshoot-and-support/troubleshoot/_index.md) describes common problems, workarounds, how to run and submit diagnostics, and submit issues. - [FAQs](/manuals/desktop/troubleshoot-and-support/faqs/general.md) provide answers to frequently asked questions. diff --git a/content/manuals/desktop/setup/install/mac-install.md b/content/manuals/desktop/setup/install/mac-install.md index 6228a93becc7..41940a299552 100644 --- a/content/manuals/desktop/setup/install/mac-install.md +++ b/content/manuals/desktop/setup/install/mac-install.md @@ -1,5 +1,5 @@ --- -description: Install Docker for Mac to get started. This guide covers system requirements, +description: Install Docker Desktop for Mac to get started. This guide covers system requirements, where to download, and instructions on how to install and update. keywords: docker for mac, install docker macos, docker mac, docker mac install, docker install macos, install docker on mac, install docker macbook, docker desktop for @@ -21,10 +21,10 @@ aliases: > **Docker Desktop terms** > > Commercial use of Docker Desktop in larger enterprises (more than 250 -> employees OR more than $10 million USD in annual revenue) requires a [paid +> employees or more than $10 million USD in annual revenue) requires a [paid > subscription](https://www.docker.com/pricing/). -This page contains download URLs, information about system requirements, and instructions on how to install Docker Desktop for Mac. +This page provides download links, system requirements, and step-by-step installation instructions for Docker Desktop on Mac. {{< button text="Docker Desktop for Mac with Apple silicon" url="https://desktop.docker.com/mac/main/arm64/Docker.dmg?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-mac-arm64" >}} {{< button text="Docker Desktop for Mac with Intel chip" url="https://desktop.docker.com/mac/main/amd64/Docker.dmg?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-mac-amd64" >}} @@ -44,7 +44,7 @@ This page contains download URLs, information about system requirements, and ins > [!IMPORTANT] > - > Docker supports Docker Desktop on the most recent versions of macOS. That is, the current release of macOS and the previous two releases. As new major versions of macOS are made generally available, Docker stops supporting the oldest version and supports the newest version of macOS (in addition to the previous two releases). + > Docker Desktop is supported on the current and two previous major macOS releases. As new major versions of macOS are made generally available, Docker stops supporting the oldest version and supports the newest version of macOS (in addition to the previous two releases). - At least 4 GB of RAM. @@ -55,10 +55,10 @@ This page contains download URLs, information about system requirements, and ins > [!IMPORTANT] > - > Docker supports Docker Desktop on the most recent versions of macOS. That is, the current release of macOS and the previous two releases. As new major versions of macOS are made generally available, Docker stops supporting the oldest version and supports the newest version of macOS (in addition to the previous two releases). + > Docker Desktop is supported on the current and two previous major macOS releases. As new major versions of macOS are made generally available, Docker stops supporting the oldest version and supports the newest version of macOS (in addition to the previous two releases). - At least 4 GB of RAM. -- For the best experience, it's recommended that you install Rosetta 2. There is no longer a hard requirement to install Rosetta 2, however there are a few optional command line tools that still require Rosetta 2 when using Darwin/AMD64. See [Known issues](/manuals/desktop/troubleshoot-and-support/troubleshoot/known-issues.md). To install Rosetta 2 manually from the command line, run the following command: +- For the best experience, it's recommended that you install Rosetta 2. Rosetta 2 is no longer strictly required, however there are a few optional command line tools that still require Rosetta 2 when using Darwin/AMD64. See [Known issues](/manuals/desktop/troubleshoot-and-support/troubleshoot/known-issues.md). To install Rosetta 2 manually from the command line, run the following command: ```console $ softwareupdate --install-rosetta @@ -111,13 +111,25 @@ $ sudo hdiutil detach /Volumes/Docker By default, Docker Desktop is installed at `/Applications/Docker.app`. As macOS typically performs security checks the first time an application is used, the `install` command can take several minutes to run. +#### Installer flags + The `install` command accepts the following flags: + +##### Installation behavior + - `--accept-license`: Accepts the [Docker Subscription Service Agreement](https://www.docker.com/legal/docker-subscription-service-agreement) now, rather than requiring it to be accepted when the application is first run. +- `--user=`: Performs the privileged configurations once during installation. This removes the need for the user to grant root privileges on first run. For more information, see [Privileged helper permission requirements](/manuals/desktop/setup/install/mac-permission-requirements.md#permission-requirements). To find the username, enter `ls /Users` in the CLI. + +##### Security and access + - `--allowed-org=`: Requires the user to sign in and be part of the specified Docker Hub organization when running the application - `--user=`: Performs the privileged configurations once during installation. This removes the need for the user to grant root privileges on first run. For more information, see [Privileged helper permission requirements](/manuals/desktop/setup/install/mac-permission-requirements.md#permission-requirements). To find the username, enter `ls /Users` in the CLI. - `--admin-settings`: Automatically creates an `admin-settings.json` file which is used by administrators to control certain Docker Desktop settings on client machines within their organization. For more information, see [Settings Management](/manuals/security/for-admins/hardened-desktop/settings-management/_index.md). - It must be used together with the `--allowed-org=` flag. - For example: `--allowed-org= --admin-settings="{'configurationFileVersion': 2, 'enhancedContainerIsolation': {'value': true, 'locked': false}}"` + +##### Proxy configuration + - `--proxy-http-mode=`: Sets the HTTP Proxy mode. The two modes are `system` (default) or `manual`. - `--override-proxy-http=`: Sets the URL of the HTTP proxy that must be used for outgoing HTTP requests. It requires `--proxy-http-mode` to be `manual`. - `--override-proxy-https=`: Sets the URL of the HTTP proxy that must be used for outgoing HTTPS requests, requires `--proxy-http-mode` to be `manual` diff --git a/content/manuals/desktop/setup/install/mac-permission-requirements.md b/content/manuals/desktop/setup/install/mac-permission-requirements.md index 9f24fe9d1ca7..0a9d458bc18b 100644 --- a/content/manuals/desktop/setup/install/mac-permission-requirements.md +++ b/content/manuals/desktop/setup/install/mac-permission-requirements.md @@ -3,6 +3,7 @@ description: Understand permission requirements for Docker Desktop for Mac and t differences between versions keywords: Docker Desktop, mac, security, install, permissions title: Understand permission requirements for Docker Desktop on Mac +linkTitle: Mac permission requirements aliases: - /docker-for-mac/privileged-helper/ - /desktop/mac/privileged-helper/ @@ -15,20 +16,17 @@ This page contains information about the permission requirements for running and It also provides clarity on running containers as `root` as opposed to having `root` access on the host. +Docker Desktop on Windows is designed with security in mind. Administrative rights are only required when absolutely necessary. + ## Permission requirements Docker Desktop for Mac is run as an unprivileged user. However, Docker Desktop requires certain functionalities to perform a limited set of privileged configurations such as: - [Installing symlinks](#installing-symlinks) in`/usr/local/bin`. - - [Binding privileged ports](#binding-privileged-ports) that are less than 1024. The so-called "privileged ports" are not generally used as a security boundary, however operating systems still prevent unprivileged processes from binding them which breaks commands like `docker run -p 127.0.0.1:80:80 docker/getting-started`. + - [Binding privileged ports](#binding-privileged-ports) that are less than 1024. Although privileged ports (ports below 1024) are not typically used as a security boundary, operating systems still prevent unprivileged processes from binding to them which breaks commands like `docker run -p 127.0.0.1:80:80 docker/getting-started`. - [Ensuring `localhost` and `kubernetes.docker.internal` are defined](#ensuring-localhost-and-kubernetesdockerinternal-are-defined) in `/etc/hosts`. Some old macOS installs don't have `localhost` in `/etc/hosts`, which causes Docker to fail. Defining the DNS name `kubernetes.docker.internal` allows Docker to share Kubernetes contexts with containers. - Securely caching the Registry Access Management policy which is read-only for the developer. -Depending on which version of Docker Desktop for Mac is used, privileged access is granted either during installation, first run, or only when it's needed. - -{{< tabs >}} -{{< tab name="Version 4.18 and later" >}} - -From version 4.18 and later, Docker Desktop for Mac provides greater control over functionality that's enabled during installation. +Privileged access is granted during installation. The first time Docker Desktop for Mac launches, it presents an installation window where you can choose to either use the default settings, which work for most developers and requires you to grant privileged access, or use advanced settings. @@ -41,101 +39,29 @@ Depending on which advanced settings you configure, you must enter your password You can change these configurations at a later date from the **Advanced** page in **Settings**. -{{< /tab >}} -{{< tab name="Version 4.15 - 4.17" >}} - -Versions 4.15 to 4.17 of Docker Desktop for Mac don't require the privileged process to run permanently. Whenever elevated privileges are needed for a configuration, Docker Desktop prompts you with information on the task it needs to perform. Most configurations are applied once, subsequent runs don't prompt for privileged access anymore. -The only time Docker Desktop may start the privileged process is for binding privileged ports that aren't allowed by default on the host OS. - -{{< /tab >}} -{{< tab name="Versions prior to 4.15" >}} - -Versions prior to 4.15 of Docker Desktop for Mac require `root` access to be granted on the first run. The first time that Docker Desktop launches you receive an admin prompt to grant permission for the installation of the `com.docker.vmnetd` privileged helper service. For subsequent runs, `root` privileges aren't required. Following the principle of least privilege, this approach allows `root` access to be used only for the operations for which it's absolutely necessary, while still being able to use Docker Desktop as an unprivileged user. -All privileged operations are run using the privileged helper process `com.docker.vmnetd`. - -{{< /tab >}} -{{< /tabs >}} - ### Installing symlinks The Docker binaries are installed by default in `/Applications/Docker.app/Contents/Resources/bin`. Docker Desktop creates symlinks for the binaries in `/usr/local/bin`, which means they're automatically included in `PATH` on most systems. -{{< tabs >}} -{{< tab name="Version 4.18 and later" >}} - -With version 4.18 and later, you can choose whether to install symlinks either in `/usr/local/bin` or `$HOME/.docker/bin` during installation of Docker Desktop. +You can choose whether to install symlinks either in `/usr/local/bin` or `$HOME/.docker/bin` during installation of Docker Desktop. -If `/usr/local/bin` is chosen, and this location is not writable by unprivileged users, Docker Desktop requires authorization to confirm this choice before the symlinks to Docker binaries are created in `/usr/local/bin`. If `$HOME/.docker/bin` is chosen, authorization is not required, but then you must [manually add `$HOME/.docker/bin`](/manuals/desktop/settings-and-maintenance/settings.md#advanced) to their PATH. +If `/usr/local/bin` is chosen, and this location is not writable by unprivileged users, Docker Desktop requires authorization to confirm this choice before the symlinks to Docker binaries are created in `/usr/local/bin`. If `$HOME/.docker/bin` is chosen, authorization is not required, but then you must [manually add `$HOME/.docker/bin`](/manuals/desktop/settings-and-maintenance/settings.md#advanced) to your PATH. You are also given the option to enable the installation of the `/var/run/docker.sock` symlink. Creating this symlink ensures various Docker clients relying on the default Docker socket path work without additional changes. As the `/var/run` is mounted as a tmpfs, its content is deleted on restart, symlink to the Docker socket included. To ensure the Docker socket exists after restart, Docker Desktop sets up a `launchd` startup task that creates the symlink by running `ln -s -f /Users//.docker/run/docker.sock /var/run/docker.sock`. This ensures the you aren't prompted on each startup to create the symlink. If you don't enable this option at installation, the symlink and the startup task is not created and you may have to explicitly set the `DOCKER_HOST` environment variable to `/Users//.docker/run/docker.sock` in the clients it is using. The Docker CLI relies on the current context to retrieve the socket path, the current context is set to `desktop-linux` on Docker Desktop startup. -{{< /tab >}} -{{< tab name="Version 4.17 and earlier" >}} - -For versions prior to 4.18, installing symlinks in `/usr/local/bin` is a privileged configuration Docker Desktop performs on the first startup. Docker Desktop checks if symlinks exists and takes the following actions: -- Creates the symlinks without the admin prompt if `/usr/local/bin` is writable by unprivileged users. -- Triggers an admin prompt for you to authorize the creation of symlinks in `/usr/local/bin`. If you authorizes this, symlinks to Docker binaries are created in `/usr/local/bin`. If you reject the prompt, are not willing to run configurations requiring elevated privileges, or don't have admin rights on your machine, Docker Desktop creates the symlinks in `~/.docker/bin` and edits your shell profile to ensure this location is in your PATH. This requires all open shells to be reloaded. -The rejection is recorded for future runs to avoid prompting you again. -For any failure to ensure binaries are on your PATH, you may need to manually add to their PATH the `/Applications/Docker.app/Contents/Resources/bin` or use the full path to Docker binaries. - -A particular case is the installation of the `/var/run/docker.sock` symlink. Creating this symlink ensures various Docker clients relying on the default Docker socket path work without additional changes. As the `/var/run` is mounted as a tmpfs, its content is deleted on restart, symlink to Docker socket included. -To ensure the Docker socket exists after restart, Docker Desktop sets up a `launchd` startup task that creates a symlink by running `ln -s -f /Users//.docker/run/docker.sock /var/run/docker.sock`. This ensures that you are not prompted on each startup to create the symlink. If you reject the prompt, the symlink and the startup task are not created and you may have to explicitly set the `DOCKER_HOST` to `/Users//.docker/run/docker.sock` in the clients it is using. The Docker CLI relies on the current context to retrieve the socket path, the current context is set to `desktop-linux` on Docker Desktop startup. - -{{< /tab >}} -{{< /tabs >}} - ### Binding privileged ports -{{< tabs >}} -{{< tab name="Version 4.18 and later" >}} - -With version 4.18 and later you can choose to enable privileged port mapping during installation, or from the **Advanced** page in **Settings** post-installation. Docker Desktop requires authorization to confirm this choice. - -{{< /tab >}} -{{< tab name="Version 4.17 and earlier" >}} - -For versions below 4.18 , if you run a container that requires binding privileged ports, Docker Desktop first attempts to bind it directly as an unprivileged process. If the OS prevents this and it fails, Docker Desktop checks if the `com.docker.vmnetd` privileged helper process is running to bind the privileged port through it. - -If the privileged helper process is not running, Docker Desktop prompts you for authorization to run it under [launchd](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html). -This configures the privileged helper to run as in the versions of Docker Desktop prior to 4.15. However, the functionality provided by this privileged helper now only supports port binding and caching the Registry Access Management policy. -If you decline the launch of the privileged helper process, binding the privileged port cannot be done and the Docker CLI returns an error: -```console -$ docker run -p 127.0.0.1:80:80 docker/getting-started - -docker: Error response from daemon: Ports are not available: exposing port -TCP 127.0.0.1:80 -> 0.0.0.0:0: failed to connect to /var/run/com.docker.vmnetd.sock: -is vmnetd running?: dial unix /var/run/com.docker.vmnetd.sock: connect: connection -refused. -ERRO[0003] error waiting for container: context canceled -``` - -> [!NOTE] -> -> The command may fail with the same error if you take too long to authorize the prompt to start the helper process, as it may timeout. - -{{< /tab >}} -{{< /tabs >}} +You can choose to enable privileged port mapping during installation, or from the **Advanced** page in **Settings** post-installation. Docker Desktop requires authorization to confirm this choice. ### Ensuring `localhost` and `kubernetes.docker.internal` are defined -{{< tabs >}} -{{< tab name="Version 4.18 and later" >}} - -With versions 4.18 and later, it is your responsibility to ensure that localhost is resolved to `127.0.0.1` and if Kubernetes is used, that `kubernetes.docker.internal` is resolved to `127.0.0.1`. - -{{< /tab >}} -{{< tab name="Version 4.17 and earlier" >}} - -On first run, Docker Desktop checks if `localhost` is resolved to `127.0.0.1`. In case the resolution fails, it prompts you to allow adding the mapping to `/etc/hosts`. Similarly, when the Kubernetes cluster is installed, it checks that `kubernetes.docker.internal` is resolved to `127.0.0.1` and prompts you to do so. - -{{< /tab >}} -{{< /tabs >}} +It is your responsibility to ensure that localhost is resolved to `127.0.0.1` and if Kubernetes is used, that `kubernetes.docker.internal` is resolved to `127.0.0.1`. ## Installing from the command line -In version 4.11 and later of Docker Desktop for Mac, privileged configurations are applied during the installation with the `--user` flag on the [install command](/manuals/desktop/setup/install/mac-install.md#install-from-the-command-line). In this case, you are not prompted to grant root privileges on the first run of Docker Desktop. Specifically, the `--user` flag: +Privileged configurations are applied during the installation with the `--user` flag on the [install command](/manuals/desktop/setup/install/mac-install.md#install-from-the-command-line). In this case, you are not prompted to grant root privileges on the first run of Docker Desktop. Specifically, the `--user` flag: - Uninstalls the previous `com.docker.vmnetd` if present - Sets up symlinks - Ensures that `localhost` is resolved to `127.0.0.1` diff --git a/content/manuals/desktop/setup/install/windows-install.md b/content/manuals/desktop/setup/install/windows-install.md index 91e432258231..7a19b8fe8bb8 100644 --- a/content/manuals/desktop/setup/install/windows-install.md +++ b/content/manuals/desktop/setup/install/windows-install.md @@ -28,7 +28,7 @@ aliases: > employees OR more than $10 million USD in annual revenue) requires a [paid > subscription](https://www.docker.com/pricing/). -This page contains the download URL, information about system requirements, and instructions on how to install Docker Desktop for Windows. +This page provides download links, system requirements, and step-by-step installation instructions for Docker Desktop on Windows. {{< button text="Docker Desktop for Windows - x86_64" url="https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-win-amd64" >}} {{< button text="Docker Desktop for Windows - Arm (Beta)" url="https://desktop.docker.com/win/main/arm64/Docker%20Desktop%20Installer.exe?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-win-arm64" >}} @@ -41,7 +41,7 @@ _For checksums, see [Release notes](/manuals/desktop/release-notes.md)_ > > **Should I use Hyper-V or WSL?** > -> Docker Desktop's functionality remains consistent on both WSL and Hyper-V, without a preference for either architecture. Hyper-V and WSL have their own advantages and disadvantages, depending on your specific set up and your planned use case. +> Docker Desktop's functionality remains consistent on both WSL and Hyper-V, without a preference for either architecture. Hyper-V and WSL have their own advantages and disadvantages, depending on your specific setup and your planned use case. {{< tabs >}} {{< tab name="WSL 2 backend, x86_64" >}} @@ -171,9 +171,9 @@ again when you switch back. 3. When prompted, ensure the **Use WSL 2 instead of Hyper-V** option on the Configuration page is selected or not depending on your choice of backend. - If your system only supports one of the two options, you won't be able to select which backend to use. + On systems that support only one backend, Docker Desktop automatically selects the available option. -4. Follow the instructions on the installation wizard to authorize the installer and proceed with the install. +4. Follow the instructions on the installation wizard to authorize the installer and proceed with the installation. 5. When the installation is successful, select **Close** to complete the installation process. @@ -207,40 +207,53 @@ start /w "" "Docker Desktop Installer.exe" install By default, Docker Desktop is installed at `C:\Program Files\Docker\Docker`. +#### Installer flags + +> [!NOTE] +> +> If you're using PowerShell, you need to use the `ArgumentList` parameter before any flags. +> For example: +> ```powershell +> Start-Process 'Docker Desktop Installer.exe' -Wait -ArgumentList 'install', '--accept-license' +> ``` + +If your admin account is different to your user account, you must add the user to the **docker-users** group: + +```console +$ net localgroup docker-users /add +``` + The `install` command accepts the following flags: + +##### Installation behavior + - `--quiet`: Suppresses information output when running the installer - `--accept-license`: Accepts the [Docker Subscription Service Agreement](https://www.docker.com/legal/docker-subscription-service-agreement) now, rather than requiring it to be accepted when the application is first run -- `--no-windows-containers`: Disables the Windows containers integration. This can improve security. For more information, see [Windows containers](/manuals/desktop/setup/install/windows-permission-requirements.md#windows-containers). -- `--allowed-org=`: Requires the user to sign in and be part of the specified Docker Hub organization when running the application -- `--backend=`: Selects the default backend to use for Docker Desktop, `hyper-v`, `windows` or `wsl-2` (default) - `--installation-dir=`: Changes the default installation location (`C:\Program Files\Docker\Docker`) +- `--backend=`: Selects the default backend to use for Docker Desktop, `hyper-v`, `windows` or `wsl-2` (default) +- `--always-run-service`: After installation completes, starts `com.docker.service` and sets the service startup type to Automatic. This circumvents the need for administrator privileges, which are otherwise necessary to start `com.docker.service`. `com.docker.service` is required by Windows containers and Hyper-V backend. + +##### Security and access control + +- `--allowed-org=`: Requires the user to sign in and be part of the specified Docker Hub organization when running the application - `--admin-settings`: Automatically creates an `admin-settings.json` file which is used by admins to control certain Docker Desktop settings on client machines within their organization. For more information, see [Settings Management](/manuals/security/for-admins/hardened-desktop/settings-management/_index.md). - It must be used together with the `--allowed-org=` flag. - For example:`--allowed-org= --admin-settings="{'configurationFileVersion': 2, 'enhancedContainerIsolation': {'value': true, 'locked': false}}"` +- `--no-windows-containers`: Disables the Windows containers integration. This can improve security. For more information, see [Windows containers](/manuals/desktop/setup/install/windows-permission-requirements.md#windows-containers). + +##### Proxy configuration - `--proxy-http-mode=`: Sets the HTTP Proxy mode, `system` (default) or `manual` - `--override-proxy-http=`: Sets the URL of the HTTP proxy that must be used for outgoing HTTP requests, requires `--proxy-http-mode` to be `manual` - `--override-proxy-https=`: Sets the URL of the HTTP proxy that must be used for outgoing HTTPS requests, requires `--proxy-http-mode` to be `manual` - `--override-proxy-exclude=`: Bypasses proxy settings for the hosts and domains. Uses a comma-separated list. - `--proxy-enable-kerberosntlm`: Enables Kerberos and NTLM proxy authentication. If you are enabling this, ensure your proxy server is properly configured for Kerberos/NTLM authentication. Available with Docker Desktop 4.32 and later. + +##### Data root and disk location + - `--hyper-v-default-data-root=`: Specifies the default location for the Hyper-V VM disk. - `--windows-containers-default-data-root=`: Specifies the default location for the Windows containers. - `--wsl-default-data-root=`: Specifies the default location for the WSL distribution disk. -- `--always-run-service`: After installation completes, starts `com.docker.service` and sets the service startup type to Automatic. This circumvents the need for administrator privileges, which are otherwise necessary to start `com.docker.service`. `com.docker.service` is required by Windows containers and Hyper-V backend. - -> [!NOTE] -> -> If you're using PowerShell, you need to use the `ArgumentList` parameter before any flags. -> For example: -> ```powershell -> Start-Process 'Docker Desktop Installer.exe' -Wait -ArgumentList 'install', '--accept-license' -> ``` - -If your admin account is different to your user account, you must add the user to the **docker-users** group: - -```console -$ net localgroup docker-users /add -``` ## Start Docker Desktop diff --git a/content/manuals/desktop/setup/install/windows-permission-requirements.md b/content/manuals/desktop/setup/install/windows-permission-requirements.md index 32917e4210ac..9ae094f312e6 100644 --- a/content/manuals/desktop/setup/install/windows-permission-requirements.md +++ b/content/manuals/desktop/setup/install/windows-permission-requirements.md @@ -2,6 +2,7 @@ description: Understand permission requirements for Docker Desktop for Windows keywords: Docker Desktop, Windows, security, install title: Understand permission requirements for Windows +linkTitle: Windows permission requirements aliases: - /desktop/windows/privileged-helper/ - /desktop/windows/permission-requirements/ @@ -9,10 +10,12 @@ aliases: weight: 40 --- -This page contains information about the permission requirements for running and installing Docker Desktop on Windows, the functionality of the privileged helper process `com.docker.service` and the reasoning behind this approach. +This page contains information about the permission requirements for running and installing Docker Desktop on Windows, the functionality of the privileged helper process `com.docker.service`, and the reasoning behind this approach. It also provides clarity on running containers as `root` as opposed to having `Administrator` access on the host and the privileges of the Windows Docker engine and Windows containers. +Docker Desktop on Windows is designed with security in mind. Administrative rights are only required when absolutely necessary. + ## Permission requirements While Docker Desktop on Windows can be run without having `Administrator` privileges, it does require them during installation. On installation you receive a UAC prompt which allows a privileged helper service to be installed. After that, Docker Desktop can be run without administrator privileges, provided you are members of the `docker-users` group. If you performed the installation, you are automatically added to this group, but other users must be added manually. This allows the administrator to control who has access to Docker Desktop. @@ -27,7 +30,7 @@ The service performs the following functionalities: - Ensuring that `kubernetes.docker.internal` is defined in the Win32 hosts file. Defining the DNS name `kubernetes.docker.internal` allows Docker to share Kubernetes contexts with containers. - Ensuring that `host.docker.internal` and `gateway.docker.internal` are defined in the Win32 hosts file. They point to the host local IP address and allow an application to resolve the host IP using the same name from either the host itself or a container. - Securely caching the Registry Access Management policy which is read-only for the developer. -- Creating the Hyper-V VM `"DockerDesktopVM"` and managing its lifecycle - starting, stopping and destroying it. The VM name is hard coded in the service code so the service cannot be used for creating or manipulating any other VMs. +- Creating the Hyper-V VM `"DockerDesktopVM"` and managing its lifecycle - starting, stopping, and destroying it. The VM name is hard coded in the service code so the service cannot be used for creating or manipulating any other VMs. - Moving the VHDX file or folder. - Starting and stopping the Windows Docker engine and querying whether it's running. - Deleting all Windows containers data files. @@ -38,7 +41,7 @@ The service performs the following functionalities: The service start mode depends on which container engine is selected, and, for WSL, on whether it is needed to maintain `host.docker.internal` and `gateway.docker.internal` in the Win32 hosts file. This is controlled by a setting under `Use the WSL 2 based engine` in the settings page. When this is set, WSL engine behaves the same as Hyper-V. So: - With Windows containers, or Hyper-v Linux containers, the service is started when the system boots and runs all the time, even when Docker Desktop isn't running. This is required so you can launch Docker Desktop without admin privileges. -- With WSL2 Linux containers, the service isn't necessary and therefore doesn't run automatically when the system boots. When you switch to Windows containers or Hyper-V Linux containers, or choose to maintain `host.docker.internal` and `gateway.docker.internal` in the Win32 hosts file, a UAC prompt is displayed which asks you to accept the privileged operation to start the service. If accepted, the service is started and set to start automatically upon the next Windows boot. +- With WSL2 Linux containers, the service isn't necessary and therefore doesn't run automatically when the system boots. When you switch to Windows containers or Hyper-V Linux containers, or choose to maintain `host.docker.internal` and `gateway.docker.internal` in the Win32 hosts file, a UAC prompt appears asking you to accept the privileged operation to start the service. If accepted, the service is started and set to start automatically upon the next Windows boot. ## Containers running as root within the Linux VM @@ -49,8 +52,7 @@ installed software. This means that although containers run by default as access to the Windows host machine. The Linux VM serves as a security boundary and limits what resources from the host can be accessed. File sharing uses a user-space crafted file server and any directories from the host bind mounted -into Docker containers still retain their original permissions. It doesn't give -you access to any files that it doesn’t already have access to. +into Docker containers still retain their original permissions. Containers don't have access to any host files beyond those explicitly shared. ## Enhanced Container Isolation @@ -65,7 +67,7 @@ Desktop VM. ECI uses this and other advanced techniques to further secure containers within the Docker Desktop Linux VM, such that they are further isolated from the Docker daemon and other services running inside the VM. -## Windows Containers +## Windows containers > [!WARNING] > diff --git a/content/manuals/desktop/setup/sign-in.md b/content/manuals/desktop/setup/sign-in.md index 72ac850af5ce..d05abf62592d 100644 --- a/content/manuals/desktop/setup/sign-in.md +++ b/content/manuals/desktop/setup/sign-in.md @@ -30,7 +30,7 @@ aliases: - /desktop/get-started/ --- -Docker recommends that you authenticate using the **Sign in** option in the top-right corner of the Docker Dashboard. +Docker recommends signing in with the **Sign in** option in the top-right corner of the Docker Dashboard. In large enterprises where admin access is restricted, administrators can [enforce sign-in](/manuals/security/for-admins/enforce-sign-in/_index.md). @@ -40,11 +40,11 @@ In large enterprises where admin access is restricted, administrators can [enfor ## Benefits of signing in -- You can access your Docker Hub repositories directly from Docker Desktop. +- Access your Docker Hub repositories directly from Docker Desktop. -- Authenticated users also get a higher pull rate limit compared to anonymous users. For more information, see [Usage and limits](/manuals/docker-hub/usage/_index.md). +- Increase your pull rate limit compared to anonymous users. See [Usage and limits](/manuals/docker-hub/usage/_index.md). -- Improve your organization’s security posture for containerized development by taking advantage of [Hardened Desktop](/manuals/security/for-admins/hardened-desktop/_index.md). +- Enhance your organization’s security posture for containerized development with [Hardened Desktop](/manuals/security/for-admins/hardened-desktop/_index.md). > [!NOTE] > @@ -52,49 +52,40 @@ In large enterprises where admin access is restricted, administrators can [enfor ## Signing in with Docker Desktop for Linux -Docker Desktop for Linux relies on [`pass`](https://www.passwordstore.org/) to store credentials in gpg2-encrypted files. +Docker Desktop for Linux relies on [`pass`](https://www.passwordstore.org/) to store credentials in GPG-encrypted files. Before signing in to Docker Desktop with your [Docker ID](/accounts/create-account/), you must initialize `pass`. -Docker Desktop displays a warning if you've not initialized `pass`. +Docker Desktop displays a warning if `pass` is not configured. -You can initialize pass by using a gpg key. To generate a gpg key, run: +1. Generate a GPG key. You can initialize pass by using a gpg key. To generate a gpg key, run: -``` console -$ gpg --generate-key -``` + ``` console + $ gpg --generate-key + ``` +2. Enter your name and email once prompted. -The following is an example similar to what you see once you run the previous command: + Once confirmed, GPG creates a key pair. Look for the `pub` line that contains your GPG ID, for example: -```console {hl_lines=12} -... -GnuPG needs to construct a user ID to identify your key. + ```text + ... + pubrsa3072 2022-03-31 [SC] [expires: 2024-03-30] + 3ABCD1234EF56G78 + uid Molly + ``` +3. Copy the GPG ID and use it to initialize `pass` -Real name: Molly -Email address: molly@example.com -You selected this USER-ID: - "Molly " + ```console + $ pass init + ``` -Change (N)ame, (E)mail, or (O)kay/(Q)uit? O -... -pubrsa3072 2022-03-31 [SC] [expires: 2024-03-30] - -uid Molly -subrsa3072 2022-03-31 [E] [expires: 2024-03-30] -``` - -To initialize `pass`, run the following command using the public key generated from the previous command: - -```console -$ pass init -``` -The following is an example similar to what you see once you run the previous command: + You should see output similar to: -```console -mkdir: created directory '/home/molly/.password-store/' -Password store initialized for -``` + ```text + mkdir: created directory '/home/molly/.password-store/' + Password store initialized for + ``` Once you initialize `pass`, you can sign in and pull your private images. -When Docker CLI or Docker Desktop use credentials, a user prompt may pop up for the password you set during the gpg key generation. +When Docker CLI or Docker Desktop use credentials, a user prompt may pop up for the password you set during the GPG key generation. ```console $ docker pull molly/privateimage @@ -109,5 +100,5 @@ docker.io/molly/privateimage:latest ## What's next? - [Explore Docker Desktop](/manuals/desktop/use-desktop/_index.md) and its features. -- Change your Docker Desktop settings -- [Browse common FAQs](/manuals/desktop/troubleshoot-and-support/faqs/general.md) +- Change your [Docker Desktop settings](/manuals/desktop/settings-and-maintenance/settings.md). +- [Browse common FAQs](/manuals/desktop/troubleshoot-and-support/faqs/general.md). diff --git a/content/manuals/desktop/setup/vm-vdi.md b/content/manuals/desktop/setup/vm-vdi.md index 37ade577b48f..153c1d9bff35 100644 --- a/content/manuals/desktop/setup/vm-vdi.md +++ b/content/manuals/desktop/setup/vm-vdi.md @@ -2,13 +2,14 @@ description: Instructions on how to enable nested virtualization keywords: nested virtualization, Docker Desktop, windows, VM, VDI environment title: Run Docker Desktop for Windows in a VM or VDI environment +linkTitle: VM or VDI environments aliases: - /desktop/nested-virtualization/ - /desktop/vm-vdi/ weight: 30 --- -In general, we recommend running Docker Desktop natively on either Mac, Linux, or Windows. However, Docker Desktop for Windows can run inside a virtual desktop provided the virtual desktop is properly configured. +Docker recommends running Docker Desktop natively on Mac, Linux, or Windows. However, Docker Desktop for Windows can run inside a virtual desktop provided the virtual desktop is properly configured. To run Docker Desktop in a virtual desktop environment, it is essential nested virtualization is enabled on the virtual machine that provides the virtual desktop. This is because, under the hood, Docker Desktop is using a Linux VM in which it runs Docker Engine and the containers. @@ -18,11 +19,11 @@ To run Docker Desktop in a virtual desktop environment, it is essential nested v > > Support for running Docker Desktop on a virtual desktop is available to Docker Business customers, on VMware ESXi or Azure VMs only. -The support available from Docker extends to installing and running Docker Desktop inside the VM, once the nested virtualization is set up correctly. The only hypervisors we have successfully tested are VMware ESXi and Azure, and there is no support for other VMs. For more information on Docker Desktop support, see [Get support](/manuals/desktop/troubleshoot-and-support/support.md). +Docker support includes installing and running Docker Desktop within the VM, provided that nested virtualization is correctly enabled. The only hypervisors successfully tested are VMware ESXi and Azure, and there is no support for other VMs. For more information on Docker Desktop support, see [Get support](/manuals/desktop/troubleshoot-and-support/support.md). -For troubleshooting problems and intermittent failures that are outside of Docker's control, you should contact your hypervisor vendor. Each hypervisor vendor offers different levels of support. For example, Microsoft supports running nested Hyper-V both on-prem and on Azure, with some version constraints. This may not be the case for VMWare ESXi. +For troubleshooting problems and intermittent failures that are outside of Docker's control, you should contact your hypervisor vendor. Each hypervisor vendor offers different levels of support. For example, Microsoft supports running nested Hyper-V both on-prem and on Azure, with some version constraints. This may not be the case for VMware ESXi. -Docker does not support running multiples instances of Docker Desktop on the same machine in a VM or VDI environment. +Docker does not support running multiple instances of Docker Desktop on the same machine in a VM or VDI environment. ## Turn on nested virtualization @@ -30,16 +31,15 @@ You must turn on nested virtualization before you install Docker Desktop on a vi ### Turn on nested virtualization on VMware ESXi -Nested virtualization of other hypervisors like Hyper-V inside a vSphere VM [is not a supported scenario](https://kb.vmware.com/s/article/2009916). However, running Hyper-V VM in a VMware ESXi VM is technically possible and, depending on the version, ESXi includes hardware-assisted virtualization as a supported feature. For internal testing, we used a VM that had 1 CPU with 4 cores and 12GB of memory. +Nested virtualization of other hypervisors like Hyper-V inside a vSphere VM [is not a supported scenario](https://kb.vmware.com/s/article/2009916). However, running Hyper-V VM in a VMware ESXi VM is technically possible and, depending on the version, ESXi includes hardware-assisted virtualization as a supported feature. A VM that had 1 CPU with 4 cores and 12GB of memory was used for internal testing. For steps on how to expose hardware-assisted virtualization to the guest OS, [see VMware's documentation](https://docs.vmware.com/en/VMware-vSphere/7.0/com.vmware.vsphere.vm_admin.doc/GUID-2A98801C-68E8-47AF-99ED-00C63E4857F6.html). - ### Turn on nested virtualization on an Azure Virtual Machine Nested virtualization is supported by Microsoft for running Hyper-V inside an Azure VM. -For Azure virtual machines, [check that the VM size chosen supports nested virtualization](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes). Microsoft provides [a helpful list on Azure VM sizes](https://docs.microsoft.com/en-us/azure/virtual-machines/acu) and highlights the sizes that currently support nested virtualization. For internal testing, we used D4s_v5 machines. We recommend this specification or above for optimal performance of Docker Desktop. +For Azure virtual machines, [check that the VM size chosen supports nested virtualization](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes). Microsoft provides [a helpful list on Azure VM sizes](https://docs.microsoft.com/en-us/azure/virtual-machines/acu) and highlights the sizes that currently support nested virtualization. D4s_v5 machines were used for internal testing. Use this specification or above for optimal performance of Docker Desktop. ## Docker Desktop support on Nutanix-powered VDI @@ -57,6 +57,4 @@ Docker Desktop follows the VDI support definitions outlined [previously](#virtua ### Support scope and responsibilities -If WSL 2 encounters issues - for example, it crashes, fails to start, or experiences performance degradation - contact Nutanix support. - -If Docker Desktop itself encounters issues, contact Docker support. +For WSL 2-related issues, contact Nutanix support. For Docker Desktop-specific issues, contact Docker support. From 390b726051fedbbc4f7a95b80160c9c72dcbc6e9 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Thu, 3 Apr 2025 14:40:36 +0100 Subject: [PATCH 267/699] ENGDOCS-2523 (#22358) ## Description Updates Docker Desktop CLI reference. Ideally we vendor in the docs instead of manually adjusting. But need to complete setup on this (David started this before he left). This is a short term solution to get the docs in ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Co-authored-by: Dorin-Andrei Geman --- .../manuals/desktop/features/desktop-cli.md | 5 ++- .../cli/docker/desktop/disable/_index.md | 6 ++++ .../docker/desktop/disable/model-runner.md | 6 ++++ .../cli/docker/desktop/enable/_index.md | 6 ++++ .../cli/docker/desktop/enable/model-runner.md | 6 ++++ .../cli/docker/desktop/module/_index.md | 6 ++++ .../reference/cli/docker/desktop/module/ls.md | 6 ++++ .../cli/docker/desktop/module/reset.md | 6 ++++ .../cli/docker/desktop/module/update.md | 6 ++++ .../reference/cli/docker/desktop/version.md | 6 ++++ data/desktop-cli/docker_desktop.yaml | 10 +++++- data/desktop-cli/docker_desktop_disable.yaml | 15 ++++++++ .../docker_desktop_disable_model_runner.yaml | 12 +++++++ data/desktop-cli/docker_desktop_enable.yaml | 15 ++++++++ .../docker_desktop_enable_model_runner.yaml | 34 ++++++++++++++++++ .../desktop-cli/docker_desktop_engine_ls.yaml | 11 ++++++ data/desktop-cli/docker_desktop_logs.yaml | 15 ++++---- data/desktop-cli/docker_desktop_module.yaml | 19 ++++++++++ .../desktop-cli/docker_desktop_module_ls.yaml | 35 +++++++++++++++++++ .../docker_desktop_module_reset.yaml | 12 +++++++ .../docker_desktop_module_update.yaml | 12 +++++++ data/desktop-cli/docker_desktop_restart.yaml | 23 ++++++++++++ data/desktop-cli/docker_desktop_start.yaml | 7 ++-- data/desktop-cli/docker_desktop_status.yaml | 11 ++++++ data/desktop-cli/docker_desktop_stop.yaml | 8 +++-- data/desktop-cli/docker_desktop_update.yaml | 2 +- data/desktop-cli/docker_desktop_version.yaml | 33 +++++++++++++++++ 27 files changed, 316 insertions(+), 17 deletions(-) create mode 100644 content/reference/cli/docker/desktop/disable/_index.md create mode 100644 content/reference/cli/docker/desktop/disable/model-runner.md create mode 100644 content/reference/cli/docker/desktop/enable/_index.md create mode 100644 content/reference/cli/docker/desktop/enable/model-runner.md create mode 100644 content/reference/cli/docker/desktop/module/_index.md create mode 100644 content/reference/cli/docker/desktop/module/ls.md create mode 100644 content/reference/cli/docker/desktop/module/reset.md create mode 100644 content/reference/cli/docker/desktop/module/update.md create mode 100644 content/reference/cli/docker/desktop/version.md create mode 100644 data/desktop-cli/docker_desktop_disable.yaml create mode 100644 data/desktop-cli/docker_desktop_disable_model_runner.yaml create mode 100644 data/desktop-cli/docker_desktop_enable.yaml create mode 100644 data/desktop-cli/docker_desktop_enable_model_runner.yaml create mode 100644 data/desktop-cli/docker_desktop_module.yaml create mode 100644 data/desktop-cli/docker_desktop_module_ls.yaml create mode 100644 data/desktop-cli/docker_desktop_module_reset.yaml create mode 100644 data/desktop-cli/docker_desktop_module_update.yaml create mode 100644 data/desktop-cli/docker_desktop_version.yaml diff --git a/content/manuals/desktop/features/desktop-cli.md b/content/manuals/desktop/features/desktop-cli.md index b065de091aa8..600224a500df 100644 --- a/content/manuals/desktop/features/desktop-cli.md +++ b/content/manuals/desktop/features/desktop-cli.md @@ -38,6 +38,9 @@ docker desktop COMMAND [OPTIONS] | `engine use` | Switch between Linux and Windows containers (Windows only) | | `update` | Manage Docker Desktop updates. Available for Mac only with Docker Desktop version 4.38, or all OSs with Docker Desktop version 4.39 and later. | | `logs` | Print log entries | - +| `disable` | Disable a feature | +| `enable` | Enable a feature | +| `version` | Show the Docker Desktop CLI plugin version information | +| `module` | Manage Docker Desktop modules | For more details on each command, see the [Docker Desktop CLI reference](/reference/cli/docker/desktop/_index.md). diff --git a/content/reference/cli/docker/desktop/disable/_index.md b/content/reference/cli/docker/desktop/disable/_index.md new file mode 100644 index 000000000000..74a81e6c355e --- /dev/null +++ b/content/reference/cli/docker/desktop/disable/_index.md @@ -0,0 +1,6 @@ +--- +datafolder: desktop-cli +datafile: docker_desktop_disable +title: docker desktop disable +layout: cli +--- \ No newline at end of file diff --git a/content/reference/cli/docker/desktop/disable/model-runner.md b/content/reference/cli/docker/desktop/disable/model-runner.md new file mode 100644 index 000000000000..40a825ee10fd --- /dev/null +++ b/content/reference/cli/docker/desktop/disable/model-runner.md @@ -0,0 +1,6 @@ +--- +datafolder: desktop-cli +datafile: docker_desktop_disable_model_runner +title: docker desktop disable model-runner +layout: cli +--- \ No newline at end of file diff --git a/content/reference/cli/docker/desktop/enable/_index.md b/content/reference/cli/docker/desktop/enable/_index.md new file mode 100644 index 000000000000..f1213c9c8d2f --- /dev/null +++ b/content/reference/cli/docker/desktop/enable/_index.md @@ -0,0 +1,6 @@ +--- +datafolder: desktop-cli +datafile: docker_desktop_enable +title: docker desktop enable +layout: cli +--- \ No newline at end of file diff --git a/content/reference/cli/docker/desktop/enable/model-runner.md b/content/reference/cli/docker/desktop/enable/model-runner.md new file mode 100644 index 000000000000..6ffbb9c21792 --- /dev/null +++ b/content/reference/cli/docker/desktop/enable/model-runner.md @@ -0,0 +1,6 @@ +--- +datafolder: desktop-cli +datafile: docker_desktop_enable_model_runner +title: docker desktop enable model-runner +layout: cli +--- \ No newline at end of file diff --git a/content/reference/cli/docker/desktop/module/_index.md b/content/reference/cli/docker/desktop/module/_index.md new file mode 100644 index 000000000000..88f9fc9266f7 --- /dev/null +++ b/content/reference/cli/docker/desktop/module/_index.md @@ -0,0 +1,6 @@ +--- +datafolder: desktop-cli +datafile: docker_desktop_module +title: docker desktop module +layout: cli +--- \ No newline at end of file diff --git a/content/reference/cli/docker/desktop/module/ls.md b/content/reference/cli/docker/desktop/module/ls.md new file mode 100644 index 000000000000..cb9dec4e7074 --- /dev/null +++ b/content/reference/cli/docker/desktop/module/ls.md @@ -0,0 +1,6 @@ +--- +datafolder: desktop-cli +datafile: docker_desktop_module_ls +title: docker desktop module ls +layout: cli +--- \ No newline at end of file diff --git a/content/reference/cli/docker/desktop/module/reset.md b/content/reference/cli/docker/desktop/module/reset.md new file mode 100644 index 000000000000..d9de96ebb514 --- /dev/null +++ b/content/reference/cli/docker/desktop/module/reset.md @@ -0,0 +1,6 @@ +--- +datafolder: desktop-cli +datafile: docker_desktop_module_reset +title: docker desktop reset +layout: cli +--- \ No newline at end of file diff --git a/content/reference/cli/docker/desktop/module/update.md b/content/reference/cli/docker/desktop/module/update.md new file mode 100644 index 000000000000..e57056863d21 --- /dev/null +++ b/content/reference/cli/docker/desktop/module/update.md @@ -0,0 +1,6 @@ +--- +datafolder: desktop-cli +datafile: docker_desktop_module_update +title: docker desktop module_update +layout: cli +--- \ No newline at end of file diff --git a/content/reference/cli/docker/desktop/version.md b/content/reference/cli/docker/desktop/version.md new file mode 100644 index 000000000000..26a5c856198a --- /dev/null +++ b/content/reference/cli/docker/desktop/version.md @@ -0,0 +1,6 @@ +--- +datafolder: desktop-cli +datafile: docker_desktop_version +title: docker desktop version +layout: cli +--- \ No newline at end of file diff --git a/data/desktop-cli/docker_desktop.yaml b/data/desktop-cli/docker_desktop.yaml index 43fe0c765a62..f65ec5666d19 100644 --- a/data/desktop-cli/docker_desktop.yaml +++ b/data/desktop-cli/docker_desktop.yaml @@ -11,6 +11,10 @@ cname: - docker desktop status - docker desktop engine - docker desktop update + - docker desktop logs + - docker desktop disable + - docker desktop enable + - docker desktop version clink: - docker_desktop_start.yaml - docker_desktop_stop.yaml @@ -18,8 +22,12 @@ clink: - docker_desktop_status.yaml - docker_desktop_engine.yaml - docker_desktop_update.yaml + - docker_desktop_logs.yaml + - docker_desktop_disable.yaml + - docker_desktop_enable.yaml + - docker_desktop_version.yaml deprecated: false -hidden: false +hidden: true experimental: false experimentalcli: false kubernetes: false diff --git a/data/desktop-cli/docker_desktop_disable.yaml b/data/desktop-cli/docker_desktop_disable.yaml new file mode 100644 index 000000000000..5cfb99f7e210 --- /dev/null +++ b/data/desktop-cli/docker_desktop_disable.yaml @@ -0,0 +1,15 @@ +command: docker desktop disable +short: Disable a feature +long: Disable an individual feature +pname: docker desktop +plink: docker_desktop.yaml +cname: + - docker desktop disable model-runner +clink: + - docker_desktop_disable_model-runner.yaml +deprecated: false +hidden: false +experimental: false +experimentalcli: false +kubernetes: false +swarm: false \ No newline at end of file diff --git a/data/desktop-cli/docker_desktop_disable_model_runner.yaml b/data/desktop-cli/docker_desktop_disable_model_runner.yaml new file mode 100644 index 000000000000..c7505e41cb56 --- /dev/null +++ b/data/desktop-cli/docker_desktop_disable_model_runner.yaml @@ -0,0 +1,12 @@ +command: docker desktop disable model-runner +short: Disable Docker Model Runner +long: Disable Docker Model Runner +usage: docker desktop disable model-runner +pname: docker desktop disable +plink: docker_desktop_disable.yaml +deprecated: false +hidden: false +experimental: false +experimentalcli: false +kubernetes: false +swarm: false \ No newline at end of file diff --git a/data/desktop-cli/docker_desktop_enable.yaml b/data/desktop-cli/docker_desktop_enable.yaml new file mode 100644 index 000000000000..d03f463a7dc9 --- /dev/null +++ b/data/desktop-cli/docker_desktop_enable.yaml @@ -0,0 +1,15 @@ +command: docker desktop enable +short: Enable a feature +long: Enable or manage an individual feature +pname: docker desktop +plink: docker_desktop.yaml +cname: + - docker desktop enable model-runner +clink: + - docker_desktop_enable_model-runner.yaml +deprecated: false +hidden: false +experimental: false +experimentalcli: false +kubernetes: false +swarm: false \ No newline at end of file diff --git a/data/desktop-cli/docker_desktop_enable_model_runner.yaml b/data/desktop-cli/docker_desktop_enable_model_runner.yaml new file mode 100644 index 000000000000..4e163b0a4298 --- /dev/null +++ b/data/desktop-cli/docker_desktop_enable_model_runner.yaml @@ -0,0 +1,34 @@ +command: docker desktop enable model-runner +short: Manage Docker Model Runner settings +long: Enable and manage Docker Model Runner settings used by 'docker model' +usage: docker desktop enable model-runner [OPTIONS] +pname: docker desktop enable +plink: docker_desktop_enable.yaml +options: + - option: no-tcp + value_type: bool + default_value: "false" + description: Disable TCP connection. Cannot be used with --tcp. + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false + - option: tcp + value_type: port + default_value: "12434" + description: | + Enable or change TCP port for connection (1-65535). Cannot be used with --no-tcp. + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false +deprecated: false +hidden: false +experimental: false +experimentalcli: false +kubernetes: false +swarm: false \ No newline at end of file diff --git a/data/desktop-cli/docker_desktop_engine_ls.yaml b/data/desktop-cli/docker_desktop_engine_ls.yaml index 52a1012d06dd..3c64229e6287 100644 --- a/data/desktop-cli/docker_desktop_engine_ls.yaml +++ b/data/desktop-cli/docker_desktop_engine_ls.yaml @@ -3,6 +3,17 @@ short: List available engines (Windows only) usage: docker desktop engine ls pname: docker desktop engine plink: docker_desktop_engine.yaml +options: + - option: format + value_type: string + default_value: pretty + description: 'Format the output. Accepted values are: pretty, json' + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false deprecated: false hidden: false experimental: false diff --git a/data/desktop-cli/docker_desktop_logs.yaml b/data/desktop-cli/docker_desktop_logs.yaml index 2256e52dba13..3b447555e47d 100644 --- a/data/desktop-cli/docker_desktop_logs.yaml +++ b/data/desktop-cli/docker_desktop_logs.yaml @@ -6,8 +6,8 @@ plink: docker_desktop.yaml options: - option: boot shorthand: b - value_type: init - default_value: false + value_type: int + default_value: 0 description: Show logs from a specified boot. Zero means the current or boot, one the second last boot, and so on deprecated: false hidden: false @@ -50,7 +50,7 @@ options: swarm: false - option: priority shorthand: p - value_type: init + value_type: int default_value: -1 description: Filter output by log priorities. `-1` is all, `0` is info or above, `1` filters for warnings or above, `2` filters for errors. deprecated: false @@ -61,8 +61,7 @@ options: swarm: false - option: since shorthand: S - value_type: bool - default_value: false + value_type: string description: Start showing entries on or newer than the specified date and time. Uses the systemd.time(7) format. deprecated: false hidden: false @@ -72,8 +71,8 @@ options: swarm: false - option: unit shorthand: u - value_type: bool - default_value: false + value_type: stringSlice + default_value: '[]' description: Filter by one or more categories (e.g. `--unit=com.docker.backend.ipc`, `com.docker.backend.apiproxy`) deprecated: false hidden: false @@ -83,7 +82,7 @@ options: swarm: false - option: until shorthand: U - value_type: bool + value_type: string default_value: false description: Start showing entries on or before the specified date and time. Uses the systemd.time(7) format. deprecated: false diff --git a/data/desktop-cli/docker_desktop_module.yaml b/data/desktop-cli/docker_desktop_module.yaml new file mode 100644 index 000000000000..4e044778be32 --- /dev/null +++ b/data/desktop-cli/docker_desktop_module.yaml @@ -0,0 +1,19 @@ +command: docker desktop module +short: Manage Docker Desktop modules +long: Manage Docker Desktop modules +pname: docker desktop +plink: docker_desktop.yaml +cname: + - docker desktop module ls + - docker desktop module reset + - docker desktop module update +clink: + - docker_desktop_module_ls.yaml + - docker_desktop_module_reset.yaml + - docker_desktop_module_update.yaml +deprecated: false +hidden: true +experimental: false +experimentalcli: true +kubernetes: false +swarm: false \ No newline at end of file diff --git a/data/desktop-cli/docker_desktop_module_ls.yaml b/data/desktop-cli/docker_desktop_module_ls.yaml new file mode 100644 index 000000000000..953cd1cce793 --- /dev/null +++ b/data/desktop-cli/docker_desktop_module_ls.yaml @@ -0,0 +1,35 @@ +command: docker desktop module ls +aliases: docker desktop module ls, docker desktop module list +short: List modules +long: List modules +usage: docker desktop module ls +pname: docker desktop module +plink: docker_desktop_module.yaml +options: + - option: format + value_type: string + default_value: pretty + description: 'Format the output. Values: [pretty | json].' + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false + - option: quiet + shorthand: q + value_type: bool + default_value: "false" + description: Only display IDs. + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false +deprecated: false +hidden: false +experimental: false +experimentalcli: true +kubernetes: false +swarm: false \ No newline at end of file diff --git a/data/desktop-cli/docker_desktop_module_reset.yaml b/data/desktop-cli/docker_desktop_module_reset.yaml new file mode 100644 index 000000000000..f3fdc72b97c1 --- /dev/null +++ b/data/desktop-cli/docker_desktop_module_reset.yaml @@ -0,0 +1,12 @@ +command: docker desktop module reset +short: Reset all updated modules +long: Reset all updated modules +usage: docker desktop module reset +pname: docker desktop module +plink: docker_desktop_module.yaml +deprecated: false +hidden: false +experimental: false +experimentalcli: true +kubernetes: false +swarm: false \ No newline at end of file diff --git a/data/desktop-cli/docker_desktop_module_update.yaml b/data/desktop-cli/docker_desktop_module_update.yaml new file mode 100644 index 000000000000..2013c51d5e32 --- /dev/null +++ b/data/desktop-cli/docker_desktop_module_update.yaml @@ -0,0 +1,12 @@ +command: docker desktop module update +short: Update all modules +long: Update all modules +usage: docker desktop module update +pname: docker desktop module +plink: docker_desktop_module.yaml +deprecated: false +hidden: false +experimental: false +experimentalcli: true +kubernetes: false +swarm: false \ No newline at end of file diff --git a/data/desktop-cli/docker_desktop_restart.yaml b/data/desktop-cli/docker_desktop_restart.yaml index 4809ede15448..62653e3d4bad 100644 --- a/data/desktop-cli/docker_desktop_restart.yaml +++ b/data/desktop-cli/docker_desktop_restart.yaml @@ -3,6 +3,29 @@ short: Restart Docker Desktop usage: docker desktop restart pname: docker desktop plink: docker_desktop.yaml +options: + - option: detach + shorthand: d + value_type: bool + default_value: "false" + description: Do not synchronously wait for the requested operation to complete. + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false + - option: timeout + value_type: seconds + default_value: "0" + description: | + Terminate the running command after the specified timeout with a non-zero exit code. A value of zero (the default) or -1 means no timeout. + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false deprecated: false hidden: false experimental: false diff --git a/data/desktop-cli/docker_desktop_start.yaml b/data/desktop-cli/docker_desktop_start.yaml index 3422aa8873d2..95413bef75c1 100644 --- a/data/desktop-cli/docker_desktop_start.yaml +++ b/data/desktop-cli/docker_desktop_start.yaml @@ -5,9 +5,10 @@ pname: docker desktop plink: docker_desktop.yaml options: - option: detach + shorthand: d value_type: bool default_value: false - description: Start Docker Desktop in the background + description: Do not synchronously wait for the requested operation to complete. deprecated: false hidden: false experimental: false @@ -15,9 +16,9 @@ options: kubernetes: false swarm: false - option: timeout - value_type: init + value_type: seconds default_value: 0 - description: Specify in seconds how long to wait for Docker Desktop to start before timing out + description: Terminate the running command after the specified timeout with a non-zero exit code. A value of zero (the default) or -1 means no timeout. deprecated: false hidden: false experimental: false diff --git a/data/desktop-cli/docker_desktop_status.yaml b/data/desktop-cli/docker_desktop_status.yaml index e69a46a6e17d..85afef084e73 100644 --- a/data/desktop-cli/docker_desktop_status.yaml +++ b/data/desktop-cli/docker_desktop_status.yaml @@ -3,6 +3,17 @@ short: Display Docker Desktop's status usage: docker desktop status pname: docker desktop plink: docker_desktop.yaml +options: + - option: format + value_type: string + default_value: pretty + description: 'Format the output. Accepted values are: pretty, json' + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false deprecated: false hidden: false experimental: false diff --git a/data/desktop-cli/docker_desktop_stop.yaml b/data/desktop-cli/docker_desktop_stop.yaml index e0b775a4e6f2..98d0ff7e12e6 100644 --- a/data/desktop-cli/docker_desktop_stop.yaml +++ b/data/desktop-cli/docker_desktop_stop.yaml @@ -5,9 +5,10 @@ pname: docker desktop plink: docker_desktop.yaml options: - option: detach + shorthand: d value_type: bool default_value: false - description: Stop Docker Desktop in the background + description: Do not synchronously wait for the requested operation to complete deprecated: false hidden: false experimental: false @@ -17,6 +18,7 @@ options: - option: force value_type: bool default_value: false + description: Force Docker Desktop to stop deprecated: false hidden: false experimental: false @@ -24,9 +26,9 @@ options: kubernetes: false swarm: false - option: timeout - value_type: init + value_type: seconds default_value: 0 - description: Specify in seconds how long to wait for Docker Desktop to stop before timing out + description: Terminate the running command after the specified timeout with a non-zero exit code. A value of zero (the default) or -1 means no timeout deprecated: false hidden: false experimental: false diff --git a/data/desktop-cli/docker_desktop_update.yaml b/data/desktop-cli/docker_desktop_update.yaml index ab659d47e832..aa50cdcef118 100644 --- a/data/desktop-cli/docker_desktop_update.yaml +++ b/data/desktop-cli/docker_desktop_update.yaml @@ -19,7 +19,7 @@ options: shorthand: q value_type: bool default_value: false - description: Queitly check and apply updates + description: Quietly check and apply updates deprecated: false hidden: false experimental: false diff --git a/data/desktop-cli/docker_desktop_version.yaml b/data/desktop-cli/docker_desktop_version.yaml new file mode 100644 index 000000000000..d52f6315ced9 --- /dev/null +++ b/data/desktop-cli/docker_desktop_version.yaml @@ -0,0 +1,33 @@ +command: docker desktop version +short: Show the Docker Desktop CLI plugin version information +long: Show the Docker Desktop CLI plugin version information +usage: docker desktop version [OPTIONS] +pname: docker desktop +plink: docker_desktop.yaml +options: + - option: format + shorthand: f + value_type: string + description: 'Format the output. Values: [pretty | json]. (Default: pretty)' + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false + - option: short + value_type: bool + default_value: "false" + description: Shows only the version number + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false +deprecated: false +hidden: false +experimental: false +experimentalcli: false +kubernetes: false +swarm: false \ No newline at end of file From e0ea510a211406f484e7d2357f29315fac2edfce Mon Sep 17 00:00:00 2001 From: Craig Osterhout <103533812+craig-osterhout@users.noreply.github.com> Date: Thu, 3 Apr 2025 10:28:20 -0700 Subject: [PATCH 268/699] hub: remove old limit (#22362) ## Description Missed updating one occurrence of hub pull limits. Removed old limit of 5k a day for paid users. Users on new paid plans now have unlimited pulls. ## Related issues or tickets ## Reviews - [ ] Editorial review Signed-off-by: Craig --- content/manuals/docker-hub/image-library/mirror.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/content/manuals/docker-hub/image-library/mirror.md b/content/manuals/docker-hub/image-library/mirror.md index 94a87e866b3c..427ee68f5f7d 100644 --- a/content/manuals/docker-hub/image-library/mirror.md +++ b/content/manuals/docker-hub/image-library/mirror.md @@ -79,10 +79,6 @@ Multiple registry caches can be deployed over the same back-end. A single registry cache ensures that concurrent requests do not pull duplicate data, but this property does not hold true for a registry cache cluster. -> [!NOTE] -> -> When using Docker Hub, all paid Docker subscriptions are limited to 5000 pulls per day. If you require a higher number of pulls, you can purchase an Enhanced Service Account add-on. See [Service Accounts](/docker-hub/service-accounts/) for more details. - ### Configure the cache To configure a Registry to run as a pull through cache, the addition of a From 3a056687f7798c9445cc3c2ead0042df40eccc92 Mon Sep 17 00:00:00 2001 From: Pradumna Saraf Date: Thu, 3 Apr 2025 23:41:18 +0530 Subject: [PATCH 269/699] docs: add a guide for Golang API Monitoring with Prometheus and Grafana (#22292) ## Description add a guide for Golang API Monitoring with Prometheus and Grafana ## Related issues or tickets #22291 ## Reviews - [ ] Technical review - [x] Editorial review - [ ] Product review --------- Co-authored-by: Craig Osterhout <103533812+craig-osterhout@users.noreply.github.com> --- .../guides/go-prometheus-monitoring/_index.md | 40 +++ .../go-prometheus-monitoring/application.md | 250 ++++++++++++++++++ .../go-prometheus-monitoring/compose.md | 166 ++++++++++++ .../go-prometheus-monitoring/containerize.md | 103 ++++++++ .../go-prometheus-monitoring/develop.md | 84 ++++++ content/guides/images/grafana-dash.png | Bin 0 -> 476956 bytes content/guides/images/grafana-panel.png | Bin 0 -> 613982 bytes 7 files changed, 643 insertions(+) create mode 100644 content/guides/go-prometheus-monitoring/_index.md create mode 100644 content/guides/go-prometheus-monitoring/application.md create mode 100644 content/guides/go-prometheus-monitoring/compose.md create mode 100644 content/guides/go-prometheus-monitoring/containerize.md create mode 100644 content/guides/go-prometheus-monitoring/develop.md create mode 100644 content/guides/images/grafana-dash.png create mode 100644 content/guides/images/grafana-panel.png diff --git a/content/guides/go-prometheus-monitoring/_index.md b/content/guides/go-prometheus-monitoring/_index.md new file mode 100644 index 000000000000..99f49630f800 --- /dev/null +++ b/content/guides/go-prometheus-monitoring/_index.md @@ -0,0 +1,40 @@ +--- +description: Containerize a Golang application and monitor it with Prometheus and Grafana. +keywords: golang, prometheus, grafana, monitoring, containerize +title: Monitor a Golang application with Prometheus and Grafana +summary: | + Learn how to containerize a Golang application and monitor it with Prometheus and Grafana. +linkTitle: Monitor with Prometheus and Grafana +languages: [go] +params: + time: 45 minutes +--- + +The guide teaches you how to containerize a Golang application and monitor it with Prometheus and Grafana. + +> **Acknowledgment** +> +> Docker would like to thank [Pradumna Saraf](https://twitter.com/pradumna_saraf) for his contribution to this guide. + +## Overview + +To make sure your application is working as intended, monitoring is important. One of the most popular monitoring tools is Prometheus. Prometheus is an open-source monitoring and alerting toolkit that is designed for reliability and scalability. It collects metrics from monitored targets by scraping metrics HTTP endpoints on these targets. To visualize the metrics, you can use Grafana. Grafana is an open-source platform for monitoring and observability that allows you to query, visualize, alert on, and understand your metrics no matter where they are stored. + +In this guide, you will be creating a Golang server with some endpoints to simulate a real-world application. Then you will expose metrics from the server using Prometheus. Finally, you will visualize the metrics using Grafana. You will containerize the Golang application, and using the Docker Compose file, you will connect all the services: Golang, Prometheus, and Grafana. + +## What will you learn? + +* Create a Golang application with custom Prometheus metrics. +* Containerize a Golang application. +* Use Docker Compose to run multiple services and connect them together to monitor a Golang application with Prometheus and Grafana. +* Visualize the metrics using Grafana dashboards. + +## Prerequisites + +- A good understanding of Golang is assumed. +- You must me familiar with Prometheus and creating dashboards in Grafana. +- You must have familiarity with Docker concepts like containers, images, and Dockerfiles. If you are new to Docker, you can start with the [Docker basics](/get-started/docker-concepts/the-basics/what-is-a-container.md) guide. + +## Next steps + +You will create a Golang server and expose metrics using Prometheus. diff --git a/content/guides/go-prometheus-monitoring/application.md b/content/guides/go-prometheus-monitoring/application.md new file mode 100644 index 000000000000..9845b9e127e1 --- /dev/null +++ b/content/guides/go-prometheus-monitoring/application.md @@ -0,0 +1,250 @@ +--- +title: Building the application +linkTitle: Understand the application +weight: 10 # +keywords: go, golang, prometheus, grafana, containerize, monitor +description: Learn how to create a Golang server to register metrics with Prometheus. +--- + +## Prerequisites + +* You have a [Git client](https://git-scm.com/downloads). The examples in this section use a command-line based Git client, but you can use any client. + +You will be creating a Golang server with some endpoints to simulate a real-world application. Then you will expose metrics from the server using Prometheus. + +## Getting the sample application + +Clone the sample application to use with this guide. Open a terminal, change +directory to a directory that you want to work in, and run the following +command to clone the repository: + +```console +$ git clone https://github.com/dockersamples/go-prometheus-monitoring.git +``` + +Once you cloned you will see the following content structure inside `go-prometheus-monitoring` directory, + +```text +go-prometheus-monitoring +├── CONTRIBUTING.md +├── Docker +│ ├── grafana.yml +│ └── prometheus.yml +├── dashboard.json +├── Dockerfile +├── LICENSE +├── README.md +├── compose.yaml +├── go.mod +├── go.sum +└── main.go +``` + +- **main.go** - The entry point of the application. +- **go.mod and go.sum** - Go module files. +- **Dockerfile** - Dockerfile used to build the app. +- **Docker/** - Contains the Docker Compose configuration files for Grafana and Prometheus. +- **compose.yaml** - Compose file to launch everything (Golang app, Prometheus, and Grafana). +- **dashboard.json** - Grafana dashboard configuration file. +- **Dockerfile** - Dockerfile used to build the Golang app. +- **compose.yaml** - Docker Compose file to launch everything (Golang app, Prometheus, and Grafana). +- Other files are for licensing and documentation purposes. + +## Understanding the application + +The following is the complete logic of the application you will find in `main.go`. + +```go +package main + +import ( + "strconv" + + "github.com/gin-gonic/gin" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +// Define metrics +var ( + HttpRequestTotal = prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "api_http_request_total", + Help: "Total number of requests processed by the API", + }, []string{"path", "status"}) + + HttpRequestErrorTotal = prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "api_http_request_error_total", + Help: "Total number of errors returned by the API", + }, []string{"path", "status"}) +) + +// Custom registry (without default Go metrics) +var customRegistry = prometheus.NewRegistry() + +// Register metrics with custom registry +func init() { + customRegistry.MustRegister(HttpRequestTotal, HttpRequestErrorTotal) +} + +func main() { + router := gin.Default() + + // Register /metrics before middleware + router.GET("/metrics", PrometheusHandler()) + + router.Use(RequestMetricsMiddleware()) + router.GET("/health", func(c *gin.Context) { + c.JSON(200, gin.H{ + "message": "Up and running!", + }) + }) + router.GET("/v1/users", func(c *gin.Context) { + c.JSON(200, gin.H{ + "message": "Hello from /v1/users", + }) + }) + + router.Run(":8000") +} + +// Custom metrics handler with custom registry +func PrometheusHandler() gin.HandlerFunc { + h := promhttp.HandlerFor(customRegistry, promhttp.HandlerOpts{}) + return func(c *gin.Context) { + h.ServeHTTP(c.Writer, c.Request) + } +} + +// Middleware to record incoming requests metrics +func RequestMetricsMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + path := c.Request.URL.Path + c.Next() + status := c.Writer.Status() + if status < 400 { + HttpRequestTotal.WithLabelValues(path, strconv.Itoa(status)).Inc() + } else { + HttpRequestErrorTotal.WithLabelValues(path, strconv.Itoa(status)).Inc() + } + } +} +``` + +In this part of the code, you have imported the required packages `gin`, `prometheus`, and `promhttp`. Then you have defined a couple of variables, `HttpRequestTotal` and `HttpRequestErrorTotal` are Prometheus counter metrics, and `customRegistry` is a custom registry that will be used to register these metrics. The name of the metric is a string that you can use to identify the metric. The help string is a string that will be shown when you query the `/metrics` endpoint to understand the metric. The reason you are using the custom registry is so avoid the default Go metrics that are registered by default by the Prometheus client. Then using the `init` function you are registering the metrics with the custom registry. + +```go +import ( + "strconv" + + "github.com/gin-gonic/gin" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +// Define metrics +var ( + HttpRequestTotal = prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "api_http_request_total", + Help: "Total number of requests processed by the API", + }, []string{"path", "status"}) + + HttpRequestErrorTotal = prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "api_http_request_error_total", + Help: "Total number of errors returned by the API", + }, []string{"path", "status"}) +) + +// Custom registry (without default Go metrics) +var customRegistry = prometheus.NewRegistry() + +// Register metrics with custom registry +func init() { + customRegistry.MustRegister(HttpRequestTotal, HttpRequestErrorTotal) +} +``` + +In the `main` function, you have created a new instance of the `gin` framework and created three routes. You can see the health endpoint that is on path `/health` that will return a JSON with `{"message": "Up and running!"}` and the `/v1/users` endpoint that will return a JSON with `{"message": "Hello from /v1/users"}`. The third route is for the `/metrics` endpoint that will return the metrics in the Prometheus format. Then you have `RequestMetricsMiddleware` middleware, it will be called for every request made to the API. It will record the incoming requests metrics like status codes and paths. Finally, you are running the gin application on port 8000. + +```golang +func main() { + router := gin.Default() + + // Register /metrics before middleware + router.GET("/metrics", PrometheusHandler()) + + router.Use(RequestMetricsMiddleware()) + router.GET("/health", func(c *gin.Context) { + c.JSON(200, gin.H{ + "message": "Up and running!", + }) + }) + router.GET("/v1/users", func(c *gin.Context) { + c.JSON(200, gin.H{ + "message": "Hello from /v1/users", + }) + }) + + router.Run(":8000") +} +``` + +Now comes the middleware function `RequestMetricsMiddleware`. This function is called for every request made to the API. It increments the `HttpRequestTotal` counter (different counter for different paths and status codes) if the status code is less than or equal to 400. If the status code is greater than 400, it increments the `HttpRequestErrorTotal` counter (different counter for different paths and status codes). The `PrometheusHandler` function is the custom handler that will be called for the `/metrics` endpoint. It will return the metrics in the Prometheus format. + +```golang +// Custom metrics handler with custom registry +func PrometheusHandler() gin.HandlerFunc { + h := promhttp.HandlerFor(customRegistry, promhttp.HandlerOpts{}) + return func(c *gin.Context) { + h.ServeHTTP(c.Writer, c.Request) + } +} + +// Middleware to record incoming requests metrics +func RequestMetricsMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + path := c.Request.URL.Path + c.Next() + status := c.Writer.Status() + if status < 400 { + HttpRequestTotal.WithLabelValues(path, strconv.Itoa(status)).Inc() + } else { + HttpRequestErrorTotal.WithLabelValues(path, strconv.Itoa(status)).Inc() + } + } +} +``` + +That's it, this was the complete gist of the application. Now it's time to run and test if the app is registering metrics correctly. + +## Running the application + +Make sure you are still inside `go-prometheus-monitoring` directory in the terminal, and run the following command. Install the dependencies by running `go mod tidy` and then build and run the application by running `go run main.go`. Then visit `http://localhost:8000/health` or `http://localhost:8000/v1/users`. You should see the output `{"message": "Up and running!"}` or `{"message": "Hello from /v1/users"}`. If you are able to see this then your app is successfully up and running. + + +Now, check your application's metrics by accessing the `/metrics` endpoint. +Open `http://localhost:8000/metrics` in your browser. You should see similar output to the following. + +```sh +# HELP api_http_request_error_total Total number of errors returned by the API +# TYPE api_http_request_error_total counter +api_http_request_error_total{path="/",status="404"} 1 +api_http_request_error_total{path="//v1/users",status="404"} 1 +api_http_request_error_total{path="/favicon.ico",status="404"} 1 +# HELP api_http_request_total Total number of requests processed by the API +# TYPE api_http_request_total counter +api_http_request_total{path="/health",status="200"} 2 +api_http_request_total{path="/v1/users",status="200"} 1 +``` + +In the terminal, press `ctrl` + `c` to stop the application. + +> [!Note] +> If you don't want to run the application locally, and want to run it in a Docker container, skip to next page where you create a Dockerfile and containerize the application. + +## Summary + +In this section, you learned how to create a Golang app to register metrics with Prometheus. By implementing middleware functions, you were able to increment the counters based on the request path and status codes. + +## Next steps + +In the next section, you'll learn how to containerize your application. diff --git a/content/guides/go-prometheus-monitoring/compose.md b/content/guides/go-prometheus-monitoring/compose.md new file mode 100644 index 000000000000..dd9763bcd117 --- /dev/null +++ b/content/guides/go-prometheus-monitoring/compose.md @@ -0,0 +1,166 @@ +--- +title: Connecting services with Docker Compose +linkTitle: Connecting services with Docker Compose +weight: 30 # +keywords: go, golang, prometheus, grafana, containerize, monitor +description: Learn how to connect services with Docker Compose to monitor a Golang application with Prometheus and Grafana. +--- + +Now that you have containerized the Golang application, you will use Docker Compose to connect your services together. You will connect the Golang application, Prometheus, and Grafana services together to monitor the Golang application with Prometheus and Grafana. + +## Creating a Docker Compose file + +Create a new file named `compose.yml` in the root directory of your Golang application. The Docker Compose file contains instructions to run multiple services and connect them together. + +Here is a Docker Compose file for a project that uses Golang, Prometheus, and Grafana. You will also find this file in the `go-prometheus-monitoring` directory. + +```yaml +services: + api: + container_name: go-api + build: + context: . + dockerfile: Dockerfile + image: go-api:latest + ports: + - 8000:8000 + networks: + - go-network + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/health"] + interval: 30s + timeout: 10s + retries: 5 + develop: + watch: + - path: . + action: rebuild + + prometheus: + container_name: prometheus + image: prom/prometheus:v2.55.0 + volumes: + - ./Docker/prometheus.yml:/etc/prometheus/prometheus.yml + ports: + - 9090:9090 + networks: + - go-network + + grafana: + container_name: grafana + image: grafana/grafana:11.3.0 + volumes: + - ./Docker/grafana.yml:/etc/grafana/provisioning/datasources/datasource.yaml + - grafana-data:/var/lib/grafana + ports: + - 3000:3000 + networks: + - go-network + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=password + +volumes: + grafana-data: + +networks: + go-network: + driver: bridge +``` + +## Understanding the Docker Compose file + +The Docker Compose file consists of three services: + +- **Golang application service**: This service builds the Golang application using the Dockerfile and runs it in a container. It exposes the application's port `8000` and connects to the `go-network` network. It also defines a health check to monitor the application's health. You have also used `healthcheck` to monitor the health of the application. The health check runs every 30 seconds and retries 5 times if the health check fails. The health check uses the `curl` command to check the `/health` endpoint of the application. Apart from the health check, you have also added a `develop` section to watch the changes in the application's source code and rebuild the application using the Docker Compose Watch feature. + +- **Prometheus service**: This service runs the Prometheus server in a container. It uses the official Prometheus image `prom/prometheus:v2.55.0`. It exposes the Prometheus server on port `9090` and connects to the `go-network` network. You have also mounted the `prometheus.yml` file from the `Docker` directory which is present in the root directory of your project. The `prometheus.yml` file contains the Prometheus configuration to scrape the metrics from the Golang application. This is how you connect the Prometheus server to the Golang application. + + ```yaml + global: + scrape_interval: 10s + evaluation_interval: 10s + + scrape_configs: + - job_name: myapp + static_configs: + - targets: ["api:8000"] + ``` + + In the `prometheus.yml` file, you have defined a job named `myapp` to scrape the metrics from the Golang application. The `targets` field specifies the target to scrape the metrics from. In this case, the target is the Golang application running on port `8000`. The `api` is the service name of the Golang application in the Docker Compose file. The Prometheus server will scrape the metrics from the Golang application every 10 seconds. + +- **Grafana service**: This service runs the Grafana server in a container. It uses the official Grafana image `grafana/grafana:11.3.0`. It exposes the Grafana server on port `3000` and connects to the `go-network` network. You have also mounted the `grafana.yml` file from the `Docker` directory which is present in the root directory of your project. The `grafana.yml` file contains the Grafana configuration to add the Prometheus data source. This is how you connect the Grafana server to the Prometheus server. In the environment variables, you have set the Grafana admin user and password, which will be used to log in to the Grafana dashboard. + + ```yaml + apiVersion: 1 + datasources: + - name: Prometheus (Main) + type: prometheus + url: http://prometheus:9090 + isDefault: true + ``` + + In the `grafana.yml` file, you have defined a Prometheus data source named `Prometheus (Main)`. The `type` field specifies the type of the data source, which is `prometheus`. The `url` field specifies the URL of the Prometheus server to fetch the metrics from. In this case, the URL is `http://prometheus:9090`. `prometheus` is the service name of the Prometheus server in the Docker Compose file. The `isDefault` field specifies whether the data source is the default data source in Grafana. + +Apart from the services, the Docker Compose file also defines a volume named `grafana-data` to persist the Grafana data and a network named `go-network` to connect the services together. You have created a custom network `go-network` to connect the services together. The `driver: bridge` field specifies the network driver to use for the network. + +## Building and running the services + +Now that you have the Docker Compose file, you can build the services and run them together using Docker Compose. + +To build and run the services, run the following command in the terminal: + +```console +$ docker compose up +``` + +The `docker compose up` command builds the services defined in the Docker Compose file and runs them together. You will see the similar output in the terminal: + +```console + ✔ Network go-prometheus-monitoring_go-network Created 0.0s + ✔ Container grafana Created 0.3s + ✔ Container go-api Created 0.2s + ✔ Container prometheus Created 0.3s +Attaching to go-api, grafana, prometheus +go-api | [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. +go-api | +go-api | [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. +go-api | - using env: export GIN_MODE=release +go-api | - using code: gin.SetMode(gin.ReleaseMode) +go-api | +go-api | [GIN-debug] GET /metrics --> main.PrometheusHandler.func1 (3 handlers) +go-api | [GIN-debug] GET /health --> main.main.func1 (4 handlers) +go-api | [GIN-debug] GET /v1/users --> main.main.func2 (4 handlers) +go-api | [GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value. +go-api | Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details. +go-api | [GIN-debug] Listening and serving HTTP on :8000 +prometheus | ts=2025-03-15T05:57:06.676Z caller=main.go:627 level=info msg="No time or size retention was set so using the default time retention" duration=15d +prometheus | ts=2025-03-15T05:57:06.678Z caller=main.go:671 level=info msg="Starting Prometheus Server" mode=server version="(version=2.55.0, branch=HEAD, revision=91d80252c3e528728b0f88d254dd720f6be07cb8)" +grafana | logger=settings t=2025-03-15T05:57:06.865335506Z level=info msg="Config overridden from command line" arg="default.log.mode=console" +grafana | logger=settings t=2025-03-15T05:57:06.865337131Z level=info msg="Config overridden from Environment variable" var="GF_PATHS_DATA=/var/lib/grafana" +grafana | logger=ngalert.state.manager t=2025-03-15T05:57:07.088956839Z level=info msg="State +. +. +grafana | logger=plugin.angulardetectorsprovider.dynamic t=2025-03-15T05:57:07.530317298Z level=info msg="Patterns update finished" duration=440.489125ms +``` + +The services will start running, and you can access the Golang application at `http://localhost:8000`, Prometheus at `http://localhost:9090/health`, and Grafana at `http://localhost:3000`. You can also check the running containers using the `docker ps` command. + +```console +$ docker ps +``` + +## Summary + +In this section, you learned how to connect services together using Docker Compose. You created a Docker Compose file to run multiple services together and connect them using networks. You also learned how to build and run the services using Docker Compose. + +Related information: + + - [Docker Compose overview](/manuals/compose/_index.md) + - [Compose file reference](/reference/compose-file/_index.md) + +Next, you will learn how to develop the Golang application with Docker Compose and monitor it with Prometheus and Grafana. + +## Next steps + +In the next section, you will learn how to develop the Golang application with Docker. You will also learn how to use Docker Compose Watch to rebuild the image whenever you make changes to the code. Lastly, you will test the application and visualize the metrics in Grafana using Prometheus as the data source. \ No newline at end of file diff --git a/content/guides/go-prometheus-monitoring/containerize.md b/content/guides/go-prometheus-monitoring/containerize.md new file mode 100644 index 000000000000..a0a1a7401c2e --- /dev/null +++ b/content/guides/go-prometheus-monitoring/containerize.md @@ -0,0 +1,103 @@ +--- +title: Containerize a Golang application +linkTitle: Containerize your app +weight: 20 +keywords: go, golang, containerize, initialize +description: Learn how to containerize a Golang application. +--- + +Containerization helps you bundle the application and its dependencies into a single package called a container. This package can run on any platform without worrying about the environment. In this section, you will learn how to containerize a Golang application using Docker. + +To containerize a Golang application, you first need to create a Dockerfile. The Dockerfile contains instructions to build and run the application in a container. Also, when creating a Dockerfile, you can follow different sets of best practices to optimize the image size and make it more secure. + +## Creating a Dockerfile + +Create a new file named `Dockerfile` in the root directory of your Golang application. The Dockerfile contains instructions to build and run the application in a container. + +The following is a Dockerfile for a Golang application. You will also find this file in the `go-prometheus-monitoring` directory. + +```dockerfile +# Use the official Golang image as the base +FROM golang:1.24-alpine AS builder + +# Set environment variables +ENV CGO_ENABLED=0 \ + GOOS=linux \ + GOARCH=amd64 + +# Set working directory inside the container +WORKDIR /build + +# Copy go.mod and go.sum files for dependency installation +COPY go.mod go.sum ./ + +# Download dependencies +RUN go mod download + +# Copy the entire application source +COPY . . + +# Build the Go binary +RUN go build -o /app . + +# Final lightweight stage +FROM alpine:3.17 AS final + +# Copy the compiled binary from the builder stage +COPY --from=builder /app /bin/app + +# Expose the application's port +EXPOSE 8000 + +# Run the application +CMD ["bin/app"] +``` + +## Understanding the Dockerfile + +The Dockerfile consists of two stages: + +1. **Build stage**: This stage uses the official Golang image as the base and sets the necessary environment variables. It also sets the working directory inside the container, copies the `go.mod` and `go.sum` files for dependency installation, downloads the dependencies, copies the entire application source, and builds the Go binary. + + You use the `golang:1.24-alpine` image as the base image for the build stage. The `CGO_ENABLED=0` environment variable disables CGO, which is useful for building static binaries. You also set the `GOOS` and `GOARCH` environment variables to `linux` and `amd64`, respectively, to build the binary for the Linux platform. + +2. **Final stage**: This stage uses the official Alpine image as the base and copies the compiled binary from the build stage. It also exposes the application's port and runs the application. + + You use the `alpine:3.17` image as the base image for the final stage. You copy the compiled binary from the build stage to the final image. You expose the application's port using the `EXPOSE` instruction and run the application using the `CMD` instruction. + + Apart from the multi-stage build, the Dockerfile also follows best practices such as using the official images, setting the working directory, and copying only the necessary files to the final image. You can further optimize the Dockerfile by other best practices. + +## Build the Docker image and run the application + +One you have the Dockerfile, you can build the Docker image and run the application in a container. + +To build the Docker image, run the following command in the terminal: + +```console +$ docker build -t go-api:latest . +``` + +After building the image, you can run the application in a container using the following command: + +```console +$ docker run -p 8000:8000 go-api:latest +``` + +The application will start running inside the container, and you can access it at `http://localhost:8000`. You can also check the running containers using the `docker ps` command. + +```console +$ docker ps +``` + +## Summary + +In this section, you learned how to containerize a Golang application using a Dockerfile. You created a multi-stage Dockerfile to build and run the application in a container. You also learned about best practices to optimize the Docker image size and make it more secure. + +Related information: + + - [Dockerfile reference](/reference/dockerfile.md) + - [.dockerignore file](/reference/dockerfile.md#dockerignore-file) + +## Next steps + +In the next section, you will learn how to use Docker Compose to connect and run multiple services together to monitor a Golang application with Prometheus and Grafana. diff --git a/content/guides/go-prometheus-monitoring/develop.md b/content/guides/go-prometheus-monitoring/develop.md new file mode 100644 index 000000000000..7cf147604f5d --- /dev/null +++ b/content/guides/go-prometheus-monitoring/develop.md @@ -0,0 +1,84 @@ +--- +title: Developing your application +linkTitle: Develop your app +weight: 40 +keywords: go, golang, containerize, initialize +description: Learn how to develop the Golang application with Docker. +--- + +In the last section, you saw how using Docker Compose, you can connect your services together. In this section, you will learn how to develop the Golang application with Docker. You will also see how to use Docker Compose Watch to rebuild the image whenever you make changes to the code. Lastly, you will test the application and visualize the metrics in Grafana using Prometheus as the data source. + +## Developing the application + +Now, if you make any changes to your Golang application locally, it needs to reflect in the container, right? To do that, one approach is use the `--build` flag in Docker Compose after making changes in the code. This will rebuild all the services which have the `build` instruction in the `compose.yml` file, in your case, the `api` service (Golang application). + +```console +docker compose up --build +``` + +But, this is not the best approach. This is not efficient. Every time you make a change in the code, you need to rebuild manually. This is not is not a good flow for development. + +The better approach is to use Docker Compose Watch. In the `compose.yml` file, under the service `api`, you have added the `develop` section. So, it's more like a hot reloading. Whenever you make changes to code (defined in `path`), it will rebuild the image (or restart depending on the action). This is how you can use it: + +```yaml {hl_lines="17-20",linenos=true} +services: + api: + container_name: go-api + build: + context: . + dockerfile: Dockerfile + image: go-api:latest + ports: + - 8000:8000 + networks: + - go-network + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/health"] + interval: 30s + timeout: 10s + retries: 5 + develop: + watch: + - path: . + action: rebuild +``` + +Once you have added the `develop` section in the `compose.yml` file, you can use the following command to start the development server: + +```console +$ docker compose watch +``` + +Now, if you modify your `main.go` or any other file in the project, the `api` service will be rebuilt automatically. You will see the following output in the terminal: + +```bash +Rebuilding service(s) ["api"] after changes were detected... +[+] Building 8.1s (15/15) FINISHED docker:desktop-linux + => [api internal] load build definition from Dockerfile 0.0s + => => transferring dockerfile: 704B 0.0s + => [api internal] load metadata for docker.io/library/alpine:3.17 1.1s + . + => => exporting manifest list sha256:89ebc86fd51e27c1da440dc20858ff55fe42211a1930c2d51bbdce09f430c7f1 0.0s + => => naming to docker.io/library/go-api:latest 0.0s + => => unpacking to docker.io/library/go-api:latest 0.0s + => [api] resolving provenance for metadata file 0.0s +service(s) ["api"] successfully built +``` + +## Testing the application + +Now that you have your application running, head over to the Grafana dashboard to visualize the metrics you are registering. Open your browser and navigate to `http://localhost:3000`. You will be greeted with the Grafana login page. The login credentials are the ones provided in Compose file. + +Once you are logged in, you can create a new dashboard. While creating dashboard you will notice that is default data source is `Prometheus`. This is because you have already configured the data source in the `grafana.yml` file. + +![The optional settings screen with the options specified.](../images/grafana-dash.png) + +You can use different panels to visualize the metrics. This guide doesn't go into details of Grafana. You can refer to the [Grafana documentation](https://grafana.com/docs/grafana/latest/) for more information. There is a Bar Gauge panel to visualize the total number of requests from different endpoints. You used the `api_http_request_total` and `api_http_request_error_total` metrics to get the data. + +![The optional settings screen with the options specified.](../images/grafana-panel.png) + +You created this panel to visualize the total number of requests from different endpoints to compare the successful and failed requests. For all the good requests, the bar will be green, and for all the failed requests, the bar will be red. Plus it will also show the from which endpoint the request is coming, either it's a successful request or a failed request. If you want to use this panel, you can import the `dashboard.json` file from the repository you cloned. + +## Summary + +You've come to the end of this guide. You learned how to develop the Golang application with Docker. You also saw how to use Docker Compose Watch to rebuild the image whenever you make changes to the code. Lastly, you tested the application and visualized the metrics in Grafana using Prometheus as the data source. \ No newline at end of file diff --git a/content/guides/images/grafana-dash.png b/content/guides/images/grafana-dash.png new file mode 100644 index 0000000000000000000000000000000000000000..73c55c8ad4d48b909aef766b8f1def1ada07fbbc GIT binary patch literal 476956 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

p)b>055UwfU~KxxU&PY4ZH(q^9YWp5Na{8>eU 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

%> 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 Aa{vGU literal 0 HcmV?d00001 diff --git a/content/guides/images/grafana-panel.png b/content/guides/images/grafana-panel.png new file mode 100644 index 0000000000000000000000000000000000000000..0b04168b0727cd466e849dfe648c56e5470d4833 GIT binary patch literal 613982 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%0D8f5Y3-tvSjy98;sP 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

*3|#+{brL^k4P;AFgZvin#u{ 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%0A8&wq8=m{0BP+;%Lm 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𝔬K>< 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%0AJ(ZWHYv@dHCoeihP4QhvQis<_5-Q&fhY(tyW1Z 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 KpLhEF_5T4%KN)QR literal 0 HcmV?d00001 From 393e76877f5f730a96c154a067515bd4e9106b75 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Fri, 4 Apr 2025 10:16:12 -0400 Subject: [PATCH 270/699] Merge pull request #22360 from sarahsanders-docker/link-payment-method billing: add link as new payment method --- content/manuals/billing/faqs.md | 1 + content/manuals/billing/payment-method.md | 43 +++++++++++++++++------ 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/content/manuals/billing/faqs.md b/content/manuals/billing/faqs.md index 59332b90a938..4bc962db7c13 100644 --- a/content/manuals/billing/faqs.md +++ b/content/manuals/billing/faqs.md @@ -16,6 +16,7 @@ weight: 60 - JCB - Diners - UnionPay +- Link ### What currency is supported? diff --git a/content/manuals/billing/payment-method.md b/content/manuals/billing/payment-method.md index d02a42b5fcdb..cfe74510ffb5 100644 --- a/content/manuals/billing/payment-method.md +++ b/content/manuals/billing/payment-method.md @@ -24,6 +24,7 @@ The following payment methods are supported: - JCB - Diners - UnionPay +- Link All currency, for example the amount listed on your billing invoice, is in United States dollar (USD). @@ -42,8 +43,13 @@ To add a payment method: 2. Under Settings and administration, select **Billing**. 3. Select **Payment methods** from the left-hand menu. 4. Select **Add payment method**. -5. Enter your new payment information. -6. Select **Add**. +5. Enter your new payment information: + - If you are adding a card, fill out the card information form. + - If you are adding a Link payment, select **Secure, 1-click checkout with Link** + and enter your Link **email address** and **phone number**. If you are not + an existing Link customer, you must fill out the card information form to + store a card for Link payments. +6. Select **Add payment method**. 7. Optional. You can set a new default payment method by selecting the **Set as default** action. 8. Optional. You can remove non-default payment methods by selecting the **Delete** action. @@ -57,9 +63,15 @@ To add a payment method: 3. From the drop-down menu select **Billing**. 4. Select the **Payment methods and billing history** link. 5. In the **Payment method** section, select **Add payment method**. -6. Enter your new payment information, then select **Add**. -7. Select the **Actions** icon, then select **Make default** to ensure that your new payment method applies to all purchases and subscriptions. -8. Optional. You can remove non-default payment methods by selecting the **Actions** icon. Then, select **Delete**. +6. Enter your new payment information: + - If you are adding a card, fill out the card information form. + - IIf you are adding a Link payment, select **Secure, 1-click checkout with Link** + and enter your Link **email address** and **phone number**. If you are not + an existing Link customer, you must fill out the card information form to + store a card for Link payments. +7. Select **Add**. +8. Select the **Actions** icon, then select **Make default** to ensure that your new payment method applies to all purchases and subscriptions. +9. Optional. You can remove non-default payment methods by selecting the **Actions** icon. Then, select **Delete**. {{< /tab >}} {{< /tabs >}} @@ -80,8 +92,13 @@ To add a payment method: 3. Choose your organization from the top-left drop-down. 4. Select **Payment methods** from the left-hand menu. 5. Select **Add payment method**. -6. Enter your new payment information. -7. Select **Add**. +6. Enter your new payment information: + - If you are adding a card, fill out the card information form. + - If you are adding a Link payment, select **Secure, 1-click checkout with Link** + and enter your Link **email address** and **phone number**. If you are not + an existing Link customer, you must fill out the card information form to + store a card for Link payments. +7. Select **Add payment method**. 8. Optional. You can set a new default payment method by selecting the **Set as default** action. 9. Optional. You can remove non-default payment methods by selecting the **Delete** action. @@ -96,9 +113,15 @@ To add a payment method: 4. Select the organization account you want to update. 5. Select the **Payment methods and billing history** link. 6. In the **Payment Method** section, select **Add payment method**. -7. Enter your new payment information, then select **Add**. -8. Select the **Actions** icon, then select **Make default** to ensure that your new payment method applies to all purchases and subscriptions. -9. Optional. You can remove non-default payment methods by selecting the **Actions** icon. Then, select **Delete**. +7. Enter your new payment information: + - If you are adding a card, fill out the card information form. + - If you are adding a Link payment, select **Secure, 1-click checkout with Link** + and enter your Link **email address** and **phone number**. If you are not + an existing Link customer, you must fill out the card information form to + store a card for Link payments. +8. Select **Add payment method**. +9. Select the **Actions** icon, then select **Make default** to ensure that your new payment method applies to all purchases and subscriptions. +10. Optional. You can remove non-default payment methods by selecting the **Actions** icon. Then, select **Delete**. {{< /tab >}} {{< /tabs >}} From eee4ee8e93d76942a0b9adf10044bae7ab75d27a Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Fri, 4 Apr 2025 15:50:07 +0100 Subject: [PATCH 271/699] Merge pull request #22364 from aevesdocker/vm-vdi-citrix Add: VM-VDI Citrix info --- _vale/config/vocabularies/Docker/accept.txt | 1 + content/manuals/desktop/setup/vm-vdi.md | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/_vale/config/vocabularies/Docker/accept.txt b/_vale/config/vocabularies/Docker/accept.txt index 1829794d83f2..97d7666e2c2e 100644 --- a/_vale/config/vocabularies/Docker/accept.txt +++ b/_vale/config/vocabularies/Docker/accept.txt @@ -11,6 +11,7 @@ CentOS Ceph Chrome Chrome DevTools +Citrix CloudFront Codefresh Codespaces diff --git a/content/manuals/desktop/setup/vm-vdi.md b/content/manuals/desktop/setup/vm-vdi.md index 153c1d9bff35..37333024258e 100644 --- a/content/manuals/desktop/setup/vm-vdi.md +++ b/content/manuals/desktop/setup/vm-vdi.md @@ -25,6 +25,12 @@ For troubleshooting problems and intermittent failures that are outside of Docke Docker does not support running multiple instances of Docker Desktop on the same machine in a VM or VDI environment. +> [!TIP] +> +> If you're running Docker Desktop inside a Citrix VDI, note that Citrix can be used with a variety of underlying hypervisors, for example VMware, Hyper-V, Citrix Hypervisor/XenServer. Docker Desktop requires nested virtualization, which is not supported by Citrix Hypervisor/XenServer. +> +> Check with your Citrix administrator or VDI infrastructure team to confirm which hypervisor is being used, and whether nested virtualization is enabled. + ## Turn on nested virtualization You must turn on nested virtualization before you install Docker Desktop on a virtual machine. From 530860f00e2a37e08ddee9bd129783cd4b086e89 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Mon, 7 Apr 2025 10:07:56 +0100 Subject: [PATCH 272/699] Merge pull request #22376 from aevesdocker/kube-dash kube dash --- content/manuals/desktop/features/kubernetes.md | 8 -------- content/manuals/desktop/release-notes.md | 1 - 2 files changed, 9 deletions(-) diff --git a/content/manuals/desktop/features/kubernetes.md b/content/manuals/desktop/features/kubernetes.md index 1b3b5eedb8b7..264a163b0644 100644 --- a/content/manuals/desktop/features/kubernetes.md +++ b/content/manuals/desktop/features/kubernetes.md @@ -83,14 +83,6 @@ The following table summarizes this comparison. ### Additional settings -#### Kubernetes Dashboard - -Once Kubernetes is installed and set up, you can select the **Deploy the Kubernetes Dashboard into cluster** setting. - -This setting installs the Kubernetes Dashboard in Docker Desktop and gives you the option to open the Dashboard web UI in an external browser with the **Launch Dashboard** button located at the top-right of the settings page. - -The Kubernetes Dashboard helps you manage and monitor your Kubernetes clusters and applications more easily. - #### Viewing system containers By default, Kubernetes system containers are hidden. To inspect these containers, enable **Show system containers (advanced)**. diff --git a/content/manuals/desktop/release-notes.md b/content/manuals/desktop/release-notes.md index 35a658da63f4..354e530c4935 100644 --- a/content/manuals/desktop/release-notes.md +++ b/content/manuals/desktop/release-notes.md @@ -52,7 +52,6 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo #### For all platforms -- You can now get quick access to the Kubernetes Dashboard with the **Launch Dashboard** button on the **Kubernetes** settings page. - Fixed a bug that caused `docker-proxy` to stop forwarding UDP datagrams to containers. - Fixed a bug that caused docker-proxy to close UDP connections to containers eagerly and resulting in the source address to change needlessly - Fixed a race condition that prevented Docker Desktop Kubernetes from starting in some scenarios. From 1a1d108185945e7ecab8785e8572a19dda776dac Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Mon, 7 Apr 2025 09:16:40 -0400 Subject: [PATCH 273/699] chore: add missing cards from platform landing pages (#22366) ## Description - a few cards were missing from platform landing pages (OATs being one) ## Related issues or tickets - [ENGDOCS-2518](https://docker.atlassian.net/browse/ENGDOCS-2518) ## Reviews - [ ] Editorial review [ENGDOCS-2518]: https://docker.atlassian.net/browse/ENGDOCS-2518?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- content/manuals/billing/_index.md | 2 +- content/manuals/security/_index.md | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/content/manuals/billing/_index.md b/content/manuals/billing/_index.md index 84b6b03da948..fc869b4dcb26 100644 --- a/content/manuals/billing/_index.md +++ b/content/manuals/billing/_index.md @@ -12,7 +12,7 @@ grid_core: description: Learn how to add or update a payment method for your personal account or organization. link: /billing/payment-method/ icon: credit_score -- title: Update the billing information +- title: Update billing information description: Discover how to update the billing information for your personal account or organization. link: /billing/details/ icon: contract_edit diff --git a/content/manuals/security/_index.md b/content/manuals/security/_index.md index 1d2ecf3b2403..dca9ab57f16c 100644 --- a/content/manuals/security/_index.md +++ b/content/manuals/security/_index.md @@ -55,6 +55,14 @@ grid_admins: description: Learn how to configure and set up a private marketplace with a curated list of extensions for your Docker Desktop users. icon: storefront link: /desktop/extensions/private-marketplace/ +- title: Organization access tokens + description: Create organization access tokens as an alternative to a password. + link: /security/for-admins/access-tokens/ + icon: password +- title: Enforce sign-in + description: Enforce your users to sign in to Docker Desktop. + link: /security/for-admins/enforce-sign-in/ + icon: login grid_developers: - title: Set up two-factor authentication description: Add an extra layer of authentication to your Docker account. From 16711cd178a03c4bb585c07d58f56ad7a2a8cdd5 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Mon, 7 Apr 2025 09:17:19 -0400 Subject: [PATCH 274/699] cx: update docs for RAM limits (#22365) ## Description - Docs previously stated there were no RAM limits, this is incorrect - 100 is the limit - Also added some guidance around using general-purpose URLs; doing this can deprecate use of RAM limits ## Related issues or tickets - [ENGDOCS-2517](https://docker.atlassian.net/browse/ENGDOCS-2517) ## Reviews - [ ] Editorial review - [ ] Product review @ajthilakan [ENGDOCS-2517]: https://docker.atlassian.net/browse/ENGDOCS-2517?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .../registry-access-management.md | 51 ++++++++++++++----- layouts/shortcodes/admin-registry-access.html | 32 +++++++++--- 2 files changed, 64 insertions(+), 19 deletions(-) diff --git a/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md b/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md index 727ca56d38fe..f2b3ac55b82a 100644 --- a/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md +++ b/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md @@ -13,9 +13,16 @@ weight: 30 {{< summary-bar feature_name="Registry access management" >}} -With Registry Access Management (RAM), administrators can ensure that their developers using Docker Desktop only access allowed registries. This is done through the Registry Access Management dashboard in Docker Hub or the Docker Admin Console. +With Registry Access Management (RAM), administrators can ensure that their +developers using Docker Desktop only access allowed registries. This is done +through the Registry Access Management dashboard in Docker Hub or the +Docker Admin Console. -Registry Access Management supports both cloud and on-prem registries. This feature operates at the DNS level and therefore is compatible with all registries. You can add any hostname or domain name you’d like to include in the list of allowed registries. However, if the registry redirects to other domains such as `s3.amazon.com`, then you must add those domains to the list. +Registry Access Management supports both cloud and on-prem registries. This +feature operates at the DNS level and therefore is compatible with all +egistries. You can add any hostname or domain name you’d like to include in the +list of allowed registries. However, if the registry redirects to other domains +such as `s3.amazon.com`, then you must add those domains to the list. Example registries administrators can allow include: @@ -29,7 +36,7 @@ Example registries administrators can allow include: ## Prerequisites -You need to [enforce sign-in](../enforce-sign-in/_index.md). For Registry Access +You must [enforce sign-in](../enforce-sign-in/_index.md). For Registry Access Management to take effect, Docker Desktop users must authenticate to your organization. Enforcing sign-in ensures that your Docker Desktop developers always authenticate to your organization, even though they can authenticate @@ -53,21 +60,39 @@ feature always takes effect. ## Verify the restrictions -The new Registry Access Management policy takes effect after the developer successfully authenticates to Docker Desktop using their organization credentials. If a developer attempts to pull an image from a disallowed registry via the Docker CLI, they receive an error message that the organization has disallowed this registry. +The new Registry Access Management policy takes effect after the developer +successfully authenticates to Docker Desktop using their organization +credentials. If a developer attempts to pull an image from a disallowed +registry via the Docker CLI, they receive an error message that the organization +has disallowed this registry. ## Caveats There are certain limitations when using Registry Access Management: -- Windows image pulls and image builds are not restricted by default. For Registry Access Management to take effect on Windows Container mode, you must allow the Windows Docker daemon to use Docker Desktop's internal proxy by selecting the [Use proxy for Windows Docker daemon](/manuals/desktop/settings-and-maintenance/settings.md#proxies) setting. -- Builds such as `docker buildx` using a Kubernetes driver are not restricted -- Builds such as `docker buildx` using a custom docker-container driver are not restricted -- Blocking is DNS-based; you must use a registry's access control mechanisms to distinguish between “push” and “pull” -- WSL 2 requires at least a 5.4 series Linux kernel (this does not apply to earlier Linux kernel series) -- Under the WSL 2 network, traffic from all Linux distributions is restricted (this will be resolved in the updated 5.15 series Linux kernel) -- Images pulled by Docker Desktop when Docker Debug or Kubernetes is enabled, are not restricted by default even if Docker Hub is blocked by RAM. - -Also, Registry Access Management operates on the level of hosts, not IP addresses. Developers can bypass this restriction within their domain resolution, for example by running Docker against a local proxy or modifying their operating system's `sts` file. Blocking these forms of manipulation is outside the remit of Docker Desktop. +- You can add up to 100 registries/domains. +- Windows image pulls and image builds are not restricted by default. For +Registry Access Management to take effect on Windows Container mode, you must +allow the Windows Docker daemon to use Docker Desktop's internal proxy by +selecting the [Use proxy for Windows Docker daemon](/manuals/desktop/settings-and-maintenance/settings.md#proxies) +setting. +- Builds such as `docker buildx` using a Kubernetes driver are not restricted. +- Builds such as `docker buildx` using a custom docker-container driver are not +restricted. +- Blocking is DNS-based. You must use a registry's access control mechanisms to +distinguish between “push” and “pull”. +- WSL 2 requires at least a 5.4 series Linux kernel (this does not apply to +earlier Linux kernel series). +- Under the WSL 2 network, traffic from all Linux distributions is restricted. +This will be resolved in the updated 5.15 series Linux kernel. +- Images pulled by Docker Desktop when Docker Debug or Kubernetes is enabled, +are not restricted by default even if Docker Hub is blocked by RAM. + +Also, Registry Access Management operates on the level of hosts, not IP +addresses. Developers can bypass this restriction within their domain +resolution, for example by running Docker against a local proxy or modifying +their operating system's `sts` file. Blocking these forms of manipulation is +outside the remit of Docker Desktop. ## More resources diff --git a/layouts/shortcodes/admin-registry-access.html b/layouts/shortcodes/admin-registry-access.html index 9c2276b1efa6..7e15ad4d5ad3 100644 --- a/layouts/shortcodes/admin-registry-access.html +++ b/layouts/shortcodes/admin-registry-access.html @@ -13,19 +13,39 @@ > [!NOTE] > - > When enabled, the Docker Hub registry is set by default, however you can also restrict this registry for your developers. + > When enabled, the Docker Hub registry is set by default; however you can + > also restrict this registry for your developers. -4. Select **Add registry** and enter your registry details in the applicable fields, and then select **Create** to add the registry to your list. There is no limit on the number of registries you can add. +4. Select **Add registry** and enter your registry details in the applicable +fields, and then select **Create** to add the registry to your list. You can +add up to 100 registries/domains. 5. Verify that the registry appears in your list and select **Save changes**. -Once you add a registry, it can take up to 24 hours for the changes to be enforced on your developers’ machines. +Once you add a registry, it can take up to 24 hours for the changes to be +enforced on your developers’ machines. -If you want to apply the changes sooner, you must force a Docker signout on your developers’ machine and have the developers re-authenticate for Docker Desktop. See the [Caveats](#caveats) section below to learn more about limitations when using this feature. +If you want to apply the changes sooner, you must force a Docker signout on your +developers’ machine and have the developers re-authenticate for Docker Desktop. +See the [Caveats](#caveats) section below to learn more about limitations. > [!IMPORTANT] > -> Starting with Docker Desktop version 4.36, you can enforce sign-in for multiple organizations. If a developer belongs to multiple organizations with different RAM policies, only the RAM policy for the first organization listed in the `registry.json` file, `.plist` file, or registry key is enforced. +> Starting with Docker Desktop version 4.36, you can enforce sign-in for +multiple organizations. If a developer belongs to multiple organizations with +different RAM policies, only the RAM policy for the first organization listed +in the `registry.json` file, `.plist` file, or registry key is enforced. > [!TIP] > -> Since RAM sets policies about where content can be fetched from, the [ADD](/reference/dockerfile/#add) instruction of the Dockerfile, when the parameter of the ADD instruction is a URL, is also subject to registry restrictions. It's recommended that you add the domains of URL parameters to the list of allowed registry addresses under the Registry Access Management settings of your organization. +> Since RAM sets policies about where content can be fetched from, the +[ADD](/reference/dockerfile/#add) instruction of the Dockerfile when the +parameter of the ADD instruction is a URL is also subject to registry +restrictions. +> +> If you're using ADD to fetch an image or artifact from a trusted registry via +> URL, make sure the registry's domain is included in your organzation's +> allowed registries list. +> +> RAM is not intended to restrict access to general-purpose external URLs, for +> example, package mirrors or storage services. Attempting to add too many domains +> may cause errors or hit system limits. From 0fd4f0becd55bb9eb0dd7750942b6dc25e62b4f9 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Mon, 7 Apr 2025 16:40:18 -0400 Subject: [PATCH 275/699] billing: small change for feedback survey in cancellation flow (#22380) ## Description - subscription downgrade in Admin Console/Billing Console now requires a feedback survey, it is no longer optional ## Related issues or tickets - [ENGDOCS-2540](https://docker.atlassian.net/browse/ENGDOCS-2540?atlOrigin=eyJpIjoiNjhkNGM0YjQ0MjUzNGRlODhiYTllNDJkNDYwYTJlNDIiLCJwIjoiaiJ9) ## Reviews - [ ] Editorial review [ENGDOCS-2540]: https://docker.atlassian.net/browse/ENGDOCS-2540?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- content/manuals/subscription/change.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/manuals/subscription/change.md b/content/manuals/subscription/change.md index b96dc134ba76..b2e6a5d6033e 100644 --- a/content/manuals/subscription/change.md +++ b/content/manuals/subscription/change.md @@ -80,8 +80,7 @@ To downgrade your Docker subscription: 2. Under Settings and administration, select **Billing**. 3. Select the account you want to downgrade in the drop-down at the top-left of the page. 4. Select the action icon and then **Cancel subscription**. -5. Review the cancellation warnings, then select **Confirm cancellation**. -6. Optional. Fill out the feedback survey, or select **Skip**. +5. Fill out the feedback survey to continue with cancellation. {{< /tab >}} {{< tab name="Legacy Docker plan" >}} From 49328efb101cd1923659e339b6af621564b9c131 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Tue, 8 Apr 2025 08:15:59 +0100 Subject: [PATCH 276/699] Merge pull request #22357 from aevesdocker/ENGDOCS-2515a ENGDOCS-2515a --- .../images/build-ui-active-builds.webp | Bin 59478 -> 0 bytes .../desktop/images/build-ui-error.webp | Bin 77604 -> 0 bytes .../desktop/images/build-ui-history.webp | Bin 72828 -> 0 bytes .../images/build-ui-manage-builders.webp | Bin 94052 -> 0 bytes .../images/build-ui-platform-menu.webp | Bin 7272 -> 0 bytes .../desktop/images/build-ui-timing-chart.webp | Bin 40314 -> 0 bytes .../manuals/desktop/images/builds-view.webp | Bin 116750 -> 0 bytes content/manuals/desktop/images/dashboard.png | Bin 0 -> 145010 bytes content/manuals/desktop/images/dashboard.webp | Bin 28318 -> 0 bytes content/manuals/desktop/use-desktop/_index.md | 42 +++++++++---- content/manuals/desktop/use-desktop/builds.md | 39 ++++-------- .../manuals/desktop/use-desktop/container.md | 56 +++++------------- content/manuals/desktop/use-desktop/images.md | 7 ++- content/manuals/desktop/use-desktop/pause.md | 7 +-- .../desktop/use-desktop/resource-saver.md | 11 +--- .../manuals/desktop/use-desktop/volumes.md | 5 +- data/redirects.yml | 2 +- 17 files changed, 67 insertions(+), 102 deletions(-) delete mode 100644 content/manuals/desktop/images/build-ui-active-builds.webp delete mode 100644 content/manuals/desktop/images/build-ui-error.webp delete mode 100644 content/manuals/desktop/images/build-ui-history.webp delete mode 100644 content/manuals/desktop/images/build-ui-manage-builders.webp delete mode 100644 content/manuals/desktop/images/build-ui-platform-menu.webp delete mode 100644 content/manuals/desktop/images/build-ui-timing-chart.webp delete mode 100644 content/manuals/desktop/images/builds-view.webp create mode 100644 content/manuals/desktop/images/dashboard.png delete mode 100644 content/manuals/desktop/images/dashboard.webp diff --git a/content/manuals/desktop/images/build-ui-active-builds.webp b/content/manuals/desktop/images/build-ui-active-builds.webp deleted file mode 100644 index 792f71d92fe2b099b94758149974f9d99e43afb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59478 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 diff --git a/content/manuals/desktop/images/build-ui-error.webp b/content/manuals/desktop/images/build-ui-error.webp deleted file mode 100644 index bdc5ac7c4e3e435842211a9e8a6247261c6875ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77604 zcmeFZRd^grvMnrTW@cuvm>Dg!n89KOTg=SN%oa-)Gc%LL%w#dE`+Dy^Gk0Lm%sJox z@;}^%tgo{wt1BxqBGy__)vY2UDM`Q#3Zfw)s-&*OtqBJL0)q0Zbwh*HK!AwID@o%) zfPjD!u-mS+yrnm{mxiT*j4(a(iN-pU@~iCA+bPtYAN1)CNl=}1G|1CmJr{S&~xDzirRm0DA)_FiW1#AgCYE>aX})4ddFY8 z_(=1<7+zBIGKN3#B)({Jo1CDUHR7?8lv5t9804+uS@3~Z`9b+)_DXy;6geuO5pyV8 z(yQQNd}wl8eBBcSV|2X;Oq2T54wU`!P;9(Krz8^H9sA?MlFLfw>*%H+_PH%lT{Df5 z{b)|-h3Z2}F5vxVHxTgp|2F^62LJ!}10djW%NO|mmkm%Th1PTY@!U4Iwwc1%em0@{WCAvB_}w;r5R|1shtWai=mwWh{ZsM?MjQka&1#z&pWC0 zYft}8*!Sr1SfxysCQHQWl&pX%Oa)lx3|5WEj~&$r6pD%7koIa9B<2?Gh81qzOuRY7 zl1`rcCc}S;U1qRfIfG=K4itnX7BU-@t_QjnLNH!3N1n2rq4uY4kgHv) z@3gnbx6J^lZ{26WYoRC4K%fzj@Tm7R^f7RO`hNP6xXl0vzyR*~9C$VZYJkiSd+$;s zTz3X{TkoB9-ip8>-$Nh}Sh_9s!u&c71axk7=ED1~ci#Z+fxySwUx%>Q!GXYLQadTV|~{+Zj5iwQggMqbyQ zc25GAfKsQqH#Ln0nSeEb2B7)LH#4^bSOYi#cmlpY$4UbE0Pq0jr`!?ZID;`@rf(Kt z2Veqtd=g4Qt^=9?q~4kV%!r*w@1d_-cf@VP-9X{4A#X7N_LIR)_iOhL4>@2iKy{&e zQE1e67Kr~G{Q&-U`zrJXyf#Pza{BfFM*+Eyz}fC=;Ek`DFC(A_SnL}Eya3c})VwMJ zh|jt=0Oy__?_%%vzpNt!3Y_)r^4$TlUNru?d8uCCjcFk8%?DrT3lJFK`>eMxy$;4+ z|05)^;D6YX`MX^gAN#hGb92^{4gRe0RZ%qg=XxnGdO5SAxoBU_{jDjo>QB@(l@`r# z;Cuo!FcUWs+_7){=Wf=`H5ewh zS6CD1V;@kO;~Sqkl1pN8$T>cVlRG-pm3?6tbj^s@mKX`%8z-R3ZiwVcA${(P1oS{O zpw3F{Bc3n2im}5RXF8y4G}747nAn%WxrH<=Mb3R4W)80t5>c^F$dI*gRnik^ zpVLqbVLow~mupnn8aSCipG>D_>vy_R3TWJ1w3xGH4q=b=l$#r*u&%qc!yFFG$J>r; z!M2q)4%n#zk6YU`%hfOP1HHoT5PfD}Lp!#9Y&QpYMk~|I|KVv9Rj9qWAR&(P%Fv;S zne@p>i4BJmEahvl`a^PhT?`Btco$w-dD-Ks7?T~fI1Aq5c3irk*+lsAV=>#e1;GK? z>Uf!GBK=_0-7l<{f&L+o-l%zLYluf_nD{UQU#UsDL+{w;;)f#f)N+bkORaAhqg;bY z?0Fa=aFyfapC9I7@{2g-Z#zK7u~6k6Q_VV0BX*XSvesm)6kNDLxK}*v6-zcv!4|kB zEslCakyNu5b4B0r*ume8TPbVPb6$5LTFi}NOU-|n40=2bQC@4tJCQQ4t)wh|v?a$I zBtJ{!flD6<$l!hBrscMv|ojJ!4Z!8Q$-*p-_7uFfT@=EI3rM+psqFke;uIb%I z&wa28Ixr|bzn>$8H-_Db?e>e z%i*=La;cV&A6Lw)z*oMVA&$VOd`SuPL7n<`ywv>RuTsEp&SDd%xl=W?6~}`o61Ry( z)%q=Kt(f!+9upR#b(7Y%ig(7(S=;ZY-&1piY>;~T9VJe){SLv`-Bn0UY8A;%WDs}M zV)un)(j#f$_^ji&$18^`Q4G$I)t)kC}|*e*T!rs6O97S1_%mBmQ+l2YLb#`HQ7 zN{q-G(GYaoZ%*08;+nO*qbJcaJjmolfrCtC^-#ESak>nr-Wu|{?qnnET?p4Sgh?OV;lq_>mX_>EqyoXxI8ELr<9e(BV09a$}oQF|_=boo4;HOhNJy%x?v_uP`D-%tJpsFP*v_Z`Sz~H{vq}2gR}};j(Sc z-7vx7T)W>P)Q-jH>#m{5b4|3vviD%>`zf=wy&ANSwHlIb4%S`040JOqE^T}Es2uy~ zxQuxeT=%gbiDHUYATD&>DU^|YlmvKZw9I7RrI9)4F^MA`%~q0Jo9bl)Gd zY^y{(>$!AX-)kKbaX0U0+WaVRoMy@==Iia|p~+01l2y!Z7Tdr?q~KzzY}61}5}Yf4 z9wZ=qcbm8{zfr)Y?nH&Vjc)arDQT8XW9{Ygv8hfo>;=y^{MMO@pNLP54e#0sQ1wil zz!Se+kPNIuSwZIV-I_T|9;Gng@MzlkDmy{uZ%^j)Zg_4+(MRdl<(t=QC`_7NLa{3D zFhwXZRDZ?rVpVuEj30>-v=`3opK$!sl705SPtKiOicqbkb`(=x9QQxv*|t3Z(9+GrzoI#V~3F2GUbke9!D#S97SHMq~qEQlYiIdg#rEru$=0ZwSyCAy69Uyz>ll z>bPFH8Dr_4C#v%gh?W}3Q1Zjtg zUNY_S*8Syom;J6(H84D}?wZ{48OninSUL)Q%wYGfGEDz4@qs zO??O|eQU1797?k;=(RokYvn%x%Rk}Fzwa(@7{{C#dd_38thWB>>l=1wsluH0uPeSG z-~ie-j|N**dm%=WT;b)WF@ z3`qM89u|>5qxb#Qi~k<&{{1Ze4jMzY=KkHi|C1^Hv8!XkMDy4a9@h)akMXgCIE-OIx^;giZx1K~`r`Tj9wSBUm|ZD^HU zSHW!7bhjk}PU(pJh6_JP`}86Q~nf})Bqe1kY73NUm3tZ z+eFSRJ)RKhq*hI%$z?;56SRMJaT8KTDf85h2tk!AEk7D>IYT2sl0-3+wIF3wgD81> z-U!bDqz9yMw2DF#c72dpt4lxtwXMAV%s)i-htslH zY(ZAg-&oFHsn6dH{JYiv<0vNrffKiM+DI_t`?KGTU*upqmyaQTLGu4@6HMk)tOT`? z>FJyLqHLKE@864E|Fj%s+#f1SgWRsxbWwb;8dH&TbEI=IdfLU47S7A)X8HfExl)FH z4^3%utSYbR-V1Q^r(Pk+Akk)SLEFWBMNrgq(Bc~>j?TU6Z5N4@*VrP!s+JyyJNyOu#DO^>!{nId&wQ_ipu3nI z^wK4Ds`v)QJcDRTe)?t)m#3+8^5#xp0+GygB7^M=18SlN^1pSLu204v26~nknF7lI{>a+b@ zL&0PLhb!6L;Yld2-JefN+`1`}o~zj8gQ!(#ZoE5u!)?T1&TbS1Zf=8TzBLACX3Xb} zZz{Tftf}HWV{PJHtUm4xr0bh?m+$!-Uj4ay|Bhzu52#_^c=)@NmQD)-K38e-ej7#t z`bH=H41eM9=0pPx_)nVDmd%6#EaRyaO140d!Df+7{$Za6+rR>Yvf_tJd>y?FOk zA$G2=(kIXj!oT~i#5@EsT)5z}Dei>YJ85XJW+Jq zsu3TWjNE}3A`OjFLUg-D1j1yS_@LUl)^K5zNV4x5k2$IW)!}~ab+zHz||pc ztzafzko^~A@*jUuWg%+&6m2*-UeuPqC%!C1Ts;Z)P{1rC?0q2tF)P}@neteZ{wQFy z1?g;~pe3ZaDvcff{l$?|dR3sC{&~V-nJc5GSVMr|k}e8Vh}vCGURl?uLOJ8rP=vJ3 zpUq3PcA0t|ozsejS9nH2o(_6nhOHqgrejl>Zkg@)wYhRKxJvcMKWg`X_9~^d7p2@u zf?4%7(Cr+-@=I-w`Eh2U9 z3#S&4;@HrFq53VO!7{WW=@~*=-ZJqBRS9Z8oSeb1U>;$)4%NZ6y99pJ>g9BqqHoX~ zW_eOn5(-U!*YwNsvrP}IHV#6&bk3so9DFj0LZ8g(Efp0{>?9cll#BJ)O0X~B3_u{S^eqD_pozR?VK-UC_c%8 zv_Cv*47(A}UCk2?)t*th1o(!;Gi}4*B!$AZ75)p&`7P#{Wg#|I_|~n-g;I>+ zp_hWLxfKcoCfFj*IMNx9MIl6Nnej^vt*`}>a_}oD_#;#9(Q@;1@Z~>uz<140%_2(p6j6{D&m^XJwbaEZuKZGvfUoYPx4v3JdaB z>UGEy#Ffo5pLF>1$aI(2McOYLhJ^%0IfC2V7Ir=lihE|xUhVSjEWi*7#?rB-A>KWD{W@Sq8&dfo@;THpxm8pi5;+6zZUha+KGovUYBIkErlmAMgVs$hnsc+x|fdk%Dbl6$E%ZL#P zU_rXUHq;AarC%;zHo0N^X;v3z%;o*0w;}>4$ssBR>ENOF<2rVA78UtFVH&xm2px)% zBG`I*qwyIul?sDx?06}n!R zejNQiuIAOWFQ=YUZ}8$!#hLjid+Zl;{?Al#EGYaX!l_%M{-^Xh4)S$QF2C-Z_vgkd z1P+gB8=9}xwwQz_uh8zj1s7;M5#QYY3l{x~`QPBUpml*;5#%+kS4_hfWB`Feba^Vs z@nY$Q=&!yK(*3{miJUCqrw1yZKGr)wHd2*;D{KEX`TQYz--C>ONiumr?&BmZ-MQz# zBC-Zc{3-(={i7)UcW3{e$-e&Xk}E!yYmo?@m|yGG`B$=tnecQ-pshbk0tu2Sb<^7SHLUsd#*F zB`!biSB;GHr~m1xAz2+<0(Rz{=S~wQ;kUDe_(YT-*w@ zsgBUMz5}&A$H~-MmR`K9Qb+SFtrrxOF!_l2*`B0no?WW!|7bWXd|z2q*hIQGFc9B} z%_hHNV$irBLosRISY^q-$UIW2U!^+UI|If8c0S97X^coaJ$z~)KMt#QVY$d3r=S-Bpeq%Z}DK9`<#tC z!ir=$rgxiTQ~DsZWn4&|M^7Hicn|m>lK3{}Jt}%P?f1F{C|{jQ=NKz7U&n_dS7DmL zaxr9Oq_+{YWd$>_z1F=3`K`?P9}M+N1r_3p7O{F`pQ^>{%H8;vq5^qNi5eyhsK;?N zi}b@odOm(=ZvmByY?p`A{K6#3*o^X>J1T>U74ylEyX1VjRU`VU5TojI?CB$_L`8ny z^f-^!ieFUg`QO9xzuZ(K;&0M!1E>JXDXHCT+2+=dm6Rk-*$&s2BzZKiJOS33=Yw)C z>_?rQ65^l`@c@A}A@V8UF3G;npeC|@i)~zjQ3TCK)yyEWz5SK<(}{tI#%bQW?95&n zq^4bdA=;ZmP!ezb6A70=AwgA`^SHzFcY{$QxAxU2DwtM(sRo00WNsD3_C}(!I1>fW zdpg^abmBFm;C;cMe^pxlv^c%L72gg-B@e;QS>_yk`jtR`%B3R=!+95=gD6s9Ixxj% z$DkVwp)_$`zCr(h}K5GxxM^-q?4CcUG6HxwZ@r= zjd^>Tz7>)sv(jwLm7vT>3QKhDbvbz#M>_qiD&{WBL)t>(K?XEb3)?Qa{=veaeYJ)4 z>c8c>zkuCEH6@&~Np_j&w+MDvYH{)wBIq&Mk?n9+^KbO=7=r#Rww=Fa(*Lq#f2i>@ zYkazO_rvEU;yj+Jt@RBVPb`PPDHGk4%ge*E2#3DX%`8FI?ZwYnq{RDL`s_qM%in2( zp#nr>8#={l0u^}%{Zv(Ka8O3VGdW;&l>PM3StO#}*TS5(_d&lUBeAz+3UgVz*WagG z*r^dTYbM}eLtTG!F~0JU8}i*K5<5z6CNv6#bosx9@V_SEKMA1RU(XYfj`|W|ZUHbr z6mq$umd|}tWvi)uJ@h}*p{Xhfp>JkXdPU|TLvYPrYjgt?7YUt+E2Wx9_T`Sg^{gl| z{8QcaPrH}U%qQ|a9w#asy^JC&=ZJP2!Sh=r+|J*;LJ?ZQQ}0R)|E@m!=TIbw5ib-c zAJ}Tqji?aAGez|BF*Y-k?)N7>|C4&yAJh6{9-i4$XjJUE<~b;q%@1F>&ukrjX>GZp zv|p45_P^kc{2R`1!1;;7&glsU%c5_*v5-q^p)DwdQ}?36*h#rA0Z*Jz+(I;mAXmb} ziQ=xq0e!vxC2M**Mi~~MJ^z@SC8OM}P_NJ8q|=Wz-_lcRHSmQJ_cWWtiVX*(UY~9< zR^hX5cDcHEHnZfexl=fLiwd3d)Hc)+k6?aLM~X_&3{vkWogB9k#7cuzXb6ZwBZmJ; zz4mW#xdR#WaSj2xHaBuMHlB6hsn$LG#HguXeE0t2JLS~!nc_sknuode+Kd+@rAwZU zLYl4wsjt=H6ZPGTc#ApdL4u^5S0JMi>MX&g$0L%BtMW&v?@U5JgH_bE5En3Vqq>oO zRG%UKYo+p+&{Jh0+`8LFMM7kho9W!1CXZH|c}X22hW+-G5^PI$<*BPspBQ&-;RGW6>|bp}EylU9jnF`&PQ*#S<71T&&j0ny4AN&A$iqIe zD2B0GbY-5cMVtI#FtGtAAM)zYJ?u&4*Mmwnq=SN&d}*p>gK-2+j~x+wp*tgypo1(D zJ7-Lp?$rLEzymx7z!|ehrpYx{D&93J4rOU}+%2y@44fMs4*f{Ab{S0UW>CKkXtdSk zZXsdWF0a|1?`L$OPE3?H8FL(A3Ei&)vdEiZMq4cXmqiVx$eDL*V5v0+;}14Y&GAbc zrlUjJS=#~Od2NuKj-zVL#ga%01<$wC-&nAM$B^#WbW?7?7xZOzhtL`C!hx$gAb7;t`g6g zTaS4bJW`N^to0xd|B6Ra-;E0OT1|6Q#t=Xx`PZv_gQ(i!S+lPf ztiFcGuH_NhZn2YKVp1~r|E`Ain}DBy{(4T+jV-IW=NK8KtJvC;IA7sMx}pg&KFIBI zE76kBo@~$Qb-($E%GZW(($-)g$|Aex+6KCLSn_&jBfoJm0GhH%k@T~}ZrvN+R*UpE zUq^Px2WSl!Pjw1L)Keo8DLNG@XcOwEQXks26iRihv8tmsCb{XGb`)PF(Cy_EXKouE zE4o+bthPhLq`M{uhFL_2~=0+W|EgN#=goocv|pm(oe?|8&)VVkN(I%WQu` zyz6p|&GrkV&w+?geXPHL<@Xmk{sbQXbt=C~!1-y1D&M7MaAT{+Su#GI!Bh;L>sCGp z)ojJ{g#;s=JRcfS?;Ax@e1~~}1&zG?@SV5?_0tTP3PSq*1O=ixhdzUL0_?q3i!}C~ zM^V#@*Z}wIEO9oN7#hk9JRx?6!*@upkVyi4S_{Io&Ki|VBqZ$5@O4C<6lj*AdCXsK z81Rga;p+#bF3bl2zK^w$M-MZV%^G3_$4D3=!@WALic><{J6}G&HqSYO7w41h|F;&q zuZ6AA)+}*61{9_>nE>YHydM}5-ogzag0@*jd9{B6%P^Y53bO`EF}3+Fi*-}Dn)C3z zN_?mOCVtG_3$c3b&_UY~KQM2}k+o3R3R74EZ^UC|^n<}j;|AJD3#%7dL;vK8cJXvd zO3lyHz6y7}70+JXkX!Y=u=XaJT~?k&w&A)b>QL#YnKKv{WY^Awx-jFDhJR+FEzKdZ{s+M41Lk$YSAxt?~Nk7qC%BczNL zu_-rWvy|*OO>jp(_tZRQZ2nX@77_~2a`fHxI~`3U2ss#QD&UL7XOdQ-61yX^*=YCw zNc|yT&b5CV68ViEYAjGpP(md~#2=k;KjWfZm}^z`m@r0UTS#LD^utcXg4y5zQvF;R zW-K%MD$YwEZT}oer=)8Bdj0?_RQx#;`!wETtBq*v$;j1k%iN~LCAa=^je6rG7Kb)q z&5mSb!a){HCC|xQSo`Ii+!%lQ4%%rUdUp`=TIu~ypwqgg>KsI_6OBGvW~8WnCe&Gl z`Vyf`2P(w>rLR2QyON~Gd!`S_H5P}(kX)Bc%O&$NbMlGVHb30j_Q8aT8w!8VO0)%q z>FEm;Jgydw#gp5H#9t)H3@`FVQ4H2~oHp*f(Q zX=`uOBDIWv?Tmm7ZTR+%-N_g{KcXv>mw$0gxBlyer+;}wJ%!R{?c=pkXOMpi3BMug zF(L(L7K9);A8#*854x8|v$d)$j4ky<0s;bP)-4MWs!d+u?cmc-VzT#R^iao0$puxT zOf8nNoM3zcUFhiCC*_;^S)KW8HlH5=Nbsyt|H+$d8~KQ2AY^G*$1vQv>v_m>J|!-x z6(;l{?K|oG))GJZYkLnxBUWRr%hjovu5dI)L2#TcB?!Wm^p{Z((kzgkq95`I!*}oA z>VXW=8yk!}$OPZ#bQw>Idia)x+sX*3$>sGNAP9OMgiFmH6h!2f89c#@o>s`4Y0KF?Hi!w<%r$kiktU?%LYIW(2)$@m9~C zaHq%kNmgiz&R?w~p2*J|(r2B|T!X4etHtK5|27FE~ig)l#F$K=S_!WcCA60Jk3u1q1=Oo+VsEg%C+HSi&VZ{9dG7!>(3v5 zPDYOre0+9XX5NUlsjSA_Im_!*(o8*9<}VB{(3f{yTVM$;rO6m#Z=Rvn-T*Pjdm{gg z8KnVlrr|T~hoNcna{~0MxTSj7PZF@GpD$lES>;GH=ub4D?wvPa6((x}_@3F=TZL;s zM!eQhR;68c3B#v7Y|)22_w`pd6Z)0x^bkgyG5~yMJYV0vh_z0LlsZk{!dJ_ic3Q~j z%)?CY;C4?mW7o0^ra24Nk6ai`4iTT->K zZ9Zs{`%wTfDjq*}T<3HUY@nr3;<~VWP-f?(9Dyx7wo5RQYykT4SuKO0WSV+`5?gzU zB!yB7L2(FH!3-mrAG4V#-?PD#C7{kig3Tz1z#~qz z__*N4-xg`!Re(6nL85_J!~8j6f64?ag{Bdj>~K_CAAOVFlX2Uu(3uJ67*>I8h_Q=T z+YjfS&R^B!gK0d`J#pORh~_NIz7^tzVE*1GuT`&de!z?#@l*(gh*19D9O@25#gtd!#-85Ag8j8MN5B*}VX*7Pv$ z5HD$xe47&i6F1r5?&|)u9sKT^7I{!|!SqwKvwyV;I;Us>tx{wLID2yh_E$D(O{1IB%kE-ZA<);(Ii6~-I_iru?HTtpw* zgnvN%sCuO5INJu@Z{DT)tzK56w#DVw4;z*;=f7m-ug*h$Z;gogk&2Y8G1yg&9MuQi zSBo>HV5DfqoK6%|pCyA(B6UCg45gBDvTov>2+w7K4}_yw(NHhsT9^{9 zMNxn%eMcyRLZ%GP{RJnFe6R`V_sTd6>IA${CjQoy+hWd$ru_`X*&FLS`2`f5b!wan zG+z7g?a$x}yimI<6Z2B{>@76`Ky}VzevXbeYRohfNTwHcT ze2JMh3tn^aQKm-0ZpgkJ1m$eb9#EWy0;Q=ZhQK0BgcBPs4h1Y{c->oTrwrp?W8X}M zGDIB&Jtq>IbVAz)MYFUZnMO8uUB?JD-Y(^Hs%}u3yD*Qi6S(zWG#0D%GNq^I1L=&R z@I8m6_gaLpZTHcRH=>P{(B+|#LT(H|_pm~l%n)j;usWoV*SsjLptx+$ znpk{)Mx^qd`d;?61Cd&vKw=nUjV%#@Y<-JksPSltLs^CbR^(_y`#6xC3ew=|W@9Bq zuqKK(`YA)6jnJFOM&=xEUnCbC#kae^l%UIcNYy0+Ky=3cv$= zhk+F6h$8r*!EuS+({z`@_7?nf^FHrmpNp}4cf=r(M~GTU+I?f{ z%Pvp#XJ8se#};olfv(Xo{_XILC+S!Zw2mtG@aC`1ZVLb z{YT2JO7`;O*FHpoJnM#ovcTeZ$6^BA04Gfy!s%R>Cd*(uEPAO)sxM)zby-*#2HvR@ zG0TR%#-f})2Oq0YyFoH+V?8~O1_$i+-%rbP3+8#Eo=Y3yJJankg@w;=XAr3RU({z4 zce!I1_a-D13c@-(Fmb2xcfrjEY-OSJEV3&vHv_ojZ)R5tp`Bxe6xCm2KO;Pi-dSdr zkcL{)eaXl$V(XQDPceho0zW`cwxig5P0GjexNdywWhYM&VGh^wMz4d9bMvZBqqkK?_vZDp8cuqrcfOgmdlbclj9p*0oyv*V zG|?5`%{+M6*c0M{9H3#aCQbnwZHfoRLyM3^!iN<1CkFe{T^rjn1L~&& z``H0iZ8mG|d39aiedJ(9I}*q5H;MpE&;<+uDE;MIl<_(wdcSSL^m#q#o7Xc2LPsnp z&*3Fbn4Rwnyn4!OllOg8^ew21h(8aCh$q2w;EROA&<`$xbU=dX8&qDElgX!bF_l(r zlQ+j4CVMN5InPMi>XSJf1M8`{{AlEL(Tka0P54{5T7;|mD`gMc%*~0DuZ>Km$_5{H5O@aJS!-W zLBu#Ruh$cY!ALQ?2YBpGypAWay1CvtsfwGl1L#kEYepC&i<#eddDQD%EF}KC@sn)D4|@oIz5j!bgb@+%`%2I=0Z3r|)Jk#d zjmrV@NQc;a(%7E$K@LZ_%R!7z7g@wIHDOw}_)o{>IGlK0BZN8vB;xUqsvz`{_#Ba4 z!Zu6qTn)T$Tm%Byh$^(M+nO;WR3a<{F)}vGH2!P)+MXYnjJ9qfF;^r^cbmSJv3NJl zA(qTX@d$XN7Kz-D@LZZ-4+~1ta*CE-D#AS%UMwFo5AkzT7p<`EMK^mrcDLd^(e~cLnC_S8N^>@ z;%xTvUJ0weStb8S|5guySA*lpaxH~`=s5>4(=6sU*o(} z@flUiru2y1*{02X!4F=_Ir<$dC&Z;$AfKd>4xn{7E;Cdq7;)b<1b|>8kbT07_aur)QA-TSP3w9|1IL*2Z(zU7bb5B9}bmIMpYhX9_aSyLo1`bc_m*&q(bifcVQ9%{b`Z>A zB3vEeHyg5I^TZH8(U7ZT`&PGm*z*#d6Hv5mz(M z7TRn0G1lUch0q(@Aop6Zb>pZf>|x`$nu8JqJ}yicmk?=RzKq5(5{NDyu1d)~VkM1YE7!qf!df6`zGX@VQeK?u?yt3+zY)J*T~uRU#43 zP~R|xjwg?R(>hj5^vQ~999OAUrC~#iSJ2fVFcD7jjWGfi&YG37v(X4X{qPXqU}!{d z=@1q(TJF+^Ri1L!Yb>-fkBty}aB!*Y_{ z(pW4?R(}@^t+CtVZj!FhB&MslT4GHquETkfHnlA^2uZRBNrv@KnARP}|x% z%VKS`^PweD&&QNB5}yVMV@Y$;K1RQ*!lm7w5m--Gs|X2A%+|a#wZvCk^{n7-lQP4o z9Hhr{R%`bOfVh&Em6~x+Q6Qc5dO7$B^Tb|R-3(P#1|`;s!QjAvP9tW#hT*3Fnb5$< ze(t%V4R!8`k?oVzH`SBn` zYX?^Guo!xbn-lA2$Zu?-!9n+H>#&BD&`)#2*>{4wZ1Mv9EOL`oDKTRukJKbMmh+<3 z7^;Ug1lGa&IwQCwu%M0V;c3ie{D5c*z?f~KjK(~hSBu1VPl%5 z3?#v} zPYmHqxv`IhiccfsDTc)w)^yDUIV(cFke!~9-vz^imuSnC>w;0luts4&5S#iDwjMpqKNf{qSf(IRVf^cr`MUrB& z%$8I`pd#313{Ib)Vi#KpoXPu*EOG?6#sS7}H6XJqq1-&*yo7zkO#6=TAs8|WPAEqT zIW{H0Y`8#sINQHL6>Y~&YVb%>Qo+A|IKU*0n%j}}5K3iSeY|x5`cr?57_*e15`xJO zk$k7CZw{P?A5;%)g^)r(yrNn0KZi^O;)EygAMTWsO7b|VkHRCLH6#)+d{EeSU4)vu zSBy$frkcxDT?@(JJw2gI=p1F0-{l&Do8`=Ob@DkOO7iWV88eB^D;4voPDbS{TXZ26 zjd{D8DI}O!?zLfFeCxg|yMEhQmuAyjX!q8<9^mUv6Zw*VvAyXR>^@goSfSmstR)VL z#b@GmGu0~LY~8;5v2kkKr7&XbQ4D~FM!p>;4yHXbIU2KQ9;$Q@$7JX~dX1;v-j%5= zcAe6FhnI}BML7!;H7al6b5pQ>&63E((LNrnb{TZAjy*ZKxv8V)Gb{n~e5T^HvvO=@ z1{tpJyv(#;g1Sk>Q*oMTu!mZYspu#JlzMyuyNe1VP^b>kb5J8A6rvfy2a2q$%aHN;IUI;*SVowz?hL$lb;=tB?4C{iU~xRv!%`(77hVn&}a^T+QFf zK+gtNhZ_o}jJVD$7DrkoODsxZK;avjPpHf<#`*d&##f6=UZ@0>AFI`jtXLc)5ey13 zytz{t{047#WQ$gJU~Z(gf1-I3B1Iy*x1a_P=)$#H-0f=%y+`4+?M&sT&p|^Md57Qd zw5095Rr;kXlX?xJqteG1_R}2>D3=n0*fy4*98%I4%5POYGd&eoVZ6Od4IyK5J}oq0 z*wVhUJsV-bY`zPwv)rcVvfODiZ9~;L+jaWE$_iA)xjC-;ogC=5B~xrR%R9{x&7fMc z3xqV$U4f6o6b!nmPJ3>g>xm3fD2RmlJ?VLdeNeoMuf%!>(NOl*q*LEU$*<6MwnL>C zNP#Gj<#Yt$l_MaB&Paylo#TdN$!LAmoP*D87O3()qnDH7U0YJdG@E>rIgf_~y}X5* zTQlu3F$?r(Xz8)o>(Dz+E)`5nDzyE%-uD6p^W-u;yAFQ{{};JEZSL6 zj%y=@fO1%)5-r)Y%9~w3n<+!hGa*3(9wd zJ#xkuD?u+i)*YvDwvR8^d4oEIVx=^iiVQwD7wR{hKKY3!3lJgk_&=xKRJ}R#FQ^)|uveGLQThu0i?4ra(g)b>om?9EE=7+BZ z0JrUBvOX&xBKU5@H?#Z|AzmQjep+f&Df0=jduIzW2(~;V$WI=PxMfi0T;`qppZ7tP19yY0fS^EZRo& zO5loK5<8HlZ5-D+JrA>g1AYOJ*T-Nm%;VgIQ8-UgRdhYFn&%-T2UDdjicr~wrr$M~ zWJsd5SPaN+SuCLO8+D$_qmiKy)OEcLOLKzodb1iS2)@3+1I6NO8(1B6q>3 zj%3^aXf_1(D^eqj8tsNMeQX(b!7>p$w^f3k81mZ4S-;|_P!oSXZ@zQxya*Vn|6qYv zh0Q=+qDipzp`UA>^UeySyIBp&l+9{GWXe-9tt4~3E}llfHRT6$vyBs{)4dhXzSW!0 zg0QN7JX*vYQr02QKtEP9x+>n(@$1VQ(=-V3d9DDx|LN{m+;MXzSPw>1mf)bWag^uy zS{zchc`s~UMw5ojv3H|yQ@uitEonpi@-NHZDdc)2ycNZ+Em%-iI_mgC(s*pFGwZ9k z)iq1(f7Yhr)E`0O+I8bLO?4Z!r3=zf2MWSg-0*YWZGuJgC)$&?=X|-=rqIDbrU)H! z@K$A=Oz*BO{H2zUxh2uMm+qR~@EUi}O?d=#g2mI^d zr%xxqJ2fIiujOC=v2`Zs`_?zMqL~$~wp20*@YavQl_j~-28AUawesTQt_b6+Q4wk-L(i|!OuVtUI(9j{J0bly1X46n zn!!menv*Dv`{eDj*L~CPMns(@1Ah=_euB7-3NHJZeC1QAt?e|lc+DI>s6d-^D-B}Z z$(V}9!!gc)0%Tf+n1;saZlk37scW*CfPThtZ79L0^gyW(;@d5L7%Vv}r z=H+*PZ7|QM(YhyZ7DNQ4_Yd?viZdyqOGjqjm*tdywn}^~baxXyDO8nAC(0tN$#`Y$ zj9C+1pN_LS9Z02Vq*{(feDS#Qg!K}anJney#aDw-c_Tgr3fpP3zjVif;;M-^Z2GmI z4VF}CBv6CR?3$|&X=orou2+KOl7)2Od>cYB#k*BTin(Hp?J#Oy<~s_z1d{Gqd5lOB ze_(zVLui38w7B3KnzSpDCl@dRa}uAcmNG`9Xkk#>KK|*puWX4@$e(JRr0YDi>g>-I zj>ms)-M1Gn8JVH{er9Xeu0Uf`Nhp99U|!00Yh?eM-vbWg$LqJV0OjDXCZ5&|3+-}b z{;-3YvwWRQ47zh~Ek5T{i!a3^fY8-QChkf|b?aa_t)@D@ zY+MR83KhFeNaZk4^($8Q2v(Rn#>!N&>CO=Q*ZRIz9zGvSA~h#z@~_qi3F<=?dXU4^ zKD54Kz7UgWlC@sU7w$|RtnqF##gKAL+I6@}3rlmPzQSl|$D@~22=?$HO3S2Ho z{2AVtvO?{LAB-W!vNzxi5KbZsZcfiW&>dKjEW8=xZ2=S7rk#;q@UGTV;}4ak>Z>+Z zo~Om4=!d>_S>Obm$=FMD0<0?%$7pNi#Q0lfvC^ztDLhx%rDu)c#hgKsoyjT^c zn@Lhq!*gCtBEJLT{h~EG;<$*^QY!6e~+|m*miTd&{B9Gf7KA^ zgTCl=szhk#o7Rk6O9V&+lWt2Nyr)PDOp@<^cogO4<_8$%yC|YbVfC2z6^MSr ziN}N_IHMl1^{@DF%Bfmcx`(NZ0_C`eZFoxJKzAIDzV76{u~N#A4mMZ_`ImlUH}rex zo~%s=h|sJ(!JO(kpI=nj^u=`HPICzhC5o5lGPm;u$=HcyHy5$1grtv%gR2yx?KO9i zDz-JE@ZHJnzQ@POF7168I6hkR_q)pVJMJOwI{;R6(F9Px8VB$up9VODHf-V&ec*&N zRb2BLyw9e)itr})@BPP`W*WnkN*Qhj_rPd}_VAg&#;-JyPir$b-g~lqcBE7>XVIN! zfJi6fs{-3h02$eu-}GI0JjbYLQ;p)xd)HuDs~(|RND;fLJ(e_q;tU08nF~sPKA6Zp z2}Fh{{TC&09i$N=D)q+SM2XP}NfNZOOy(lk$VfgPKaO4So&_p1j4PBH#!ftdef z6oB!ZR+QbDBW)-@FviaRT zlN)co4hc2zVbt1u1yF6U#EG8suq_(^fUfIMFmQ;WM@Tn7i2n(R5#V^Sw6zYr*y_c! zNY)IwA>dpbt-+NqI9XCyUD!KYh0<&61LzV4(YNF{d^VwuOycqTN-MG}Yp%MUs#^I+ z@IF?{#!qGez$M-^Lmk-o-H!>6I`6Cg?Vn)ELXxRD(>?%`OwFkd0O)MocdBPy&r6$^~8Pn+@#Fd@gFMc_<|&%##OjZ9AF5W;lton5DX zGbNHrjX@H6`q8Hs<(dEhWsU+iS|=Ne^Ev8CT@lEGVgv%gytIgUBumsW@=4TXKO#`J zJ00cn7!Fj<5H<ju+oVJkq>s4sq^Tw5B{N5Lf zojr9U`bK-%^^+B5IGu5@duHVQc8l|{K&)-_T{W%FQqtsKtQ@y9HmG6yQGA)ZC7SEl z);$dMSVds=SvMC0RLt_^P`&hNnX5jukTg622ezaCb6s>dwAHYXj7`gVwX-B65n!JY zEyp223tbZCd6$n7B0Uz;E^k2uH}Qu$D@9!2a>WDAH=Zp~*uRDf0v5MqVesdlZ zXZ$+@w;G)8qB>NGfntK<$&w}YA&qM-vxqy+xI9#s0Vx)JRVfU0KW3<^TZ$f9&Cdh% zLVkkn+6EtvnP$%?Fr{E($#qJ!QZFNHPk`iqgd3|LhPZlKkq!UbL#e8eW(nuBdcqhm zd*D!rVWrD#X(G`mrn$%(#Bf&^5ZyzQ*1y}iD=1ys^x6DsS8rcO6Wlt@dld&l#@uR9 zT_83q($0{(HP16;*;~9X!UR#|P$;3=bg1T$#kOat!U-6_(AWF7H52R{5UcE*UMYT5 zV5GbS8I)5JiNG#sW`bi_#=2I!aTQKHPv!U zn4V)Ru#7C8*70nv@wtQWI9j#Qd+@mry0scOvNcCz;qSpSOf#H3n4c7IJDbc?X&M&Bh!4<(=Qhq4|dj-=0WXTCs| zGy=-a8f0pe)}9RlXjNDa?zU;#`g6QG!l(J}KHCKd4K|p4O0n~l=Vq@f^xobwggNWT9cEF*pRmi`cc?0IQRLu8;E&s|G-PE(YFm^ALN0uUmz6+?GrQMzLB%T!lwp!!!PJ0N-P=7Zt(D65!wf(Z)6MPP^f<1kSr|~W#mjL z)CiDJ!{TwJQXfsnHpY_iaDjV5=uskfcBTFtN_sifF2@@o>HmpO?n@#xw}Ktf-0KR} zrH13!^4|K>QYT#s`v116W7M8HV}R4obW`#oR|Eyd{`+|RNtstT#NbxE5r0)pB&DNq zaDWKpzm;KV%CaG7MOE~OXFl;ZB}ndV1s*d+3A#e5cV6K3Q^8rz%p>}AIeDJEe^Ho) z=?PN^S{Iq-2EP;NXwQ~KlQuq&ti%R0_Ap{^Z5n3@2X8CcsUxGl;4`z}>c^+c#Ixo- z7?-%>CjE17tT#4_3 zN7?~$;=$Kj2*wF7c18_-6a>#9ZF@=N|XA_o^WbapD%v`&Mcy+gRGh* zh`P~(ogtvjNyqZ>&orqJA#W+JvK}YFP#;&no8NR?F`#bJa?z_VDo0vyJ)ZsC;c4ef z@iY;$Y{~!MM{v)UM=1T&yem(~r~uwzkoN;K6L zPQ2)gEb6WaC~980ye4u(VsQoHjvvr&JC`nFOa{*7k_Dq%?znSBaVxnx#Y{G3(`*zG z^JTC~s^G`Up#C?3767ekB<;48&N__cWu@$ydbrdj%{v*}nE8lA+@FFr8?h9Clm->V z#ar%70624@&Bm?^t3BH$YAr_>riH|cY)>u4N*?nC6by@g$kKdqPhp9@eZn^2#@Qjjm!BIQZuQC|m ziQVAM6ry-vuxxx5@ZfOofs=M~OIfx^ytFJz4gNWVu8glskqojisRPDvGP?pJ&W;Ln zuz()XSlxaWMr(io0S&IdDvHI9k&M&^OTU2yS-qd8LaI6?{xvB@b<2V*1^>#FO(xC7 zH7($pLVp5uy+K$Gf_KkC)?@LX8p_4T4MHVqtZbm%`mns{tQftW=z*ZKeL2Vq#2lMt zSNF6f3lW~7gmzs(NJU8(D0Ap_wzLu+fknJVm{{}x>2-3iq@*tc++VR-yBp@)?4(7J zb&g-sc>%0@kAnLgsh^5>=}pa`9#kdPj@YAUIiN4}A!e=1AMDMBkdfjO0YL{2gJ{t2 zaWaI=^^kRcm2l5jP&|z?zdbnhz>>UBdPt|!VdK3pFwpn=c*hrX<6r6(m$w~baV)D* zJyeh$g@Kep$}I+lhMI#xJ2@L9m9wgQpl5^2aJ^@7i9B=4u87^%h95q+^juSV+$0I4 z84s-5fML0V*(%r(o+u-aC3RJ;<9TR_id!PxU#BT{eee<-n?1vaHCx!lXdwPUZ z#vMdrN9m>fPaJ_fduT|*1?DiR**IUz9WHmH3`}En0c#BBr`> zFI-41&IRs1prWFOdzoOI2t*}YJG8>q)^%?yr}uVI|7r?;UbxI2?=;i!U=mJtl+xyF zZ@z~t#MZo8KL&MIioCph1kv^{NBXVSNn(xHUBF#!^A>5>)CqJ4&{ zG-nenb&%60!^_Skzj!1Me>-H=av;d> zi8m)se$J9l#o+a36QX`>rvG2Bb5 zANT*(9VT^iSdPj(8X# zpw!N#ztU1P+`TQhQ|FA)!OGLn4HNtQqykh7Wxbo@v<_t;X{mxRq)X4`(Ck~HGV{F* z_5N<8k%gFymeaS|;GQrr)kRFCg3j2X_J0{R zGrLZ%+xGj_qJ3`6uds<%b_o_DFPbJn924{Jc>gm%)A3jh`OQtsGxa;M09pg`F!{RL zEp@ei%2!@=3YqJE8~`ALTv1!briD#HDP#w)U%u9ruxqEgwM|&ly?p!dQ*VLKi>+l3 zWly1R>+Pii^^y=m`rRY?m&ZltM7@w^vgUUw&W#)Hgt` zr@v`DpF3kkLerKNEt*7;XK(!O>5YKdalLw0+axozWw@+JE zl*2#Vr&^wH)dpw9mu05|Ums-?2ShlA+LOoud2%zD!j4jDa_k~&%J$XaJP*Of z4`Orl&uqz2yem*w^Mx7h9NoWXm5um)%pvGqOWdb_hoZ`g7`>nk z3!=T~wpyIx1=f}}Oo-j7{q~lA*|*e-x{}Cfy@e&~U3J3rX@i ziJwt0wrFCuRTxT!adHr~hMuW~P;RKD$IF=pbP@6lekD;^why2|4bgWo`#6lydv8>{ zfpT6N#x01Ddf*Bm(h*!yMD)?&O)3~o0s<#~CQKY2i8`2{b;zP-yPk$-4U(gnpyLI> zw@RduCX(zM)+mH&O1O1iY;yo3WG)6_4H_heIMOp<50Jda&^~Vn>)Ss%D5?@cbWR5LK)O>FwLvbMFd7F#|56&mwwG7fYOD5ugc*fA#(QzCTV z|M*R#8DlIqxa)HdUyyZQ!YZCF~$p(^!-HOZxYU^eTbq6_h`g3^9X{SC|ct+q}=X&D8{KBOSq)QEVgd}YZg+* zC%heE@i{h=Gy8IKvq!bbxoWmSL2DzY=)Mw+(@(hqgDGPQSos>atfklsbX(t|Kmn4g zQ!b_@$!2f2MN}!Rw4iiOA3Lp_qCsT-azZAHB?rV#V_V#^(byhi*3yf63Jd=RGH#yM zfpX9J^#^mucZyv2g7v0NNeZSet^j5b#KlC%j{rxH9Qfb{>6B;NSMD6P_(Y1EmPN zNe0Ss$4)V7rp^}u55#T9jG}fYC@2mZ|A^0$Mf0pfL#a36X)LHXFqR)^@@YPDSl0aKerI_V>MV#Oq#$|^ z?yIPoeU#Adq~7N37^I_x4_lnf6@sHcKE@@WqQ7d}Blps8OK4^2m;92c51&_Ud{*AU zLO8q}2kUM9Vhv1ELHaUS?`4>dtz zGPfjGb0jp=uh`Pylh9f6o_@ie*<+d6+H!|*HgH@KU8!$on>!~S+7BQxv|D5a0NGd8 zCE^_kSjW=M^_D?W#L~xyf&ZWEX5e)ObFec!HH*q!f6me;GK@|={+_dkP4-VfEpC-x zhE#euw?fM;pGC`m%IlfGGn2#ZaiZX4lcFp4Zg-zzG+Q6KpO-R&iE)-T#v`S6{Yi5( zc%(n&3Qf8aAI8U^GO(~#7OWP*pVZu4{72EnmCmUlFTRwC%cV8p;y_2Gy>~(Msi0oI z3A@=IGQWBOe!9m_+5@Ni!v*a2iz%)+(M~aHQD*Nw!~R(m(by0FX)3SWcITE*L zm2RJy)bJmXS?SQfiCmnUH_{cq( zp|V#Fl41>^nYapGR3hqLeRA6VQzPcze`Xj3kC@Qc{26~o@{n!kiV$GUhdM11xG0Da z+`f+zzfmwJZ?k0_+YphJi^-v=GI;I%dTNwHlxdK#iM)D7)9B!r{@{153m|>~rc)Oo$6D-~kV)>j9V%R8$g`BhO zYYaHUpHP|x1~|Y%UR4pdZR$1U@VBs=y* zWp!vz7b-?t=ni~pm))6A=-v9y41-gL;8!HiU&)*I)Asv!#la``2Mo=dZFG;?;;W zff-P8eKv`8h5SI%{0$p_&#)hNXdXEm%h2&syrGz>)K*1XAq?0`;6J+LL%K6qqA8=d z%`(_QetAOelYQh2M`%*$1#Zz?E5hpMXfKQ=9?dE0+%rv^SG`=iCGei#6Yz)46Vi)U z;;QKv0EXD$o1_E$~)pVru7C{YRgzyvD z{Lee=o?Hhdb>`P_Xbbyi0h-Q(W0;`6v`9=j6ZCBFc{wcU8(sP7)XeT&+&$DCHZu;- zLL_sRaio2jB2CaKI|cq30QWgwW1)a0c;1Hz^ps?MV5Q8%V(mE{(StfOI&BQ-uG*`c z&L-YQYu5Nrr>LCZtrKs1OPRe{tDP`=!Ae@tK%PTH$D>$m8TT86ip*GK#tKm+%!SJyc?UJ6Y2#i5u1Y`wkIBT{mk63h6o%`CXxq_@JI~w z%TRh?W>RUM)kj%d(4F%S7CfHWxzTr>vGKi6ZV+2+obTM795-`k&nXmlWvMn&w5jV# z8ctC;B<~z?ez>c*qvGuG_BN)&=f26DVCE|l>t8O5ZJ38yfQ}12R5CCQXd5??+a!M7 zUaaYQcttQq^H^AWo2HQ-p2G$oUF0pGext4XJ;W%0vQ+CcAO7|h71L*D1gvc}H%iyD zA}bx;roJz}<|M@uw8%V7j+Fbq@~mqG0m*-aGi(5Aj#UC}o(X$9RZ}ESxv|Pil|Vk5cqh|M?$fFi^Bv!70V1h_7|d8A{C8$H8>S`>pR?G*mIn)%#9Du5 z`pe7|F$Z`WHUUD4s9YH{(cKlg+71MEqYtyuomTH@PN(_&6jR6D+V_cgv__ie8hPOP zo|SUkr`ZjJBy)9KvbXba-?O^(T4 zG3rS$e9a{-ngYfpJx)|~st=h#pt|y^pSR%uS)tz1DH~zp&V+=24e*h>QQx8D zc~{!wzR<^?kjHKF6RVoS>qS1nLT6inoh=V|4}AX4JKoFG$6^f(x0^n07(%$T|afa2Nwq>$YR zGZ&CHgN>y_TS7J-V}=(e@!GWJ+%1*DuC`x=R81gkTzz=&k0 zn=G~&l^zPjn2??A>&Qp_nL6nu*FFjIZ5IG?##nc3*RECfK0!u;66hYz)yf|b`cY&P z)#B=j%mqeMUui;fQyuT48hADJREi=C1?-7M`Frh+^#OEoL5iCwR=Y;r$Ygd(4htGr z6U06fscG(Pu&49&xJvg%Q?B3}e;{HyK^FA!pkxlQ?TT*<=AaQEMyO@s*3;n&=Y*@n zf&tEwm-_>tN_hq1CF$AAg+s&vWpc-qYhwZX6~vNV#e))~>>HNL7zf%1B5*>pT6)4q zE5KFD`$=yGi$_MOq3mlFDM}(0+XfLT+`7@VBZPYZmxZSAfAO7IR&w=gHkEe^3g#0f z$B#=pCg37avsdJM3V|%ep;)2w&Oj&XZtUbM6tcW>?{mO{pi<9axC@Zo^)nTzi$cex zgL-p<%C-`}o7j4OzzQFm(}X}FS2hv{?JP>+2}gablcN^8Lmxpz^PbW#{tAmf0enCs z+Djo#`X0pZKejF)8D1}1>g|u*tf*O9&pO0kXX+h$81JhN^aQr|4A1=4Z>X*^akTY2 zpK!te58dWb7ofn`CUI9D1HfxIzSi+*$k4!T zlJm_LUXUd<2I+$Xq@B7DASmZZKTY?Dp~vUTPf5A|vAuv-8|wq2dR&x5#i{;GYq}$J zefU!n%FOfYB5kTfE?&^?U<7M&+BSU;#LA!8D65;<&V)M^5AGu>wq*#nM}m@DMXqA* zI=PlcQ2>?m*q||@-fe9;G=uMpqE^FuJ3CYPb`C#*;ywx-I@<2!ZiQ*h z>rwFgl8COECFEAe(;U0*xixrs2_q)WEtQk>vV)grj%S zpz!W|oTKmV4?xUbe%tofDw~6fzq%5LM$xs7At~BnJg+K;DVJ3{U$_U_NjHHn>f-xA z1zfXa(OsipIhsANUBbxf0(&^Pr#k1HUxLm5jmPw;m;ZLc+ji2+NU`dS3pHznCESwa zR*i3`8UUc0V1@uLX{Q0Lv8uTd>=1PhNGkwKU67jx<8%nVNPPSOdC8+wY*5S(JZcTf zQA&$hAj^hsR!5cp5)ejOQq`|cU?(wREKfCgnm%_R@VzD(SipG(vcJqP9>ZTt?~f(NB{z=^0)O%$*{-_GA+5 zekW?%i(f4K1qX%wDl{||+DS}>E!;FpM3P2;z)vrL*)>$07Vep1(r3aG+Mi$fZjA6v zDu(`yBs2cwbl=x)jJX!e?*gv?C;lot214fvcGsx{z4 zNP=S?#vl5!A6@~k4b3DLE4DkV3F_4HatSG_F(;dM@|M`oHO+A3wpK~75w~v&%0piG zy@=%e$;p$A>V-yC%{*6TYJ-y#H2Dzma4brlb&TWX`n~43iJ8*t-=_UpXO`MU0EMlO z4deh>s7yMsyY`VM^!)`G>^nFXSJwM5XrhBs_g;EMtIg%2`xD{r&7yz&UQ_4K%wm>( z6#46<3h$qR*Sk4%c=?H|^EDBA54|P6hE}%%iAsqU#hwLb2mO36kKdn2t_fuh|0CmGWsz5zNa>d*u`)7)I@CF%sSOA zoK?$ti()7h$2tWjy&C6>mRgpOmhix#7ns%U3*R;t{u73JU-^Febe$jM*0?@y60|K{ zvQCOg$*d%%?&doN3*k}t;NKe6?PITccRSV$!b4J0HboMrj@rLEdjbt+xdouhu5~co zGfTzd>g3F7+VzEHz{U6o_Xg4IvRx~FMYl!#;QgIr@1=OE^X4%B-0-aW_unmEr z47FWq5OyGGH~q)u1hn;QsidKJg_$gmdWBEXv$=xZ6iVm+pXYdskeS~t;qe+y4$0gO zzxsOQkE0e9+(E46kUDoA}hU-h`>^j6pR6L*t1%2WHX-NvpC zQ2d(hxZb30_X6pqxSE9C(9UrgvJzX|$YNI**40L&cDs@J7ai5#$#HOVOeSPz%|hQh zb>_6zH~m<(g=l_Pi%wtS=SO}T^WwHj4cYT}Wl?6cSY?j4bQ!A~s~s5ZO;d0wr)K24 zMnAgEm=1lTd^gwJn0?JPaZvKDNsOhsyjK6dV@41Z1D01h)surIZ^Lp>qNEf>D2)qx zfsB8wJTTL_3OFVIw^qP2$8B06SA(`X^-iv4LE^;BRtcGFb;s_F_GO9@-pS(`(H6R* z=<(Yzhp$)>x@!o0*Jk#Z3EUJJcH|H0H50#b#Ordw%=%eTFmun_Yp(%*X*W8chzi-J zyR?WHwngO%@77d~jf?DKX)}&7!by}^r(j?bTFzh&Txs#=8&=c3 zn`Z_;4RGCBMaKu`iDy*zHk?=_C?d8B&Lejbn-#fSHkLAyXVDy!o%1KLdA};(BG`(S zJt!y1@2j>0+FF|~=3QBs!TApB7D%u~j+@XRKVV8y;XY&1M2Ts5n?*~|r~J`ZrsV2u zxl@7DH=R1%FOPUPtjSr(yja&VCJ1bG^~$|cDZDEc;T4*?jw?V_nmtgnSi{w;o~lio zss;6gEJO_ ziPmleZh3;T1a$XqttKF+xw!t8)r4qOP7Q4bO%Mq*f%xSMMy`ud?{!gd#!)Z~gV^KW zI(=Itc^bd1P4+BQ>XH-ssw#JezO>_}Pd$cu(vT!<-HI~I7Wa93y~@hLSeb<0VW`yc z2j{$u(x*_3lQz=>$#Gs=f8@LzCFC_jAozoXp?*Hjb*O9ci?a1I?B-fg#r*a26YYEx z(+;7TQiTLO@$dnH`E#1>irXdq^d-|xWXXZ^jL^GMkz%Hz*QDIoRMA-v0!p+yNFYXK zgMEC%x+!&*3aRL2H);eomn|xwjM=|+Fxxk^$MdDR;PaI{zlmTq4Q6$#96mG!$URwK zHX5SMBYWwM&D0jk`=D254V?Q$;gVW5janGuKJN{YoQRJ-A61)0&d^G~Uqe;;Ig+#M zF#*;^i`hB1w-WG8x{-HV=M~!`+SGnS7Zg*WA@EAG zd+SlfaxnKL)%Bm7gt0)CGn&;HZ8?eXM*Zu{Q9R_p0@BUrsjEU$2Fji{4?yz<-i+>a zyEzZ1(G)ksjjqt#aSKQ6h@l7i4TtMX*Ol<=dsu915B{uDW%S16`ZkR1oSW#}Gn))3 z>euK&$K9^B&8mC*6%F4kIhQ4SlH;e!JhT{kU+@B=f#P=(1T}|Z&S@Zqk>$~r3!yl%VQ}^U=b_SuG zj?zU=6phR1zt!^RtMs&fGd~1>N%!gL@N>`K^-xM@?JnNG4^u44`pz0MW3yB8#+plZP=Vk| zT?nn#gBeEs2(s3Q;Z@7d2iHp>DBS7-L3`?4`&H0HCd^S6#)E5`JyEG7*D-MJ5@%j} z!z^(XZSE=();gXMDOkYxQPE1w91#E)1A$yJg z_`h{_ai`|$EIQ$tDKvanR^sG;;Ln_}Pu{2|YmXy8MRuVMwUU1Fsk+uq6hxX2b>))| zbH!Cap$ioingUyXER+%G=s33=__ebUphU~If<_%j_~wS$V?uT*5`G6TZvkhZaNz;0 zWzC714K%Z#;7UP0vf`iU8xby6yN6Qwch;{vW0aJr%__CgMkHQ^#-f8+c4&3RAR8=W z#&kvG|&r#&TT+gl5BN0q<4($s%#7L_i$ z;N~3u%kXXFcuO;SfyI4bB`a^QnmL?i$#m0G5}(sw34g0nWqy<5P}p@+SzHtd-{9|7 z17@*SUtBj!Edc0(hf!tsyXjHFap2H|>o<6A-N+=R<1vAi&mZvyx{h%Cp$Y@P{IUc9 z0GkW|)a&BF%bC{^%iIO!a<~6|XyPz|qz+S0>u+UTELxP*y?NNj*_)qrYc7YGE49?{ z&*`)lflS4sZ^yKNT@^^TZmMfj_b!_`<93DI%8MEe+ROKR%F621O8q+mSRxE5k!P|^ zz4}Y8SjTYSPJFzEU&Fl0C5j>P7$705-8^g63 z7A@h0yS?=2{i|L;@PF^~f>F+Ef)uw&{Ae9}IJjM7Wm|*O%g=1t^v>2$*2nDz+xd$9 zO6Q&obrs6BK*nnNv@Bs<%!gHnxwOCV?%TpLqMPOJ&`^)IC*%yRUeDt*{1QLhx(O8; z!oXIQ{;m7n>&$nCD;+H-ZNeuJmw@4&_!A3RN&Z7IT7p~|J#KV46vicc!36@q(JfXX zP*eG#i@ zMOBrDk-A1_a(kr|UIfnbx*Lasrfsvk()$7L&M%!b9)MobxPv^Zo>EU=W}f$cKwuX#nu^G{pIPs918taF#YfO)l% zh!(7L{S5jb56n2Q%#S59Mqptw$N@j=$r(J=ESe7Mq5J_IYPR2-=#gI1CzOh04Qowa!fra1Bje(lUcB78rpbID=KZ1|ndAQJHno&LH zio>4qcm){T_aR1LhDS&!SG%TiaZ#Z!ajC0wk~pvZk#dpE7kHT`<4<{(s3NZPki0vn z2}9lQ=Rnp$V<3JH2PWP%f(=Z(Ec~+{bBf)CMp8yS>4?4F&JP8g)nEDP2}oATs2GQD ztg!~CSnXf#i>0skmWMMb%7s=X>cJ12ztvSfhJfe*6)@>n zr;8)pqWCv8n6X*jlCMhlFvR3cchIRQ1%@I}-|NK~+Z*2n^A7^A(^D^_>Cj#K$Za%N zmI7sJDSH2Hv5OeS;zxFq%hxaOVjI0DCuo2_qG9KgO9JM-T49PU`qNlyrY;EHl=k@> z+h~td6*y<@yMW5L<{bWcw|+{0>`EW&`vGs4hC7&+wVvB)lubBISCu@Z+Rh1hhUM$G zr|bmSsIrAw5+Z@;XrAIWH{btk5tedZ^DB6RR8gw$m-5b5Rk{&o6NoGG`K~l)puDrg zX`|9s^fQ}#>FxTM<)zM7Ee&(DlLsOHV;m$GqC%dUAFX>cK>2d<)cGqbN#2VTdL`$n#zWG@M9V^G1f@_qq5d{m5SNQA zBocSkx#|`(w6HO$LH@TkMmCA(nMXB!?85B{Dh({_G^?xhC;>tSA%^d?;g`3YZq#vo zXu5AGb0O85sE*h+Qp8{9Z9A>|jT>d3%p?|e{4Om5NyRno-IoiVMz9#`lzXQRl2izK zSFwm(;O{nurXv9UWk0I#r6%7LbfET@wNWOI`8zn%0k9EjA1@+j4`7t8g+^2M59O`3 zs&qZf77$nF(|vK)U};CE!>&*tQ_K72Muw`VU3!8w*loEXd8?pX^GtU=*Z93+6cVZY zRe>V^VHBhbU6ARR&ro&InxwYIZM6@{&Ug(GvP@oAv_vPgGrs_G*HbwJ6@afOj0dAY zt0MaNxc`49uNA`kUGPSsHbiFJlaLKX|p?)+!Y7siw_B#mJP`+5=%?~%~-V$ zYSyib2dfsa)S(?$7LVn>5JcPwn=Ih~*Ioucj3`F&aKK%%g$51(2KF_0Y^Xl%{&6mE z@d`n)2qULfOh>_@8hIA9x4`WLegIK_#c@HJ*eNY@BuoAAE@lC@D$kkV_z}wdI|L6W z3W7cJ)JUetOSV^fVuebb7wReVXaD57N7TQ43c{{>gL>S|+ajlZ>JBIQt`wVDznH|B zC+2zJZgT5UOqAT3VCk!o**iP2KVWXXGXie~V<5U)&bD)YT+;aoU4WoPrau}>jE&%_#ZNF1b@J~#cwCuS(_$?Tt3v;rq`ldEFf#{n^);u27_@iO!X)H z>bf|p@U}~K0I}Pv#v1MozFk~vc80%fdI+<*dFoF_^>%7wWW5?fQzU)6fl)!}>hiV1 zx1$bR+sV9TZKd!!_sRf-wk4~c zFSi%*u86B*-C&fAP5wvfQUcv`IrxiOQnNODkjw*$u`F<*n|-bf0qAj~Hng`BR6wyh zB~oVrFXAX}hy0L<_V_@Qd@PE$nWc0E9^6U)A&$%K4^|y65V3b`|I3loSNdv34+I@C z(5hKJr>i~3vg32bu}R!7H9-yy{AXnm01Cd(hSejw0BIR_++M$2I%+W1w1Ve%%Ne=d zo9A=%GcWKzf-Q=Air?@mPt7icYvu6I^zF^2{OI$b)7@noK6_E7WcT(8HM{FP{q;^e z!a5RIlB}Rs46p!kd!)9W1j&5UU5*G;@vj$6)ct1LcyDgM*yb8J;D6WxkWWJY-@6`Q zkZviWXSTC@X?*weqpo%G?kzoEcwZmUU~fiGF=S7vvskslkFp;;zd1 z|Kaif8DRY}S@dGOypiXMQM40DnJoeRtrQkm2gYv^qIs5L`y}!ggddzN)P2uUa^pAr$p_d5TA*E zS$p>2SKL&Vkoa&!Gpqy6P{ZArxcg3S5IMyGXPHtb=yhUot_m?LGGf`{GZrJa?Ur*e z)mxm(18ZMva)}Z2v$^AMBgOS65%%Nb`#utQ@!7a_=Nf6~dFq7tdiv$f;H_fme~)Kc zv3+yjrHbPIVMgC`(kGtAhQZM&Qu}uaR!xj^Mog5*{d?%brvh0^9&g6OxG=&-oR$LR4Q@KtX1~}p) zsnY5e?YiufyFf|gO5bC=$pKL8U1u89;qXxYdPN(@_Xb3G5j>y@Q|7VE z7Jv@GPNri>@8Lfp9=x54plAV3l?)Vs@|gz7o)_NMf1Hk1Gay;dXY7X6)r-4Sw??up zS}Bup-@d}U+oRl!Ys(ibl}F;*L=Z@@eF){p7cOHmI)V95`9H~j9fA(WRmJ+$t))#y z+FoA$JC))X<^Mc!t@7}xLFidPI;|JCx&)c}4tDeP$VW2u;)L@oCg?cQr(+RSv}8+$ zu&AMO|HH}zZ~Uni}6~fE6P3sn=tw26TtUF<$nXUhWO&Qt?k1@NuWVd zORa6b1ln;b1b^1b_k?0N_NYi5ao$cakg2a2?qVV}K={OHVr9$jlmd zA!U4@?f2aPyj5?$A(e$1i1&Q)izBsx$!pkOp_+@VmG}(Dvj9_0!#de-QDEsq zBfS>OM9+BERUR%Aem3Ff#io*yw{3N2e{rziTLo88)rdU7dxxwtSM=mAVI25+0>R-X zo{0$OU)f88#8fU!$8ZO!>AT6?^Z<^(cEzt-fH=&_q*$`=J25$bPmrfOgDU}nFXAN7{_hD&cQ5Eo#x&Dt&8vfoRBM?<51?jMnVtST|i@Eq%6 z$nX@v61NRCG%Aqjkh+|gEbD!q)B33@abufwLZ<&KdZ%#Xht_mN4ATP(LNr!F9A6RJ z&vv>%R`Jk3z@#pyv0Kzqa78NX?M{Xy9jUmjk*D=tU)+D4EjWK&C z^Yg6}OH$6J3!0`ksEsDOo+Gye8q!PaJ8^N8^+i>ROK?IKXKMxF7uTh(?*{=*qfrbrk;!HESt+OIrwc8NN6pqk{j;+| z9Y^fM6q_u-a=41udTwn@n|M$k>ZK`}$8K}iZbTq#=%fV7Dt!oE8eIw&{d6723HGaK(DPXXV66z@UDM1#>tOW`^JMk>EleRUQ0wz;l9s)C z+#ES)A0IZxz(>FbSr4O@SzGU60Y~10dCcwe8&;W&xZOwN4GbTyM-1-nL(SlNa8M-) zj)6^Kb2v@9N$n+PR7j5`H8yKUJV{_^_;o1|2TZGYVEG{1&oJP55#iM(153@j6dT53 z)raonOy#lfT=?Lg2HT7oh03*&`0SS>>(&OaA0soI7B1+B6R;GNk=_o*3A~w`ZmbY?1CBzH=Do_^Ey3i$6+{BQpvc zy3xnY8;n(GHPB=J2$L0MQrb7gpS>kLQyQ0+7(6J?(2YpdY!pMBUe4i#plAUAdizq2 zM5&+{Hr@23@c_n^ZY}g{-nPQY1d>-ULhw<-xOTEy-%u_HShkbb`UG<0z$WGQ*hcDx zT0|@Eq(C-?hW$pg?graSHI2Aq%{oXUiL^LC5m#htU-@y283UuXSZd{A?jcbvf_6}? z6bgu0I@Iq63eE5cHRlC6E_>iiZWMx-NVq)v;Us<@NzR}cXcuF`gvQd3$;tnbLDM>k za-(;5@49|vj-@3e)}%i@<|A@}W|LJMm^PN};{yBk@&E*)u2vq<9%+p_c~K}=f$FO0 zPC)MVHHq-uNz-L%b1w!5cXvLEXl&tpyr4N&vwZ2xxyps zN_uks>jt3t{#|E~UR~w}R_$`5$n{4wFmM=w{!$LDC1$Ap+qEZw**c5FW85|qWpE#G z<~hvyuZTmra6QGGChmrfn-=T<|AKk&RTlX_N4^e3Ly?e52Nk8?F8y?yX;&zdhjR66 zOPiaS<$@dM-qYp)f7R5~}rVuBl)|9dBOeXM76bG5LKNXW5wTa23?&t~Y0j&iZ5n9Q=Pej^goB z&dIt~j$~wC2?X`b6d0teZf=9DHUsq(nf{6l^&m^w^5A=2MuVseIz#p30<*p$j?6Ov zFGcyT9vD#4P|0G&+bs3-5d1$Fj8diXD&8S{#ujl$!?f1o^ft%1?~Ij!@6nvL4&qb7 z1@O|JD2NopiXF-;%NQJuYo-FMR#b31c-uDRfg?EG!JCQ)m*$VwcTqBvb*CfZ5+aLB zUK9s}`)#>QLGRpGe{WLsQ?Od&5xKpnEoj9vc#PBw-Aw+RW4ET=K`S2j#+Kcd@e?2F z+aEKp@t~+Ui3B};+z&`f&wQ@StVLyZRaB2Unj{`?P(eLoC@4;LyAy1YPksGX{{B3M zepqfaZ;l&?l4TP#20dA=Zp)cpj2rmtX;H9+mhiAE1L0R}3R2MtDtB>UhgJQN#j2eE zlsmfeNw_)0z6X?RAmTzlM@3MF{{y*{S8Y**X$AP7PPwQyU1dLP1|Eg2Lp1if*DuJ` zvro<+`QYQ3<$tVuEj-r7feh)JSdo7z+v>&@R+1JsK7ge-TUU|2+&}WjAtM5@>kOf+ zL8X>`i9o@ta{6hAjA-re$;m3OSK>Xd**fGIdbbIcM|0B$@Zm5YP;f8fiAJwsY43r$ zHciaexM>*pxj~oJdO!VOx2a*4QXDSUZ^f1=uL3WC|J$74+w~%>eB)<;aH(ihG-(aH zN4HG$pdMci9H4B*scm4G(s$LPsl7;5sF_-qA?*&tXRhq2G4Pd)^IKaPg8zvDSa2Pv zbwg64 zXXf6}Uhs_W2TVstD+0DA?8fobx}pK3KVvK0OkY6xt8GdN=Cp8qTo}wOi`(cRe3Mzs z1m_x*tM*TsZ|p|u{+G%BKms=3vOdJ_ zQJX3ZOTlj=g+^l=;ZZb0id`HrD&DDW-yUFyd6n%uKVh!heG^iDBIA zDQ3(no#qN9a8smoyt^!vc;fHIuO$O$#0QrsIq9JX`Lys`YmYjlLW67A1@c^hZ7-z&6b3lOW zCx_qRE4bKR>+eKrU*(n3*ud^W*-tAehdm8(-+WDM9A^4L=`?wr5g;WuYz+vT4-KSp z{}5DAP!~c>`QWm@d(-}19RX6xRl*^27c^c^lv$f-T_1~cy33Dw040*@QkYm|whF%Z z&F~QIN!gsmJ5L^ioyf+Jfgy(4(ipjx(G3t~mhpSdn(`fq_=gcX!jL5w9i)b*WAL*< zcuh}ia-CzI`UDFomSXdfJme0699_zc5aDm6#N;u4488-Fj^;5Qm_TvlYrr};!1eb$ z2~l$Wx)=kbF3^7cC`l?4= z_in^v(APXLxSkgBGfFWLPqoj4ZM z(zV=6#})tEQqA^@-#~)l?>d+r#}e`F6pN%H_qX{UsAMt!X-xsC7kc?7K}S?ncBbLwXYkQU9*(g0OB-h#XT-#^~*2Tv7&@f z;e}_B_3jcfSgkBZ==@3Ah-A@hNradb27i^8MuWN(MMhKQ+E z>Xoce@t_lwelr8mg)~kj0+vcscOH3vd;v5Fp^e5I000Wtz^pI;0acaL-|kHC_91Hb zb1jZ;29RH|U%x*`zfgM*9oy%4lXkN*+}A;vlybS8To%E^#)1@A>};KTrZfoVs?rg3FMf}IzHwe zakY}6-B{9Ea(b|S7Zh*;qroUCT6$7P6vq4O%+5@m!;V!pParHwzsh=J%z9wX;K!vO z*RsVCL_F+Wl``n?2y`uY7!Ew0MS0FEHuHcUiftMp2;Xizi&UYE!lDHjhXNWVd7nbV zSHX&$xNh=RV1~=QUq&gOS+lYp{HI!ZOc+*%mJ00G%#{pQd{f^Wo*fh@XV*n822Mx& zeF%YibK2hxj3dGcHbVcpl+6q52t?r<&OzZ=hP6j%pIn_%1~C)32HK^@qG8in>?*9x z%x{Wg-HAer7EzR0Z`Zi#>Dm1{K1g=5IT9YqLt-Uik9KY#9UMBpQMa`Ww;(Rbq2&F( zn)Z~5Cw{0`8&ucZ^&lz)Zk2HCAh)=UgD7`+O7T^9cBAWuGwdud_~=Ly=w1ZN{U!mu z@iyKKfEXRs^7}teEPJxl^i#W$xeaB4HutQ=W5b<$S4Ehw%@lnvKzxhn)>ktWe)3jR z-k8WbL>^sNtxZ8DYam+z<{aDo0mh4hmuR~ghO7z-{`oT-u`-s-aM+UUH7iM@pjumM zo2qW@0VvL1CJp*ulMdSThbgJ&875 zw6})rbjCCNSbVNhq_IK?;Mw7$)@Occ!q&4dgw<;ArkQ_7^kBfYW0Xe#eMeHgu*gM4 zmIglFPqa++ieKR^vzO?lu7?z;a$J9pe`vsg5BI3h|o{F1fDSNChQ&Do9 z$>PezGL*0d@ukWJN$aXgT9g#=bGsoZ~zxCR##ebya6W8}IUn&_D+fzs^FS6my~t3nq{#b|-VN^~hB|J!;1jAD{JyRz1o{hd?usKYG; zfWL*QK~EP81ELQR-~a#s00pL3rII7f0My+Z7>CPlU@Y3ec@HzW8$ncko+{&FqJkf0X|$iy!#Y*IpQzcy!H4| zPIc{$6EZ%Sr_3ghwX0Zc0w$5s*fD9l7M6x-$8&T&9k)B>u76iuUWVfhut~< zD4WPVP(-1cQpMa?+Li;g2rEnK-87cN2vjA{sSm~uD9~1qxPjGekGjzmYjtkQ&~ULj z#L6#tHbOx?$R;9%V&%&?q$_t74(#}7HQjff z@V~WY{S5}4MpU}(joU-Pb*#=)l?^}Vh(b*`z?aZdsp?;$fA^xg@xNx1bArAw1SpZZ z#|D3vHz(VS|NMHGxV#`uH8bVdE;xl`a*EG*TR5g=%HY~wIg=WYsO@CrZ(=U2a^8Vh zK7DhR>^k%HE~C&Ly(y2B#IMp}OIwo5>^HWqKNa0M9j(x+_jk=1^uR0H0u&6a9DqS! z7a3vAYmecQeqrqi13y5SP(%)4o~m^(OR?v*7Ktgaut?rD^x2p;Y7=_y%IZw$`~MeV zZZCQD=X-^;ePoFa3#|b<+|wxbs9XfDMSjDq!fwrPvq~5z!>=y}kY53(W3(N7=#^Hr z%wowX00000%*yijCIr$Bg)2s?bty7Wk|4t?5yuF8xLn+*33ODK;~Bc9#|L? z<0)hgzOpy}i7jN!Dj>&c9*T1+poR{8nUGaD01fI(wzwMzGQyW8C+06UxTg?Q$SgPA zl_F0#-*m?Ptb;yWHNkz4@L@<+&cwq&_!j7zmnnyvi#H@?J=5>a&DX!%dPh-vPk35e z**`Oyy;q+@i>HY586-v|gA)vP_#@YqF}cJ)Rs_LbRwJ0mzJke!YVW7%aE5s#kx*ou z5&Z}zrlm?mw5FO6dygiOFge%|Ltj1;eaDp#k62Y1L?jZiED1}bdOZhTY`7rDQb6yI>!32M#HSx$;KgA3V+mcPFKNtqq?6^-zvqfl=Bc-ji; ziyOMi9~`L(@OrVL$b)t;oGr@RZvv1sZ#fY9dcEpXD!5kC*Bdf)Py5Sa69%Ikjv!%n z%U{H!+~8_yau+qzI~5~`DvH@E)9py^b(~-BbXXfO0BC>1wR_c-+8aT<)mGsCsZ4sN z%Og$Ee$$e4Hu1}{^G0>p~~RGY5X27q7xNB>XPq4{c!7 z6B7e3j4vOIauJ^Ss*9##f)9qBr|uw2vwOU6j)(3_##AV&vEY6lq4} zXFBp61+RZhVvgwl^5HBZRY|s`iHqvdAJOD;!@Qo%>UM5w9SV&FpPCcYGLF9<1!8Xl zkqP$X-Hw8?G9FN)Wqs}nhsxV|1M8dqecr!Gk~bZd(&eb#_yOi_^gwiU{Ro=L;3OJo zbc=tBeR+JsRV}UiKq{;&<7>iIACLIT-7!Bs>O_rcuJ_JjHe|L)kwRp}4!LICOCJ*k zK%`H+;Y=N{1>QGZs6Q|PcE`YU3m<^zkuC9&1+FWMCpzq^{SIbNFbtB(OyjEwaqg&q zcWWn_Fji;7Iw=f%aV`J=059^n2VyZ7J!mtYMRKYQJ0Z-JXXk>W3u8bCCY$#6Xcg&{ zRzD_&mR9${*Q<6b2q>CPX9x!o=-oOQ5Hxp%u4HO@m8oI2!ODw0vcCz9Qsi(!^=w^? zUdt05wPc>)t6^RLaSOkc>#)sSNevV!+)-v^b^p6cFkngH0kK~y)4`5O=ix{>ZH|PD8>L2&&b41dgx}M+^2!6rfbD##pz06U za%zZ1pih?b0Hb^AjJko#E8W;>Fr4_yUY$8_s}_E){O?o)slp;4bS2+35WeXXdVCOM z5i6;Fbens==L}fd@DDI5q$g>qec@@@wjy5za%Q`3UBrBQC&JFYme*XkqJ2 zn&nJ|G`t<~4Bwt^t)KKZiEi&Y(q(+hK)NycFk%g4J;pyBaa8lSzRWjvGd zy(C2q#u)FPKjn<6NRY9AB*WJ695;->fxy~$rUXpZCnO3{rgWpX*lEuN?Fa^)2YD_m zIM4<3GCOsP0BA2je0)M?b(L>zm12KBxw?x80Yt>W6=#8E z^mbg`^aHQ|M@|JdxgL~5dt&<>^m>_+bvJI*9sI=C>$(Yq}R0mgyts~FIR;8C@UNd zz%iuvnnIDEK(F7W*}qdMtCzln3FMmouAr?KfIj`x>(3L^T|Mqot3FEU%o6O1NlEO2 z^W!dxDKOJz3wcsahQ(i(Qg zpenkt?-F4Ow)<<@=Yk3+OK^b4-4TGp!}7b$-9T)EWTCw(s0@N%qo89;5qfx2oM@_& zp?*V8U3D_a4<&En3xfmw@aPdJIv!ZiPLiS$lt9PjeuT0Pqs__f&aSy)zhw@1=2u+T^c*_fX_5f4ulxlo|D{HPlWxPU$ zFB)&i`236e4%_u*6;ghX2Sc1p0FELxo1v>=kR6dCzSte&8ptJJP)ng;d|!cPHG^;@ zy{$3Yh6Apj<%D#~(tUk?g&)W0u&PfF)~;RhiVH?h#@}zFtFd9lul>K>yqI*#UH#88 zhp$0T(51=r%4;eWVc~G%Kb2D{g|W?~%A`mC!4MqFwzWpYf5C-!U!F_9IZ%KpX=N!Ww@H<)Vv3Y1c%2F|zH zXcJxMg2zOxrHnGi)s|4@lbf!*FMn}}MUQKI6k~{3Tci$Ih-2yj`>JE=wEHh+@E1;9 zg$TM}n>n8Lo7_>pOa#Ho8R^bt?uFc@^5)EV0{yk@jwxnscZJG$!2+a=30buu8>``1 z$nsgfVIsHguP2i3{AF`(rrdJW#D^L$ew8os}H-UBaDJk$=sX~!}1&S_w(=}>c2`t1tH3?S9b#9+P3z1@h~ z>glZ9Pe~RjzllMPu@{G(OT@7F@z(OEQr@5*_V zlS#uJ+Rg&qN0K>wDo+i9zwZ~gRW6Q=o>D@1QLik?-WEInpIdHkQU;NfzizvLVZSIb zun6$e5t}5hnQBiz-9;8_!P&yW?S3gze%eex)2DB+NC#D#6X6~O!k}g_fy}E?^MgoH&H%skIng^ zHs!SG{hf|{xOY&iQ=y=>mbHQaIwPbzpXqTWHOxigRpRlqSu?YQL5R35bFg_d+Jp~G zNvVDEU!pxH)C-TV!?{V?*!Wl)o-j4kmi&9zEPirInJ&^LdmXSy$p=a#GHtHQ`3iyk zwW3(QE{?EFk_sX&m8#aX;&6O+Tr@`L_NkeiKWw5yWf5NPR+E#Rtkl+^3HcK~%1n75k-O0MvCgrZZ`gn2&SU!QQKE*n1(8Nl4;kxz|jvk!e$=< zk+=YXiiwLldj@3+(lTu2#HH-o78rMg^>+XowtPku5Y-b-5Z1c3X!pw~kCCJTAi~ow z%kQObV_pnkaw7rH@_SGB%IPghXUb8kUv9o$E2^~o%4<6pnMONE!a0M+fH^FL-G{>&}ygj{_~gC3}@){kyfx@~S`IMHAZ5bmj(r3cBMq{52W z%`1Q3TN>m1OK7i4(MTc@{cPD)12%vNyKIL!H_=rTh^~pUtx4C#85Tt+`pdjc#qeGN}Vo;CI_tu_KT0h2skEJwGC47RBic>S zK)E&{m}o&zt5J)hH*m=`+u6Nxs{kbTmX>_K1HeKRi4=bdieWqFa_Oy*3jBCD?%y8b zZ)Rb8ZIWoC3x6@4?iP-ud0lrwoaxDdfpDq#Z&j$*DFRu{nz;#k!3vmvl{n~cSnC)- zK6|Yv1)N_$*zh~tD!sRMQvj`iR2$};kowF7{1`KmACV)yn5n;v*|Rc7@q$&X5;H_g z*GW={1GX@|K6cE9e~{PF@-3I+%G~0b95**`&-X=*@Jmj9Ubt5Y8Vuz+&|+BUi5K*? zeV|s~dP>Q(98YS5OlyC*NB$`5kPRcDN)zvn3J@KC&H`frZi;8gNIuZs{gBtdl)UX?j;=#uW-M7s@_|aEA zx~}(`cOEwSr4peptlIbxbFzAK-L!^HJ-Z8Rt6o@o6REV9khschsCoDa z$})WTPL%%Q!kP(k>wv}kT@xP=0$Wq96zHc{*_m3ml``IZT#kDTQT6`sl5kd27FX5~ zrfqHh9OyFQQc}g#XI|5JDtH9*M;(NJc>{e)tHWf=9fpN7r1Dd+94RNIt_c8);@HSZ zL@im|oiZJsDzTVq0#Z=d@SCK5cS;6Q>!tXkrX!)C**vE2oiBHk{aZ>Qf##RL+JXCdQuACI zh;qBO8dvHZ#Ro0pT9Zb5o!Lzw8dL&W6njrmLO8M?mRlq7M9UX$xwzPTzcE|!*lG(> z+{HU9K^a;^*UbUkFt9VItRk_Ok2=5wOFHPX2!@gs6F&*rcyPy`x>gFpKcIwz@n?h` z2E{oOv9nHOB*p|d3Nck2JQ%!5bonsq?&X}5f z+m_dnKP1E|=petS0Of!5bv*2pe8mBg6Y@2DusbF^3%qGkr+jEge#cZtNViZ!=-Zsj zckS$Ql$gG*J~D)c|Kr=ifF&%$@sW;z)`TO4l(ui6^JXV;9!Q94SlnLED8c4 zM_^DQ*D#DSGCus43HVerd!?`VT>Bi=Tb@NCNRJ|KmJP8-k? zuis^`2l!L!W_@3Q;RHxaLRN!*kPqSW=+-0XtNT!MGf;hN6)Eb2-TvJ-q|RcP=;9tz zX2Nh`QpWgDQX89AxP5USIhm`tR#_|g1$ex~TUCMh4=+6^2i8M5g7XXQ-$5QE?*>Gz zYLE+#z6-7E^eWJH>uNINEu21&fUDMu0I0N6xgAi-H!R=`gw7LFt&2O33rLVE598d; z2)NS%>AK|U=dezP1@%|tC&sc8zO~}sHo!!WbZ!x}QT`MM?N(YujjHdVU9=&XMo+v9 zO>c^XBr$l=($eEXSpZU#`{^?P*Qyxr>f++ULb0D)_niaOG?Fs z{c`F7vB2!6h13+aj6lLo5+G2pp2RpNRHle>V_?y-Ub=>C))Wo@-LJz>YhkBdP$lx% zUwxlCl3ICnw6X5ZmK z*s{uo0-%%3)~~DvX}WD!cU2OaO?Z$4hGBJyZkt(t;QqKSexOTeV<+DSyrHsEQ^|{1 z(5eH2=I@P>6(P3~qy2gSiB-c%F>AdZC|4JmjB?sIL z7Nmb7cC?}l(hWn?7=pXqW7qlQMpxdt2sKlaVeKF_=Sfq|d^ z006Yg@*07IusKXE`HBMbq^syBNaokrgqTvgtRp28Z(ULep|h^UGF!9`LoQE3Duc3! zJ-SgSX|r0d&JF|WD*X>gf+2KzEk(jH+-PNuz-DT?-*)S6F(n3Sy!@NggOS?;#2%f; zm#u0uLmuPnX^eLEX5AxNt~QdDkgBiH{TSIxa#oloqnPV{+aX#ejkpb(ufKV+uPpO7 zPrJlcRi*>HX)p-&eQ%K8=6G`RRXb~t)Zl`4aD_PH+|V!jfv6v@=NZgyP|QbfiRS=v zX0u%EWh5vwtpOr&?ZCCl0d|*&hRIn_R|tGRyjGZhr3w6l&-vOjT|OwCE&P$gw*%bs zZHlBh|LqifiYt{;^Jz5?nG4bv&Fx6i4)BdB1lX6zedQM(gihpttaGR%{PoUZcN`Zt zd~9M3Gea}S4(>jf6y1Qk_h1V~n(U@)vp5(&rOcZwM#{EKxqmL$hMl1ync5lCp>t5f zpt(qv$AApRR0w2yjJ}RQJ_5+yV=CV3>6kW+o1ieOUs~3Y>I`jhfwEeh|Vf{ecE4gt{p-?a4S5VN(-?5~G-;KD& z!l7WDe9y0`tHO6KWPR5A$@FOtJIsHeNlWclvb6Ip^g1M_0Rf0;^Sk80izrg2XOvO6 zVCYT2m5>A>rtUh6ym~PBio1-i&B!yE)=Tx4bCtuFBKbbRh(rkAYAuq~49-LN^f#Lc z?>#sD&ts*NL1~qrsmQK15Aumt*69l z@^eD;0D%fLPx{lN_by5(*VG%~Uf}@C+;%3Fdq*t9a zIyn!Gendl`>-Ra6EP<-HWF6i4YQRb+=uQ%4W|rTt&zguDw{*$vx zSm+Os$=X`vCr{z+|AQmOyBF#^kCsmqLPYE>OQcqxsmQK1KmY&$00Gh9!J=Ib)*Qi0 z=4l*dJ2k4m;-kFI9Vd0tv4J>R(CAOf36Rk-(?xS9vW}Hku zCyxwwJ4e41d;g@#@eg$nF}yTZRwienC}3g{w(zH3WoC`xR`$V+`*Zia-4M(6%5qBW zm>eVj^cr#lGOtF36#eeqs4*#-4Ot2Y%h+A@YyL|-#^!oF+!DDRHC>y=FtaDv)7=~4 zI~?z4IRF{7U|wVCTo!eNZwAri7!5+O)n0KRZ<0 z>8;fCe92wM44MOGwHim2l3WC-nRmbXOrH?~IQ)F#*umYAYp>yHgIzVa-2YPkBN)VZq z<24s>91Mh!R@MlhY8_fkpAr9?P@f@V$N!hd{+D7CS&doO;RBYA^BkC*3k&TioGLVL z*;b0np8jeA=27uohvmk{@K632N(6;^`VG+4g(rGs4td|4 zUOLG+;&*1}`Lh&2>$zV8yXf#>%YRz~tYE8P7>OrL08sK@e_nL1&kb92d}{GdqKIK_ zSTb|Edwcr|sH|+@(B&AhHr!KEJ%+&J=rdiF*-Cq4ICiPrKDKW}o!=vZp5(yTZ9Jj2 z(R|o}iR19VDx|FI!?sI&b2M1LxwRPE z{b<{2MT^TNzHamai6Y|2%LD4&M$C>j)iML|tGEu!^I*3L4eDMd{+=#8La@iXbO^s< z8i9PUY(TnSsdoH-p~d9c)gkal-wD~7)j^D8(Qtt8Pr*R_Fk}cyL3%B8DbN4_000jU z2a=D%$Q^$Rh~@wQ00000DzdrhR(R_{!zI?t$SfOK>OlWemibdZs7G27(PkBql`-s$ zsuG9X_;HNT866)`WVvz!mn;Kg=mAu_>0-GmFO0gCV);U3<%iT{`B?76Z5X>~PN%@q z1y*{3ZHC*502Uq$5h7-j&Vq^LY*e9N9(6HCRwxH0%fzBSF-R*4n;2lnKuME$1?~^H zX|67NFAhbb!ruy<TV#laycXd=^G_ACeySo?hX)1$UzZ_%9pc@M=fEt59SQ znxL^S$NsD4Azg&pX&nnH0$)n6#}gWt4} z0x8gM@=@okMY|rb_HF_ti6}N6^yX=4*MmZi5SWN_rmsNqbiOtBmUVffYWPYuOpOtx z&o0az%8K~WMme&Ymx}RWLaW^%m&ML~QVw>NYVA(;a}a556NRkBxMJ%+EH$qDlxVxU&Uc{@ib0qTubUTdn&_uGC&Bt6|Gs${h4dT-S5t z$aOljKfmyyRJ|LkI&3bUS5h8SBP{1|{c91pe{4vT z7R_Ga1A(}gaeoV4PEywvSF0a2#w^NT{jcJa2ODsJ@LM=sP;;;*)RMye=gC!@L@ zXf05#;2K1+u>OfuIGbv6`3FgzhB+~s-Xb&AZmv8zLD%%wa>^q09F~U;6++-s=H*8X z9m?5hK9BC=e8k}o094BK<6qXS8#kdNXRV#W4^}rCaq_m-&|=HkO|d}slKC-wa@hoi zI_uBWoiZ+fcYrpP9SnMuej9rmx0yZX=$(caAS7Z?Bl01B+GdR4Rt`U|QzB-uJ} zC0l~Mb8{WC@W((K5p&;m_f#%B-TmBKwA&78?jrcRF}|)K)Q}ZP>L9Ya3Mit?)ASzS zg?M<6{pq$*XgwTmgOp|JEeS+FJ+in(^=l6+o_t1vPKJ&q?Y?-x)^*UMDn# zzgx%1&9~AZ$8$EVj!lKHrPb&r4#7i30@C#OdR35Z=2Q5_hm(+qsqEzQ(5nRcD|AAX z>9V*s8F($u{6=|UnQZu+8(R0RgpiC=F)YhQqg7s5(Qb|TOVT2USR52D=U@^BD!na$ zFyNOn*9M_)(=}{7cWPt=93lsbyU-b*7kjFH9OT_%Lz19-s~f~0w0J7xccRt&28Q!* z%r~<84u2QLo;~U3xjv+ z!gy&?ks7D&M-?u$xpuRhg7Qq^rIs*t3Q1DR7@RgJ1(VFV02Q7qZpCf26Os|&Xao+( z0XdJ{_COEliL!x=+m`_!8QtG_@3@S~ zt~Y1?2gYlUa6W>|+wT%E2@l0bL#CA=z}S;qE7F0^wFVc?ieyTi8llD{)Kiw&4xgC?p^F73vw`?sC$Xr>B%iLevN$L(gq#~UYsoogU4y2z(S=|K ze^BD;ei`Arw5WHW2nrEc18iS?LX^>_Ab_sw<19Eyp*7`DT7-`z^ERd0N482?pe2Yu zKnqTj5gI)JO(%AoBdvY6oYkGSuA#k025AJYw5;|rvwzedWeZUuP{y6wZCd5zGe$t` zroDwq_U3X)y{`lrPdc?u0TE=PJv%dx)M+2Lgbg0>FBxPNVpSd=kzx zj_;hD1KdDAs2&t}pTnEK<0pCtv!N!0c^gwAJK>$220#lz;LO`Yf6J|*Zw0o3T2Gm~ z8+(?MwHtCTwQL0BO>66wf)h{zv$Y3f=!-*R%^vYaO%0?-7|-3W+w<%+7)=@64!N1i zjONWH?j$i_7#ruk2nW!;Y7+Xr?RGyZX!Pw9!hJ_J=I0#g(ElaR?&Cvfp9#qV?+(im zzgpZSZ+GyY=CfoYDMdyKT^sijzJ9sd7q$33j)Eko*fTJ(L;=0oTG&k;4AMRB zjIqkiFM@&IbTL#8G{?N@18?_E?d_p09C$uOkpz5OX#l=}^kUxtMjvf3=e;Hm=N)#0 z@hzB}u&`h0uqkq@mK8P*K<}dJg_$AFDOtc($^N?&7QI<$MYMw9T0oF|omFYieEH9--!nGh+JZvYPpf!~2WfFjR1VA>Ff{e+P(VB+mDS>G z(plp)P*PHp<{bNK(F3%o=@`fii3V0YDK2p@WXpukvP=#5ep6^E85ULNzKI}k*swQo*h!BM za={IpuQJ6)I0OPvE@^u4=H&BroNKp@`gaXROzqcW1#h8%0001Vcr~y^_@gke(Rly&LmR9cS|l=kvfZA@&aikesT0gFe-Nl2gaevP$Q}WD zId?xeTj0exE|Y5s;=qvQz<12pmdhDK%rk-KE#7NHspQm_SU-7Jx2db4F@cAP94R^| z`c(U*j{^Lrf02%ySGwKwEz`dgoFTjK9Rp}hkLD__~K<>`8R zXTjTaD!`@IGJVa$dTUIR)-5Er<69iY_#=+|t`(-ix{f zU`Ua@=qnyXN1lY`C;z6P^*4Ex*^EF*w@LbhR~n5FXMa*f#%(ld%)JVxR_1 zzkzG_jYmaD{+F&>cB@_*-6EY5KKzI*f+e&6A}BloNbq+*{d&;~in?Ol>SY^Fr>)`B8JaNjwXDzC5*rs7;vtKprNY&=#O& z-!v^ii&A|TgpW%UOk*1XE%Mdc~lBC-pcG}-6^ntK@Th(D+5P|Ll6@=*@U?SFe z*b$5=@JsHD*6)Xr#geS^{Gx$cYV^)+UuU#TWfMLtD!RrtJubnRkB z;jJO%GrJW+H~2b?a_7$CeHg#6WGz$`4pNvR`u6%*eR0@9^$Fi&=P@H*kohSrPwb9o z-J`*zg|>gSg?mi%d?hIl3fnf2tmW>=#DS=Kwl&(Vj%^5>F4{V9e>3g0*)`+my29nXwSONwJyp@K#xRZ0aEt3H2BpO}^1BT(zTIedY}ogBbzw zXldyVF0Pv!JFj~rxT#stcAlY6$osRNM{!;$n&lPGr#QYvu-ci1e@iCydtF_#tn~vw zfyEi}DB} z>_~Ju-gCf%fN1&@Sj*|Bpx_PfH&=H-1Crg;ygFr$cAQ89ww%O_RY@s5ncSkOr_U1U z3#K9&!y?kxKT3s+y$dt;U9N3(#KZwV{Y6N4?FV1;rPWm^_bXL_q8oXx>)9R>p^1)d z8Ph;tMT=vneeYXVTK`SY6#Uz&qN{m6F7f;z))lmpuDw%C-JTts?~=!*tI#*LHI(~3 z{cweW&KG|VSTmr7#l8BbJCeddwoI!%nA9W05RL#7{^F?GbTSvoDFjpG;j65vB zZs!cS!=ojY+p*?DDCjSZL6)$M*4ZZ-hyRR&u_lAU?v$vcMpU|H>N>-DIxe=)6&*Iy zj)1_wSdIA_c#P!lSr^twszA_(&JgV(O%xcHF~VNJtvk5#Ji+T1%R1`2?8ki|ayTqp zO!0;(0KW58#{vgXp~-twu5Pe4{7lbb`-D`{`SdTb2iclG3=kiwl$5g?X$~Ik4T8YY zWns&i`HANsL~ZAXkU&R)rG3~UH6rI8ZNP%~*_oqSIDL}^=tdF(B9|17fZ{&5-4^gC zE2564;)ylsz>*UmgTiiI>3Ghn;m?AXpPCKq@eX)lIdN5!Jis4u^}%65>s*M&9B$^Y z;gwvFQ_V~u_X$r)S#0g#ezF>DHNv^@Cs&{e&(ThR_>gG(+6pIl-C=}XpGYR=KeZbG z003HLb@42}bVkqyj-Cpi8}IcTzY1L_-ZOYPqO=Vaz)i8+nJ}zqgHM#iz#`*n5EhrW0(v14(%ah>*7fb;$W3xqY*8Cw9<}VI z+-SJ}D%`(!_%B|T<%sMUoi~U;5N+=iQOBAjPhi zPgGNB6(Jy6MT+@K0i&F)IK}yi6eYD%ik+5Wtex0We?7@lhU4~l?|hO`rnlRk8e7R}_6OQ;=unmhF@Ct%DuQ!C~H@a-@M#4FWb?n_bXi2R~c8tOoTi|3G_?4)NnNRbtv} zK%3_Uz=UOzZ}Q1Zb>6N$SV>%L^pDD8Nz~K31!)z}9E2}ryO)(3uVrYCELi77H&g~8 z`CHxtbHVl;y2|J2CkD@ZOchX|N&*-2#V>T6>$7-3l*Xul!o_0gCA<#ob;~yZqO!xk zkH>w7L@u|cp*-5*J|C+O2xq0`2Ioyu+cCy~j9924UC<`NfYlbnH$vo}jTyv;V#*O? z^4~!vkV<<}JJC)%4TKoBu}+1Ci(`hTFgru{4fc@|f7(R4>WL%7<6b#949_vZxW5$~ zq)4&B4+%yJ4zZI>cvl@%x|ozM=XvESy1bPA7}O$;u&Wpsf7ifj`?fjN-BiFfF{n4_ z|LaR8GC@Iime5j3i?s!W2u$lom~*&CY25NjjJOj4(k6k39fv7FCy4HFDaD}rFRuIA zaM|&xcpJOgrzPDz0T0o{iG62Mv~Zc%7PoBa3Bqp~k;1`=ZQjuPXL|E))e*n@AwK94 zS3$-p{4ASB>VQT`E z%|R5uW0*aor4kvh?=BQVH;JWQz5oQQx*&Bz=d)66fx?Uic`t20J1pi`5OUko>=@Tp ziNL>zUE8P83xlQR#ytvs!TG8Rpy&|DSgv>t;JxPN`TwkdNs_x}8ec3}i(moF&+-0x zT}ZXRf&jO!@di<~OiQb=?lTlB&UPxyYuEiWTamEf4lE@jyMq4=t2Ne0PU;@g!rMKCKYadlR&Q+ci*@4$(=LC3|JOxk^uS>=kZ;LN|5C@ISq|If z|M{rd&%4+{|(q2ObcLSlJ$)F~jGxooEPw3qVL(Y+W+7r9_XVR(=R0 z{CClRx^J#wL&fI-09t9+5{ulUn2F7le@1jK%ws-X*HjWz5?M%<5<_r>8T|;LC@yZr zbWc0?(D(wK!V5=w2n*w;|GWGwp}ix)#01~mYH@gZ`^_gMp_Q&U(i)$)`Wf=Ry?>AG zEWJ=Zvgoq<=~jGbdtmL`dr;>8V&^_%$y1vDxG~)+P?mYELA?H}shHkGUcZP3V(F>A zg4Pj%)*VNxt<9(ksi|?F(B??#j#e$I6}PwG(Id~S7T(`Sh`>b398l^>EOiA5+#}w+ z^~|gI!api}Ced*CCG?}gz-Q_107)##7NGFA(;wsn+~zm}L(OO<@%BGQ;CBr*=V7s< zJ`T((sR54tfG69Rxik)F7k@MdzFVQg+=Gc?y0+&aC)5f<;8xAmYn^C7EzO0i+!cN< z(_R5OVd9eq?V6fW-=8I^*PzyJUM z0Y66RJt2`C6?PQURO=~g!W+Z}FUU)rp(aJ@26skqdXG?{?v7Sg?ek!o=Nv}tXXlbY ziu1XZx?SduaVfwL7Cl+AfhNF+=3!Se06e&?8aDWU())h?9yZz82SYZi*Ie=3zd2n= zGEkga+=om$*3REGy7o?+f3IXa?!riNRuw@DSVaz z1qzCxw|FM}4~JJ&vV7i_oou}eExjO0lDB3rk`ODq@Li#!yxK8Ii0p}37WD;DDuB6Q z=?uR9TD{S&Iq5)#*JKwAnqaUFtxEJEo;ofhHb+B9Ki8aw%)at*W7<%q73-JWXsB`p z#pj1b6+z4D$G8)A^x4@FklMr?KCEt%i-eE zcVK_j@3>~XO@e_;9wSON!9!VWnuz1eW`1XW?6N&X2Xse7zMk$N4kjE)}KILd+K&CQuMuEB0t^mp`6^A(Va=5m`$2>GdZ~lKxfW(6_?!?n4EF|`W`ddOALzTP< z(~a&?K~+!9ms}&MPfnwG$yd`F2a}wtPw7=z0aW>;Fj8X~cfgsuJ7zbb)X>{rN*G(| zN1AF5Eh`kWZa)u?cyV`wx8ly$vM4S}ZbE|B0%@!|_HvCXr|L7B+X5z{k%+xD`q?p1 z&8T3VW%SqOp?75iy%)_qtqV;-K&&2?C^s-Lt`EAg>y4+Eq9Xv7lG>W?HkGBYkoBaK z=|D8qsXG`ojk_2HQnbq_rmCBsk_F40hVk*?t48JHB?ikjlI=mKs+jTio!`)eS1=Wm zDS)JDi)(sL$Snh~6ljMB{<4v<(_P$~;lr(|(8+c0k9*L2k3Npg@bKeUJD~zBqK-;f zZHZD+RDtR@xor`cj8I3mXbWxLqQaiIN9yat@U#000005j1VO zn=#m600022fq98IdyeJ`000007x`Sx)(Etf&u4f>4U!R86ouf3Lq2`H+X2QZamSn} zt?lXx<2TXM9f@?lwLH*&m-j==ZAqo^pkd9fQTzN(_l4=x8pTz+iUO{3#cpLRw;2khK03n;h_5N{|ypV#Dm5^Tz~-Bggbc zJKe;1J`G&j(a);x7^nt68Pgz|UD~9Qa=J8_mS_`lW^cR)v}Id#@0P%rwFG|N-o%G# zqX7^a{h=hA#v9Ul)9Lb;H8&AuLShMXMl&Vu%AHY0SVd~Z5|P=~!vh5U^ilMs)EjVv z-V^=0Zy_0nK7xB3&$n6}*6#Zcy)z@Q^8)^Jy#vzVQq6Bptzzjy+~0^1<}DLqy==0A=!^$O%%2;ISyQpbV|ueOAX+Yw0CMI&1C{;_QM^|Be; zp_2WHHWd*l>J6Pi#rb!!nMszw=slf7+~CX}4d*o@hoM`uWRDMR2;NUI_u=hRCfUAI zo^m5wq<@22I`jhfwEeh|Vf@m6wPbK5!t8L{1^RdVA{#)|wZMc3?eByld8h%ztu)Y~|+Ms)E^3NOdY~Wq*In7suhQ_;uoeb6nTIC)lblZ$>GE@g z7kt4%{pM2#xbBBvT|ew+meY%Wy%g@A&B~PlWP2J#NOAD$I%2f5f|EH9W=Y~b5bx%g zV+g8Lfo&sy2~S%jhV8=W34uea7u%BXg)Zh?jyPaB{>Y<+ERj9|-m(M6d~*yLre>9bFFjf(a0mOsH}zU+MKF>Bf(c~|0I`L8`R zP0%uvTZLzH7MmnA;4TUdLX0(^`}k>$9@zJ|Q~7ZcT4uObDqP4JFEkNH6@G>C zcz?(pEFE2(lCdvg{n+(x0H24Mly?QuF-=aAz}G1h&}u(Mfe-^)yY!%Q^8PBkbjAb! zNLkC0aQbWCXID~J3kc#C(DCrY>uvN{ofAa}Vo9)cKUW7e@za(u+a~;%>pjVg`MYG! z(QL^Keda!|AD>)V6vypQBvwa%lArC(W}laI2UfAHJR7uqJ%>bQ0dAel6s1(a|0tI>W z+UOUP9G4^}Dq(IJ7Vnm+mf!)*U;0Vj0<7uY2U>061(!%;z!2^s3XsOkx*==i7Zpc|GU+9qvu+&O}g9u8hz7v?tcg22_HIjCH+(5s#&= z9uuee-4OGlw;fEf#6EGE|3~E`%kH(E>4m_(!5zeW(IZ-QnHaYQg3mGlEEe)=UC?Dz zxBqa3L?pIaka}okPGi0AXhjU@t-@N{W`D2c(bb|3XTbGd(cA`3q6d>rXV!Gh6QQ|2Qr}UQ2O&zk;g1L{_pR1zPJLfwl56QUHIUUO!Rk z>p?jf0000T9t?1dbxKSbVD4P30>Pd~d^R8Ahl-IL`GmAv*;@@tYqG(;4^kuHDY(xc zZpYt_O^-8(Z4A$z=^nU90L0~gA0!r=wUlMP7svTjG$`*M*gMTzOSgcy1Q8yjCwCg> zSonbt?Ib&^4$L;}G0nH8qn0+pB%;Fyce+$)k`n##`74mJk0EMh)hHM>lW#3(rUef; zVE0IEYwrq!JO4ifMA2konG7oCA#+^HghN;ejhI?Rax`B1t^n|{1f7crnhMP79v=uS3i6EKYd`3b z>~9uD7`n_{cDNzg>e(dhn>l2z1R-Z=RYY1O$L9x)xZNbmQ_cbOXRf2t-|7HE2xet~ z3m=Qq%a)|(2tKZT@8ezWyr*J>B>=5?3dW-jU^Xb=vLaR_5THw;k@eiT^aYP?~rqr zVn|fc=9cH1wfK{0#l+u;Z;lY)m9a`ggeQ%U`UNd|#Q-%@J7rwu;FVM>`Z2bQZxN2^ z2nZ>f?P~AuzKVQ+eeML}-=m0?e0@bgu9%-}E@`vJ1S)O^31sly2E()nvg+AzoE8!W z8#5~<*p@`J)!NxR=p3&Q@-96t@cgV~&T*p+lgm*^PWUrqW?BWQFp!M3y#u;95eT)) z{pg`Ib1oXO&&L{*Dl+E`XMHC3<|){-{k%LBt_B|Uwgn%3t@HEc60D&l-5|=1L%r7C>fga z-F9>JS}ht}MoDj{AUS4kkyuH8+7e$7R7_AOuFL=jpS5W)h|7oQ)F(vMjow2|(f&Ix zwjp?1>w)VO)IbXQGBN0lVC^e;1!Q+`XC)UeEoM$D&q``$rrlu~--pATwJ?1w(5*Yx z6)LFJ_{6tQCKP4Ys}_mF=JmU&WYP1ol}+-o$Wa)Ya*p7T3mYs)`p6aRYISxmztz^; zddHGmekf9(&1W{s6Ys@43d`O$7oD5x>gf$Xn*uDh59Mbuvhit#JuBhmstWK;AZAE{63rr#~mCc;r%;1r&Qw{5B>)<4eAmKRKgXnj5Cx{ z=D*FYV+`!c;Ybx*=Z7YuBe6RNL|Pq85Y}R@@z&z{q1YO$W8(cixJqBn-(~qUug%Oe zzyJUMGcvj9R(R^OkDsZqp0|k~jsvBWxs|NQ$(48(^z>MxFZmEefn2qUbhQ?A%kkS` z8GPVceicDaXcO5cP z&GJE0XkO|1`8vO|s|=#!S}dygz4jPQ*CSU?7ED^%l9)o420)m zx*zSbBSt50x)47^Nj?T1EAv$?4fi38eIK=onsT#S_}0IZ2S+6OJ7frrp}zLA4@&M< z_b^fZKuc@{Js+MEJ_?9JixG2%zBx%#dI@ih% zF#Y`}s`+$zrXnY`I0lC2oCC%Xabxet#QC-^mSvO1Uf4W0s}AxWQhfPLk3>!oMr*W8 z={bx@ifCg>ya~2sVJAyYcC}4~=cH%MV&WYQo9PuJxAf*EG;e~JZYlP7W`KL-?B3n7 z_RpDt%T@yqX3&w;r_Jn0dRAWdHnxfd|YTP^Qr*DLeJGMEaJbg7q#VfZBs6&)C`im{2#^gJas zDS9`cJsWsdFqw?)JAVrRMndG04{&v19{|^FII={Sb;kJ!aY1@E1YhWzjA7!C1<5@)6~zxG@dI-TirAwI6ki*W!*t9 z<=Dm1|4aep1Q8E3NqYjCHl7XnzFc!^mHl0t1&2R{%fBAFO%ARpk~G)eawGPn5e(un$8_qyk=eR!N-S0HZXFiFxX=8O!8M$7T+5DN!W&Go3Q z1VjtQctqZ9YYT9$vaX-wgeh}~Bpp*&<0(N)u+YxvHEN@C$?B;u^#|Dxoe?@7s42Xl zA@HvZ_-ElizhdhC{cXbAZjo#nMtw6Naf64lqwxK1u$Mr*+qAC_EAd-At2WVsjJIJ4 z7`Bp5NM-&IrU4@&(poi_=B z(e0!V*PwWNUyH8#=~>K926<0DW^x<7vw;+@%lyLCoVCh*1?Up$(*N#5BQ*L%?I%HT z5^HYy2sHS{Xo6LpH{W)8?F)l}5ma0O;iA)xX#IIlTv-#MZVF#6ZEh2;0QlXq$!Dw0 zj;opJZm>tYJT9PP$r{qQQc$`ltz2;(pxr_+Xn3uU4BwKW6TFW6f!pbjP|^pPGNXWf zZ9sh%yvv?CEY^!t?Wu9upKBImUZk}v8BMR*|43t3%-LEUvl@}QuF`;dg>^9z5a5n{ zF1wo>F~PUbZ&}#FowiP)4LnY+T#OPPr6^8KI zcxJ975#tG@Wl~theJZT;HzTVWdH{p7#8lpZ1b`w%?oeM?^K1C=hSIGcc#&Zjpsjzb z_eOp^#%n$B=hY#=-_c5v9vc7v008vxWS&j+z~Hg~GCus43M}V8F6;$d0H`@ix_hzW zJ)8l~`@L<)0zivH*lwonm)p%tm(Ne#6p<0?(>+nHD<0n3>`0(Yu(iDn(m$$c2aXY& zvQ00$!iC(R)-iv@b7IRy$GMXK#l#NR?6HN|I)~kv%75Vgeebr@yx&;aw_5RbryGUd zT7)cbak)bePAN~x*$DA4!gqnL>447OHuALJyUUo=H40!Jv9Axk$Kx6N!!X zBr6#q6vRgxuCHjhm-5=E*F0E_Pg+-KMP`uB4mZF1ch}gW-%D#MilGJxEDqu-1poj5 z00jLTcA4TV95}y5*((*zc1WQa=3^+sm&p${(hCk`6f(VEVL`0nyrvd2j1aLIg^_~? zSAuHCTGWpJ%Z~$?`4XvXZI9# zu;83|F%SNL_k_t^o|nL+6*4Z^#;UZ?fqBGD#N3%=6kU_?YQo)Vlg7i#MXGDa^Eq_Q z-tbLSy@A6L<+^lw>nGOV!;&Klmv1VBklVm<_{J!d0000000IJyyHWMJ(C`fLYhD2G z^Gh}sFl~}NR9VNa(bVL8Zp|Jcp%aoH%zt^%I_hBSCpb=FF2d4qRIe$MopLU{xFShg^bI+;mqjCPDzk~~eE_9qO=IY4QY5!52AA+u^uT~# zuH746VTK!jwPOcMR|f6OIT!+66=zD}w2sBGhrQjt(Ba3oYF_+>)g`V9{X?bp11+_b zaB6zPc>T`RchZh>Vn(Rc7$~V%W0#IeP1Ya93HgCh!+qrmD)Cpqe97JDcu2Uhv-dLF zT}Lcy*q-PIoQu{Y7pV+O;rUZ_ux6Ob@3)S=cAgtz#FGmPA|e^VnR-G~;wgx) z#}7>()~ZP6Rra6v1_2a%fW7IvUzQuN>VNI-keTXX?q%d>lX9!w{Yi{on;D-2GBVYK z8vc?Q*D^Fz^H+8?V@(m9U2A#Dio>hi$!`}&TL5Fhml2%1==a!(2qn z0UoF6D9ZdB6z`vUdrSH#hE58_4P?0$UF{n`)!c0je(+h1H4X{Zg(Zh?s^b_UMI-@D zE}9Wv)J%Eg)3xIx8!&qT@LTS!j@TP5Ua^bL62cbUWCAdG=_EiXU;4 zQ*fCi;bV`NNU%=&`AiTcE^P&B&wt#NSY0Ak!y!(1`$)=FXCJHGr1tX~PC_PSIhE(8j*x`13>;t5swH*DIn9X=9e-9>UcBS(XVV zxlBi!{124w-xeys_1sJ63>`-&%#y2w-C?Ro|tu7CR-Q`05p zQ}-|rt+@9{2phuY|KT!0(&uzEX(D>wqS74P*0M+3s1xrL6Yn@}3e@@=?wxmqUB4Y{ z%{HY-y(0cWOba|K`d}3say#T2CN^PNd-7s~h>GPz@;z}Q`#tnP`yu_{>fBuYdh?!k z;uHSW2C>%zJTJc(0<#VdPtyDXwWym?w2A?<+ZB!CZA?ot5vYV;_a4S_ikb(Cvzruu zToqVHz|p?rCH%guWZ6UZ6qaXfjE&ZR;t-){NJRzb7VSoTL7yGsFz61DuImrgD`Jpk zr4QA;r+Q8{LY*g!eBLt=%D}(Gp{Pkdh7ATR^>%n)BO)OdJ@lw5XEQ~TLMW&itK23A4_;6H7MH$7_v)%iN;;)*TvEm3HOS;lb_`HKS zU0+ZjN7q4BhT0~v>f$~X!&1Zgt$yG;gXrWy9ng=41c{;vOffu5zmlia0<}Gm4zU?c1uiT= zn&k1NO0%1|`7Jd3!jvJ$&?3y37#=zE;+$5J+;fFW_Q*R4|+bv)e zOI=7uFTlnfXX|I}BJA#G<9coO0uIJFZ>u!-Q3qgsRm)oMbOwlywvQEQDnVu(KRqA1 z4nU1Pw$&xrKyT;RhGWtL7t4X zVtr<9mje!cr(gkWzVRS!sd}GP*xa^6+F5dsx2J{F*vwqP$3?JD$Fl1#y?&G$U7<1n zv+4DC*F);Ze{m__8Yg)~@)gJ~whX|1x|XR^vw9WhohuoKY`5`>Q`F46B+?C0v$+tBG{R$p2P^9Z|L)E=bQb~D zu=TEiUHIS*N-4B2#%gnVT=w!9M#a=FFefT-99mK%=WWBI`{N`BKsekCVdjar9o%_0006ejk`?o6|G$McY#dV)qbPgGPLna zM^<`E=$S~~daa*mK_zz=Abyzjl%ATxIgE?%Kr>y1up^P748N*oy4zFsbh)r4DjTvj z)OXNihq#f_1bgvgY^K| znp7i)$>6*J#}d*tcP&A5vR`~LoWjtY#A^R*C~~57CR6?428g(-*Z|R+c?p&Utmn(c zNbJWXIKA)^R=V);J++1S9xfcC{pMEp3D^>5M{22t_)vJ8WcLZ(V6*4Hi&Bl40y5%? z_E-~Z)q{;%8tWVIYAO{sfTUDx49&>9)H+)oKJ4V8+yJ?sYoH|4aGC4X_TLXV@VwI& zR;nFKq`Po1>CVGin?4If0S}izI!orYE#a=*RvT;iUXXXbZ-&W=abr@x!8Clu+(>>Yg$(sRPe9jaTAko!RlDp7PWltn< zP7g7DBBcAOd)GWV%rx*;HBU|41!S>iR;-R>(E*?9#r&_%jMe_$jaLdk zv)?hXsb;aR%aH=mwJjrc3tKod?$wQ!rlW^K_)LKyI@=u+dY*RsF#M6<-~jqGgrY6CagI6rVHn&jA0_{RtjD zYMiHzzb3B@vp2P^8GNbqKqYGTX}TgYs&ntarXq2^VK6}M5#8h0EL<{U9opce*4)Yc zKzI`fi_Hk%RNWsgYZE}>E9PcS7^c5`uK8V$MiK=}BjElDK2faP#_nGC`_KyUjzM7e zo}>>A``|N%0MaL)0tHUk0O!5!1)^9j{tt~gT?^Y+OL7c3LiSg_25K1hbt-%KtT}h~ z5Q!Att2^Q#Odq4mKqrsANQPe6NDC$CCGZm=FBuF)_%!CJovs;4ruAb8k(umAmXNo@#DFtI0MWr_(yG$~j!@w(b5D!?gx97np@XeiGjKKYjWjnDsZs&WM5`Ej9>FTQ_C4H`n%|8UciN3p4bsLRt%In$V2i!yv&aWwKg4a3dM zF__)3&r0_$WHUmoM?A{{4sY&oYyczHjXR~}*VQ^BoQFg55zRtIU4X1#-*ha{!`7KK z%CaY}_*%wMOwvq=TJD_j2uaWGAi{91wQ$d&BjgLU%64xQ%M}*$Vq5wY|DtIW4KShk z-eB|I%}_VRCQDj+x>&(0n?Zkc66w2G>u23iER0GWYzkfvcy6ON#X;Z(S{YJLC-3rn zT3jGADTV`_6C$D1S<{V=U?x7o$fy3`dM^kqn>p<{ICR(R ztz>9t?EBt$HM3k!zUQt#4Nq}s%h5ybk#42nGQ%BtHKCPn}2A)dIbuC6k`a7m49 zr}wR$K3cMvX!}=RfJ;xGr5~g1adw3%V9*}b(PN47g##$rQ||K!&`C;ABMIJr@*DwU zh%_vJKjWCy5^(3?`=$OQdnx}?!Z_TP?hW)a=}K6`1n9f74tl*$m;~4d%ZGS5%QP(? zZ?G(tif+ibB|E2ox*lVR=@go@>xQ$?v!_`01i^hUc?+iKsa;5EU5sxUjRz$=ds zOCvx|QIlTx(T;1+50_DHVFjEApcj5pxI}r4l{gF_v&uVTF<9yM*uI8-6)!E6GE!~h z6;(}z|4^u;#W#O9pD)|%=Fxi(koS6)ab45&=rj(97~QP_H`LSO)b7LNUSAd!5j6bOoqC*;$P6B-UzL1vfgvU)=|hVT)~nHaUI3OFUW zqueKa!z2-BB4lSvdfI9NA&_^YPRkW!JNt5!R6RnhJ@Q?bK0S-C#fBS4=-gP+qDeLr zF9v<^nHaH-?0(3gsrKB)1F-d3N+moo1K?E&*BRq?sQ8mgi+Htc-ezO$qzS)?9sIQ= zj2U5Ygh=%U&NNrOYtll`f(W-of7?gkBgvm2w?;hh#+wH{y=?l=S7umq$0%oZd`3T@ z|4SoT+QM8y2&EQdpygn7UMT|psb%mpI{EkUFU6u>|6HxJXXL?P(MbrS)9dz|N5aqH zG?m&YUoDtQw)evzcQy}6Qw&S@0+yqx5(T2i;NSZ2KZDSJc`h8qns6%G_DMas?Qfvl z%!yxD$LHW(7IMf2dKz8kvPghwf)WX`zgWDjx#c3;p)t2~;bL9fZmt)?ZhHeS$b3d7 zP6A3`8^dQm1XiulQY}KOaT~=LEu-W!_Wx?hMenW}4f;@UV7Un`+UVNfvEgfb-w*)# zDEHTA3J8TNJh*>wgTn~J3VjCM!twxEj4>PY%&TepPW^`8pzcM))3Mhk` zXvZo`Vq2S13n| z7;VnnqA%&tmw4#9@nC}P7R zv1yy#MCe*iVm1T_oD=3pN?IvgxhC zO;Q#!92DLy{BW!ybzUeuf@LP&rH1K|g%ez;0+T@-jf>(mBK`5u%8+I9*8V)lk+|k& zh|R-3hFUJ`%0Ou4@L>p&dlZ>lp9+!l`Mkf!(e|9ymrW6yJLMe+j0W!aW$I70Pv>_g zCLwU%TUQot{dT_k`o4?fKK+Ms8NUpKq|=b`-Ear^W1470vUP^jTkc0|;xFcRG3;Mr zuN0MdF#g@NYlw0Z+@Anub4dgk#$S=n-b<_?-pZ?Vx!^W+zkx+)AT?g{6e~zik?H(HHz+u+r>Rr-PrW6rLYSx5s8%#cl?>;583 z=gD*=9&Y6%ki0mO(}pMzjr)!kbB}YLus{B}uo<_qKz%`VD&V|xjj!v78&FTZcc^(L0c)iw z%!T9L4FkHuRS^W?*(PY#P4L_Ca3nj3R+gOzlT4cFT7Djvdmkc9_f8OuUA&EtOA*$c z#@8sRM4Ji+PrbTh(vB9cb6s0abepVIPjWdxZU1nYAb%`wscmGPLwIKX; z5(>5`fC_>GPAE4T!HexBO`vthIC%BH8@U*bG$ z3l@3NGk_|`h@k?u=HHjQ?sf-A&ATc;mdxT$jB|-^n`!UQP7+JvK8=Y^wqe_9C@G)} zr20UB<A+ZmMNK8i`U1DyuxM<)#rb0m09%mHAi5?97pIMtgq4v(a9=}0>l zIYXrGH&)4+LfAY>#!kBioR33%K1C?YZn(4z9(X@SmR>r%1?uA*pm*QY0P=g#@EVa+ zoq|Ms^^BxSTT8%KT^{U2xROEjvnm0wp2wDe%2-2sI~lv_U9}l;gL?@s0!m1CDw}q# z6uQ{tu<+XR=h;K#>2OTjz%Qii_Thy^7suqHo=;W<6dvcS7-aYxnxv3Ip3G9ZclGhNF!HB%?f zB}$zU2;6Ch(^&rkr3a3XgZ=ei;$6SLDYt&1s?*aFKg;#} zdxX>=2&T=y(-hKFiB1iQ_N;0VhV?sQm2NfEO^6?o-mr?UBtXO9O2& z>$;xmkUZ&Spu36;qxVUU25;5v`M_8qcj7S_+qDk9v|kBR0tRiH;o03==r~Y_DRm*gIB#4#OC~ddGS)W$h zJ6G;8x6QzU8dqV*_w+#nw>VzEB;$~gKTR#bXx2Jxqf;-|IiuEp0IN7TS3Dwkst#NK zT-Mo|NveESYrbov$Rg*g6So%dVp1+!JiagW;Rd@GM;uLUc`S9Tk~Fux4PCS^>sJj5Xzbn%d;^Oc2`nr1MC+hY}I zmv|f4Ii%H<;d-er5+1~nE}HPa*TO_bX&Y6cr}no|2YZW0?j@7#g^B}kLs@>|?he`f z15wuInO|Dn$yh7TBw07{BS?^9)- z+1azp!}(49+nOSzgq6Wu`AjX>8V8mi6(*eIZ(UR=efOBU|8yD9#~@+PAb@bkFE+F@ zc;46|WkpC_k}(QI6|vxm$~KIn>(h~KFDJ@G}aA@bM z@a>tu?h~l8EFgB4^Bj3&tgah-h=!39$eBI6m;?=ojK75i$A-m|J#H0yd}+uhZ}Bal z8J{soJiWNVcmV;LKdbObV0Lrun4{p>cC7j=frv6e#@qCX>e$AN-`Ql zlg40Cw}IR5P_Gd3k{d<^=09RI!6_H!%7^HUNN(drqc3sOF|(!9J_~lIx)2I|^rZ;c zsVxfgDA8-V?AG5FtIZVH5?Jb%l!y0&`|lP6Ew+D{e1Hr3*`nR<1|}CxUa!gb>u)fE zK@lVbjSq7NXPuCIEtsNt`MY@d@iq%$x)Bd9H0b$sMHrt?#M-*@$x`YOZh75}XD!y= z=2+wvK~71~y*EOA>8U^Lt?!jiD6Rk;7F!AV1`d%{wTcIX9mIpsntod1Ib$A=j`uF0 zSab$vvachcVEB$WE*H&#Gh|iRp~lEz3&5eVzFqKENNTj>{t<=E1^)gYRI&u?wgIw2 zdk$L_@or7FX9B8W70t+$Dmf9F@0x@ot7pyvI@Kj>kR8c&2t zhlSL$&cG3uzMnm_wh8J6YbX@|s|()PuRM|eT`$6~YQdsqPB#TB=ExR#qOD}ceGi3C zVlFqmPO`XY*>^>lP)7DSAzf)tbHxr$gz0|SkYm~~VUtY3AY*iTB;?X=I!mC`z9A6b z@Zu4BXkg2L4if5#bIU209qfo;bfHp9rzBlZGmDUE;$F#Df=htfko9hXo}0*jCzjCg zvzh?R%D$KTgOvDaB9c?2>4kHRl$#@b8CO0_%Xmz*9xsB5y%Zh}TVcLecHLNrHvg~3 zH080g@4lpE#JgD+g{2zg;`d7@-t1>=AXIn_|94ENmdgmP_=k9uZ&`heTrVdo{5wT& z;ry4PG~~!3IUQcGhZ>QF>&IFM7pF`9eubths{V}8g}+s1q4Fy$Rr$Ho`kzM%l18Uy_&Bp}PZUCoXX!zdFF+Wu!Q zOn^I5V9$OTSTKkG_mzO$Yv;n<*c8DyIg!ICJ;BFv1E&S;1{8Cjz6V$Wc0|5k>oz;1 zLJ)g%JG*Yvue|%y=`1gMtghSTs$)mBdOwi5*RR#}2+?0}t*ZlsRIEFHyHlD3)_jD- zQf`1-?lSP;9P0d;a*o!q#8(KX@H=j{rd37kfq4?u%2J>sHz^zVNK5%9_g`p`{)l=bATMK8vw`LaXyvFhJIsMxTH^A2|HGFR&nhlOY^fw5|t+g zav3vXfjDazE$9%g{MDfpEeV^MtIO}_xoTum{txv(UNY|ZX2wmY6F(L3U}p}K#$Qdj zq+UUYGrvR#doXbu3yypJUu3s}LJASi6^MwqgzWP@g~AU3%%Dt$b)$h@G7X-RnJ;OP zY|Q8E5QTH>gJTQFf-pN@$3$vFA1@>q{%vw~B8HtKlafknJg`%PhOMe|(2tAHVcVq* zqJO4qvEU~N&JoGRYYd+ZMmgN7tvlkc^o#sVssUcqoj?`m_BX7u^L$^MXK3gQ5Us2k z$k!8dWW-Q;6C4i#Ew%`Vk9gMEfB*n3GP&t1PBF(hG)p|YcX~R3#v5;rH{8O|Dt)L< z)eMTKN#bO70(4>keH?<+5WStqF_@BQ`!sr$cp+XWe_CMXl#~KT5Y25U@(emOF__L( zg3VIeg)aFTglY|xqFzx4j-cd9O`YSz!?ZZla%!Q~IXI-W^Ft?quZ9<^OMWskfU@2^ z|BxiNwK2z=?(qJ!%j#|S(t#s6PAh&@Kma}WcJ z$D%fyb4eb8r^-Exl51!09q~UNdM^2Td_djg%#x;{RkX$wz+5W?1=SO$Oqs>2@0J2? zcwmz#j66Y@(ayR2vG#DzjO#0QY9nmoIF3Fb`zqyH_eok|0JQ<8Ff>*SHYigdSpskJ z4jyBU2SKa|NTA9ie#%M13%86MZge*WAnqY9pxxvP>5VjgVKp{X_3^v?k&4qxQG5-g z>tX55+qE@QNEym6{o;s}G5?R1f^R%??47W-q5!a>*L%k)RACFU12&UtHz8#7;)m)D z*Xj;X+&*;UCo>snTt67KvSn!0T>gWL+-#Q$>*&l8t=ISH?CC`8aS+~^d|w$=W|f0L zE5r*K4|a3Wf1i|KOSmK*_DDVZh1jt~QUCN7yhsk$eqXRfVP?)Dsg_M;Ot6}>ngH0H z70H;hK&8SqZfxMzjz1YO!E(jFu<1{OZ?pZxF(^0BGg2vcCzrAGWQLkhlf4d{aVO8|xowlX`&GJQU8{hZaT{q3JvdDo_8axhbA zDYu5o_`tgzwgA@#<}=4RUN7CH_`i#~6E8AahKIN1Pwm$43dy=#jk3k}{qa#OZ1r1! zHIfJ{Y}N)xqZJ~sb z0XB^X7;cv=u%etR^0cArDTs~zZ!TwB3q1*aL7U}xWHA4O@ ze5k@C7Nw|{mW%d8F$0S1-*2RLF$MQI6M7*uH&NKKr~gWLz%rGcr0XeYT$JSMIEAV7 zp*Hf7g#VvbEp%& zg->Lb=Y}OBUU<xA=Mp#qi}d>+OMQNlS1=LU~L! zDozRg+ewSA(@qP*I!L$PjmWNEIaGdRFqY%jCN?NjbJxjzvM?#POkG?PK$q96&1soq zOYd8@4{ADo(ws?@D_t#*6hd^!SwC2(8?Z?5y>crGG4GM6FmCO<>j16oe{ z`LVw@^RItO#OtvIRm_W4RA2AD{e@Z)w&EZ_U-1YbY4=lZ-n)G44`0vj)a-Jb32dazb|hH_TNa463`id4)#<>Isiz8~LnB}e8%I}?oEwMjY`Y3?d|s4A-vaK`k`a~OMLJk;py zVA_!&(`??xxG2`{R2xiuVj9q`EOl3WRF22xObWi77-}9#?fY>duMQ^v=CdT z-woqqi*=x%kNXfoO_9IgiGTHv;R|sg#A?S-BM+6%k12z)i zf2zmA5C8xG1^!n(9@A8w@yGxG00000AuaVq00015WpmNvHhr*cI)CTp+fgEinWzBL z()3#mp+9h6(k|kA=^S89EWn>?@fC)OaTVx+#1J#0g}_yq-R$RhY#v5nIH#akit1hX zt%0+*+478Pt4z>BX)qdcaJOW9-xF%50gjdnkz#S@$@Gs#i-d28L7gQT)JQ<8b>atZ zC5RVH9eE%ytZv8^0W*8jd~}CtLvQ$6CjbBd000P@Htk2&>y-KJ;Bx9^LAhfeG(0nI z&Zvi=00000000a8ul0ba(52>0>Hq$u7yrox|MEe7J?^(B2BRJF!V@B^HbUS2a?!dL z+lm;@5K-xFqb~k80Bv}mRS>VzmpgO&il}Zl#?DW%cj2W}fXx*-H;Kq}`qAen#&5~F zd&^8n5Z|1c5y{)f>==`UY_uo@DAD&hDva)+i9te`#TJ?q~VX z!jk*~8kyvWs1F`c1Yr`4ot;|i5%^kt1flePBR0Al#lmaq1y(6 z%si1Lx=(S|fzUFEcpI1wqF^S5*zgrRP*e5nhFa43@WCA~uw_UgCQkgI>?}Ai7ADkQ zQUWu9GXHzlEx&nHYf5EM&1o?5PS>42bo%ek+f!N%Tq?gDlNg3uweG{u0TH)>NG!w0 z%}?90ebS6>y5g?j<14_M%jpyeA|m%~mT<18lcwR*q?Ee-?>HY#^#swSYPy zZrxG%6BVa&0U^F8Ypz3L9rm+d$8%`PU@>#rkH8F_9k-GEMAqm-x{t)tm)8i7 zkz>NUV#XFd-NJ6Hbygk9E}C*)-~bFc`_l}kY;J#C)G84v#Ph~l@)YIY&CdPvH5au8 zj}(d}vkr7;sp-In$O*bvfogU@TPa|CQPt~f4;Dk5=ZWlvG{Z#-ej$+mg{Q*FJdA>( z7$>?6{i*uxzl@XOd!?uUL`e;ZWNVW#9ICRLsRRJ9!lc#iGZ!kU8*|?IUT!#5cxK5f zvLw$0{Qp;>7Ive$)0h5gZmrmLo0gq={1^I`CfGIk^Dh8RD$DnUY&m z<2IgSZVssxewAu|7S(ntgU_6MIt>X0QR$!704??qu&F1tK86SvU&Jh&fK&YeR9;** z0NKYwT-+}5Q9;wVL>``XugBzoviUW{UGp<^KXN*rKY=(7CM@T6i=F>ZSn$Co+4?$9 zV-ef$}H(p1Ns_y zQ#`((8-go!1`c{&9ty^?$`PGYhsH5AoplUC6Z-2=%g-nYGAo0#XxS>`8e!bDnYDYc z^r}l0ADN9qWiRk1r?_?m24^ zZDQe28Qn$G2h{jJRt@<2vM7=<(`t=x@?bYo6+5g}M1RLnPxtm6aq7}&11+g|E>q}o zlCn-2elgF4&;I8_H+EuODDU?f>&Uu;52IA0p41;z=yg+BW)Lt0APVe^3<=*=eh>DBRp@aGK_+A9J|75IqVD zA7KZta&{ii$=MKQGUOZBWum>m2C#I7cCC+BL>%}|RHNolO*=BDbn&t#WTuiqnSb08 z(1S^8Te&gZG#5elfJ<+JMUZR;-7%H}3rb6rZH36ZmJy^m5a%@=RA?vj@n@i9L6&o8}D-dPIQA|pJ3UWhbpFeLMsCgt0v zW9>$0Z=cLl3uvs*TsX!ibYmj<*Gh*(fOC1(+Q;NEhjSD-guiKaK}xzh$3s|d@Xpu~`YNxh)ksS6o zeE4;j)Se@+-g`QbD&{*DB=nZS{-fCc&TT?@X%ph+L)Pi+^$ETAP1EldWwO7(BdI#T zXPw@;`IsoN)ChrJDkJ9(Pr>Xbal6xz(R@siUwkc=EbW^>G;S@KMtR{A6e+KIZC5`N z+hC0&-I*}&1P9WkxxER(!lW)Vh6VA^Qb-WIB0(tSI_%-bYXaX z(Dyc?P8ie8q#r&lY03)Hp3`fJZo?y9)-tX~)CtJumZ$sbxjgZsSnr+L;mr3-?3||% z!zNH@B9$&68x=haV15s6n(ZN>`p~}g9T1VZYv?q9&|F7K03bL(vd zxV4(1lLe2g#$=jw~yz zDUUA_d^Q@H1HA8e(ZJ9ZAjm$Ix0~6Lj7K3)%xtduB)ST?SU`u3L`k%fNNw#Z`*VMl z!VRad=k@gwp%@Rq(sZvT>NTm8QuY(+G&%hOaPq*ksWD$4^?b8B&oDejAHDvvCiX_# zF#Jkx$fKslZFuRP?)rioJf*g({t@UM0dVyYV5M5hI!RAw0UzNlwbT;2B5JalG~*ZM z)c|gbW7;@()QZ4UPkYWy3VU!^4&Wc>rZNaF(hDV(X; z@HgvGLGt6oT%SqM_8J75x9Gr;g{VIB`FOaDMHbB4e)YZL4X3(bN}x~Ql~rGVbf6gE zb9TwV#4zvk3Qh7J&sbPN;Z&qwD%)SGR=$9MqS6Nn=ZEFd6y1i*$Se!87^qm&A%QBt zUm@`mD7^nEx zkwYB6+DVmA!qc?{Do{p&!sfo-@OlKo>t`}invytq^?~8RnF2Q&SU~d6Q)Im8!PQEB z**nX+2npBFB>*+l4+$)7yQ8e1F(9mYKIzb9b~SJ)euuCE=F6S13+%rJ|g|OH)+4q zgxQutuRV6h#+zzJmt|QuS$&_1(XY2XbJSFbxI&PuWliMJKnm7s!>C<~1-XKv=*JMC zo?N2MQNLWv8^QVz6sECrA8*mgEf*`^Ig@B(wB-L=?7EI|K2@Zl-2j?tLnw|WxEn&S zRx=9IAH(%dLrr(gGBe+tVNez;TJU>D1l7}uK9_H=K9}Mg2!~8IEql9kq#liDJ3M1y zy^l_AFV))J5pI9DkL__qaz0JCSXG<@ zR#|8`#9v;77*pfK%OYuZ5B?AB1cncTF5pSWu<4`_xXa?mF#4+SV0=>f5agN-3H)Nw z=2Xf4^siJQj9+@BzV77AdPkTP|X30Cr7&&Ng?Y6_cl&{_K9*h8`*-*k&Q? zfXm1(MTwZKUe=28fxWntSLg!QEz=eWKc&$(0-X;2;g4wSI1i)PKz@?jxXTh1#@6BG zk3`Aq$8e6{6IHq@k9l95q?{cnGuo^YzC~9N^mcjaLPRhQ!@7;_TN))xWNECj zI{y^Cz_bz}8ecT)vsmVh$pDY>gEz;*w2y74Npd@__(x_)Hr1C-v!-C}xJZLY=Jl6z zI2{6Zr13?0z`O9+h}O;NIpigGwhoVxv?}Q-;4{J?=@>90=1Q1UC;nxJHYGZT5W3Kj zaT5Nn%0tx^jK~lfIk3YBUvg-QOi*9$Z%nACFHtENw0I$Qo#bFz;@M%Gs8cmIqs1IV ze%z`-(6q2&EZTqycJtt9N%^AWb8?zJ+W~oyoYg1D4C7=CXJri3quoD{nBUmyf{#9o zI%bNrO&Cm79W%9w{8eFZk8uv1IR49tXGBmrZFYWl#kSy}?f`SWh^++trS4;b`57Ug zlxMjV=F0Of^K~}{hF#DjE=J6uv{@{zRvOt4E*Q;6m@lr&+GGjkHpBe}OD3xtQ34k| zC6B}uMzhf=MW>-X{72;ak56Fj!)kB;0YUO*wvVBm#>#J-o_@r74gyUxeZXew;2|5a zlJJL5LBZqP5#V5`hE`YOsqChko-k+MNrXyY6tmRiiO-T~V;5jg?Oec@tju;P0O#Q# zU7@QwNAW-wHGM0)hOo80KE<20#Kn2x9{q$_98y%>7d;JI64r!T{-_!qOU>3m>XYG@ zOTR6X#0v~@Ro9;ou^jWEYmFt18H0b)UO-#+`mwXvHxMy>nz7$>dNGPfDYl4}6lrH7 z)Lei84~6>k-mR9IOEfWzc;P0ai+&ilCh;@qNZRgsHa|!`G_|v7DL7lkL0X)rCJ(Bq zwhI@&GPL06|e@sSI&Rn z;O7w}$=zgqFq^y*Qop*-F@sEaqG1Y)7#^QnOCtL#>9?mE>ot|Ach#)F^SOcqw9U4y zJjRntXw=`qeh!gFLt5r(m_AAD0h-%Aaysn@J!D!9pW6YMeGWkT@9KV?(UfbQQbjDo zE~BC)&N%5NJzD)A+SoWWpuXW4`j0eT;#LxkHrr-f(v~#c0D{@!-PG5!7J_TMSb~5; zEx>Bx&dKFj#oOmYnXP{LIV-_i#l3rnc^HamS7~3mf;M#38k*VlB$1{Z zq{M(FOny2n6MOvs@b43p^;q zBC0hYmuJ}sN3yd&xP$YbsHWCVdnTd11a(}41Xhk23oq$_1TE(vY9GTy^NM!x>RE5` zbeeB9;;6RD+Fmbdd9}kP8n<6n@CMe$kQ-8v)3P~l4(Lq6Z(aJ&(svw(lVe&M9Su4P zTk2=+W9nR)5Z?_#9kP?iS!siT&kqG!1VBe^Y`vySpe;euISb z5&AFFa^G*YWN9-3pJ5Twv#~;%tUBqivwqXQ)vCE)A2M%UK`P1w=*g9^y)7BKR!qAB zY244B=K~2--nSVY%*^V^AKy%6Z$np+7Ueu@!UD-!)-0X^z+O-=!YhV(s>%jBDNu!` z2-tg=S0q*G=*BQo=Tysyb4It{e2DfUe?E|i3S)8m+NJV-xc~qKO4to06k>R)?`0L* zjQv9otYJj`j5ncYZ%f-HULXgWJL98Vlfd(jU?z`SCgo;$B`VDnUni7jqA%FK8$^*& zVp<*v6<34whNOh?_MS_Pnri&>>1+K{!rI=ZYbhk{R|=*UAUi_Wz=HvBN$S(5XUYe? z3^GWc9}3Iw>6`&)``B#?;MpFe6a1AdtY5j&2ZNmyR+qu5Gqtl1#RP?-z#L&XC+OkC z23Lcf1>k1D#yL12-U~bh^6(9wbjz%s{w7(oBa2YA1c##TZCvMr>a0C{kOYG7%9;Iv W*04Kb%96nb_W$mge}0K70002ok5!id diff --git a/content/manuals/desktop/images/build-ui-history.webp b/content/manuals/desktop/images/build-ui-history.webp deleted file mode 100644 index 4b2ac628c91af1150fcd18bb874c23d0afce193c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72828 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≫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 K%s9u17H|NU{=%vN diff --git a/content/manuals/desktop/images/build-ui-manage-builders.webp b/content/manuals/desktop/images/build-ui-manage-builders.webp deleted file mode 100644 index 29f86e56305ca25fbbf57130379d1560706ffc40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94052 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ϓ?9;*u8YD?+f80)1BH37!X?EGg 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

;_iZ(`kt|5(FMtAB7dly}rtI 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

PK_UQCZl=@{a%3@aL)eSh)~A^iGbI^qqMv? z>u@j)S)X$eCSJ?ytS@-W-n)*%f}wA}A+5$A(=X%#P$PUEChx zgQJC<$hZZ#Y6VC(raIeAGO&9lt&;jL=#*$c03?EOuqmIua342_t=|*!F2Eo3|C!DJ zTmS%|it34e-yMMZF8}}ywFcfF6&teI|LmZ~|5=GMN+SaR5W;z<>cz(Ykk|)jx0h#f zn~{B>9F|VPyhJsgM%)=q22Sp?B55h%UjF|pM1AyjS%%lt3W!2K`L7}C=mtikUx3zA zboW7GF)l+HDtq}OvYAw(jFx|Z5ZTVCQO7AiLx}w{S!)nfT*AiR5ifbW0w`2X1~Pyo2WF5e;X{@W9f z`r$v$+yAS9;t|3Kd^v>)umDPXdX(*Z1+%-S@oLDui2hr}ZF1g^wQ}KucnkzokTZ~; z-;;XMfi~wGJVc;l>EG_^E`**dzZN^L zb!zpl`ziXbt8j>mj43-gRGLj z&1MpVAV}-MQhQgH7JHPX5!$_Scq%p|XeknA**prQ04$jluT<>m^=e}E#X3BRqcA)V z2Vs!?_vQiJ=+0)uhD-{S2NvKYVaI6)1-99?do-50Q4r)18R{FKBs@;2ZI6 zXkl&~35e3dFb=Fn`lyT)pZsoaPCV|h?hca)Zdl_S%J;~Eg^`TY5V0O(s%IVXH18M^ z$8F)Pfw<5FV(iS$B5a3abY=i+GPC!n3QUHn;|u)~-7{3=j#!oN!QR&Rd8Y_`Xv!?T zHil6{ggeA&m}CpJ%3|kh<4{CwPY{vHcZ)~FUPCWOW_Z}Ts}TF|{g^}A+8d5Mcso%K zTpwbQgjIE6>x~@$1Q7D{LcN&8_U?VG+GOeDt9_Ol3~$LNiz#m>%wwmlGgUNfSEv{o zg0d{^5n4>=YbkQg!p~y$I?VkMPhTAc)7=p?LLk13v(fArVP2b%>n;piiE3O zlyc5$`UUCVsW6*Cih`@#FcEA~sRnMcr8@70z*!3z^19MYOs!>#IE zVPNC!<|A`!N0wc%>*=5|CTmnxQGo;rv3bbLoMSX zaL8r{6xl?y9BBmaS+i7deg=5+#fxa?HG;TRG)nV9tMc7L;d{=oGL2s~3`5$@O~wOK zT?t{I4z1!__9z*HvX+nO_06!uLsZss*4I?+u^SdjIJzcEcnAkAWD>Rmm~T;)dQO8(}8N5>HMF zZ%S7ja;(H*|LgGmr}gI#_hD#xnKH#zUb;&yXehN+L#Ri5)M-ur5(8dw3oL?SbB6(h zQwsmLJFvn@BN7mh3Hq1p?tw64UF<#OP^(hUHrw$Gr&^d_gzFJYGatoEPuT2e+U2HTcpig2@E!P zQF6d{%tbo%286=iq*9>P=nFBRr)2$Cy?nL*=}L*mglero`VMX-pquSmq70F7;r1I) zV967hzY1fYL229Kwwcj8c~e(t!y29lVXrhV;Ji6m6OXGhDq2mTZ$cgzYJA+pF1On~{F+Xv zvMNyOib4v84R!BWcFS&mrCK9JfoW*E6r))7{?lS~3FR7!(gOF!IWz#X4@`<_M`q&K z?LS92VSU^J$pRi!O_)6|UOjIAm=@zsQ5R5YtQSVpPO9k@zww5Kd_~OG$F>kWO$lr1 zabrO4y?C+{i0Hx}PG zB-ZB089-5Jl{97sO}qT&&_E}*PBz0w`^h#H?TlGE024*%tEl_S^J^{y{40odqP_a! z&Fwg)m3o-gXKw+HXn|Ql?qLuJ;GCL_nYElapeV*QQu6fvqEfj8z_?D{yH;Um6I?oD^gAH`DzxNn}Y`{z&|m zj4f@JwT2UF20mV0Am-_V!-6-YJ)s}n>}^-;i5{&a9eEWd;!{km^yisbw zs9-R_Mb#Aj1#nq#Mv;I+j2E}z>M9t0TQEmFwAx7AN+wXlZ=km}7+X_v-A;IK0#&>@ zp3O-`YfeIafPC-zY3$V0hGz+5zH=!nXNkE*#8uzpyr}gpv{p8XYOu{r^=x?XONoOb z2VY3B#r8J}zHMeTtE3v^chw=KWM_`PHPtRQNpZk7;UQ?)CvVjJE}MJ0-r7n*zz#1W zy?@d{tVnYj|KAJ7l^Dng_gg4^rj0Df5Xf*%dOHgm`Z>{1!B?yQnak{^{h04F_Ie54y9iNo_9O6Zuhu;ElB&}pb3$wbBcc!{-@A(=ic_1yaC`z9*&)Drl%NaAnQ*i{xw>}*%yS3htm2#KBO6p*h-{279B#sl>uS?6q48%ctVsIP^ zr$NfR{H%M+bNqy=ta!F%rf=8u#$125pIQ6v#0Zjt3lsR68nqWb;wQ_B-*z4D|TX&#?Gp%3M1@@eE9A~(54)T56$XaVjrCtH7C47qR*i;EO@How=wDn1&*zYA z*PVr0^KP-HLFjxT7Y zU)M12jBjTxg2W)#`O_6?c)v*SCoyF#C@ETEa?51$(u?Ws2!XN#EG{nnfu0r?V?Tuw z@p5Q3*(*w--Gu2qv2@sv<+Wsq!E*lL@@=8go!)@GtqHR9p9eoX<;hF|mvTn!dle(n z-l)+5MJ-_kyeIMznrMyXMD!(^F0Yu5N*9N~8$jYBK6w869io?O7=|IduFkToq0cv~ z$LtoeO1FKy{AV*KHG7fS%L9N;)NlPRVs<5U>g4M|dn4#ID2{w1$H&q^0f zDD+(Ou~RJUCEjIZfr$zPaTs#)z-_jz5q_9zgisV~eRU{Ilw>r7t-WGKNd)fFCkwUM zjNE!G=9Q5(tD1?NB!IwM7=FTTth4 zqg1!n6?b4~?lV|b`x~H1u*g{lB;Ov^8Re5>qPM`h9Rb}G{aOVY%YZE+ zGP9mDjS9A^`p}=%$~>WLQhOLtBL7d69XCDdgL}9B%QJjJ(#;5~V@!=nG}>DIw5riK zwd^aUtZE`T;B>iLOG&?iYSmSA8t&4$6-ZRYnQRT>r!w4E-t_We{j0p)jGxTY) zFkqLHuPpDFXirMq^$q$oWy9|7)vGt7A#X5iKn8-3FFaQ;ffcxcpVEC9H92WSK5@|9 zFIkK1p#67PcP1!05+aTqCX|h|Xyn~C)D$7SAaNkK$wsBMiom3 zZ6?%)BwZm}a}X9k1ZIdt|GXMW$h!dpVSPfOmPX|qtv_CY>M7NFX5|V9boEns9@w8Q z-Q<2Mj+%yv-}Ixq+C6{9k-kwx7D?kgZr@XsC6W&Py2F6(*iyxz5=#YT+h3P1g7>9hZ zX~rdH`mm5cXLWIQ&CJGvb#{8q`qIL*Rl|=$=6xWWW}KKXE4Fn+?H+`L3g{L!z~Wp< zxu>H5OqWV^t_@Vz?AFTNYJBX1)83JpP&eDZ)o1*p0r~#~H4w`0yZx!W@65uja#|iF ztxT3?C1hFy6bOO@HnVm`_L2he6`pG3A5~Cu8uLoB`~Grfr=QYbT6E24!1a(c2hWJA zx|fFo4#p|>-rm)~PSR?pC5tXTMO9nnkO?e3OYDX!grWZ3+d<#Q++Tg6_OmKP`vo*3 z6zb9;rH#AQ(aq6-wUC;`#);?w^dZ8(AIR9%z6r;D?Mt`Wob(eK?3pNFhhy_!?xBJ9 z{G=f_@^?+osrFBmq~jFiMXdxgS3xqVt+lsqMOoF$=RKfw1RRFb2|xA{UzTo*x$_+M z6=19c*EhqulI}(bYN~!{@m27eu9;*q2K}&NYfvRtC~2xNaA6opMaV!JHOo4$&hZVD zb&3F~8!Ns9FsY6jUI@?<%GEqOhI>c04fwrbM_@=Cm3|WCNVbWeD%F}f9~p17+p!eb z`d2()VAVPdkb;z=4_T-oOHxVcDw(Pz(yQ@ntntG0b%F(Sr%)vw$yd3-;J|y9+v;5} zIh!)c@dP~6R=HPoA~Bx4^gqU;&>$h2khw!6)X@*_g~n^TH{>}w8q%awpYkkrrV{70 z9FGUTI|bYjV{L!Jx4vY;@^yP6n4PdhOYsk{8-d@%5=Fe5)gBopIZ`M4cLhc*XXA?V zGHYAq!w5aBQ!{cAV5d#ZNjILOVif|^yc0C%&v-Q?stlGDIxe^WRsXDIHsK@j_MVu1+{oqydS>Jac)B~rDkEi zCgSz7c`4H~l-{=VASJRiHy_Ljfexzm>B_w`MuaPzd>et0zE2zaYsR(C!{qo>4-@T_ zDZ&0_r=BZY_j{N|OF{$`ZtH@D!8lc@(NAXTuibX^nn0+V@<{$dn>tx%{|3NtA<0}g z2*1bJeR*#)77tt%`{mFdh-fo(OjE!1@Njg$yy*sm2 z!xdmf^alLX(q^>0x6#p86Obzg8M3+cw`0Uqj#5~7?=#z9(XJ83;_5LngM^yT`5g$1 z`3F%C%N3Lm{-#(9$~U0lO)?1`f@*ICfH4Rc5WALXd3(HShJ40qiOzrh_n+`3ldG+J z*ffs!_jz~)7c20Q5{#SRFP=oejlW*z{D|LIInY--}GeQ6rU zrWZJZOtHclCdnQjp_y245MZ#J(93beu0@U%5$01nCK{@-+@Gy2mX-2U#}kh4>$$wn zBY&0!b+;GwScPgLU%3r<{DvZv$KOo@|7jH4w zUMDf~f7|5-_;8#EEC+ThLdB$dCOSak@^r?ww)$CcEeaa?SM|!a%?U9MTW5&c-ir6MA8EI^WNJhPlhOl#Dc))iuHyiWAd7aQzmIIoE2s6?RD}WT{ z0Z;&qRVEER3-laO(_9ux{S~`&Z)j6_PtpVo{3)u{$v~f7IOiIwaEa~i=U?nF;ngcu zA0v|+mNB?!u^TEV=+I9VRfh7i%hRg_GN577kWBK6xyV!0{aGK^j`g*=K902F@&hiA z>f3sHuAss7jbk?2xx+CIi_qkGs2{QRjE{L5rv|BP2#%SLI$$F!asb zH2MXckwD$j*b(2qa z$6r`nAoJeIDk2S-{%p2XEI_;{|Hwz)Og0FwHq;+8E3g-urRa?4Llmp0Cw+tfH2J?{ zS()SLs`{D9CBVvfc*u@E|h) zTUpv4K~Fud{42=OpIu{*j?vPF2eHRq*=d-gJ@sQZI!-Jhn|wm15L# zm^qYC*$1A*>s;FKyjyhinDC^_#TD)KTP$!5BwlSTUSLkF!5q#j8RkAQu)N#vJXm)i zgcCm2qjC45xSDNNxW6Dm>WY7BNlp_4OT|RLkr_}TD>e9kkg~Cy*=*LIS`-8>`l%VO zrkNQVQwC-!_6`o}#KynueT@_F_@;fRrGOL+7x%#*G}ne##qxV-i!n2&#pHr{nQ0pc~?48Vh*sKQ}=I)fMsLF?>urg+S3y4EcHA!o^d!?R1mQ9zoE zw^chZjV{3H#&8du@yl4zldczC;hsmk@%*oPGt={(u^-t9pzU=7ZlJud9PILy*|wm> z%hFpkwdzJp&{zQh7SAQAdLPrHku29<^XY_xv(_0eU2N}U3ViJnjLPA0HfwX1yl4^U z>*a!?|I^lvQQ?9_vMEReGd%&9d5{Hlz{xYIRT|S2$c{uG$>!}YVI7hdK8)@tn3_aS z^5tiTtrZ`|>J2FSl8<`bkQtZJl#i#_SO)FZ;V^rL)HT!~->}lP{aSq8GAX1tWp*u2 zB~pEcSl;EqzcmD}n;Q|#PDHtcb%WM33)r#wTBGW?;xjMuIqH@%OftL92^ag9NI{_? z(E-i9s-dt#3K0}if1QsVvU62#i{)8_=U!I`&27C?)P8loIml8C4J%?L*+~ONwzTls zQ*Q20yu#ClQnB>3ov7}$#SRnns{xY5dk{1Q)$(JI?&NmJaEx=;DW0}_aiaR9K_+Wj z0l!Zvi!@H;K?nL+Z-*EUNKb+`1#k zQ0mz#c^sBV=7_C?SfBOUt6gPjU!iR4PeGKMb@cr-k+6P1mtQ|s@}&KbYeI`g4n{CG z%sLfKt(gr@@w>xn3_*)ZC#f5FIaC)n__XWq2*aWPF;gec5DS+4MA0IKqn>0e1TM7R zvi^p_l}HOPQx)(~dHE)eeOBh3D!AuXn#(YH(l`6#bnc>bU-AM-bSh(Fnz8!GM=z)G z(Kk-;=WhM8a$yv@ik8bIFrjFuIrCpL>WPMOc)LV!urYZTE`uvLJ$k_WjLwewTwd8n z@oc4#j?t{3B22M(U^uqSBYfj`4EMOI zsFxk^b_4SMhvxOiwe0Umbeywkk@2^kgZ1T-H(XO`ndJgbbsO!P$MFI`qyajJ&MRnJ zk&k)|&YUJfIxPv47_2%h-fX1&5gex8GF?H4Oqt~`-j{H@Sd7=P_wkiG?ilc2xxWIt zcV{vc6%GPkX}*^MaE|P_O31t8Ud?<&PAU(H=yX5A^{3!z9`~8P1(WzOVHelF$Rr~K z*TI&1JoABODR?&qz6OzQ$T|rFbD-Q^=lZ~dRQF)t^iP~ID`>pNdRn@&fJ@c1W!9in z=OhWLtU07l%%J{Pu{`8&m6qv-NjdHR73S1xKTm&%W1(_VAogCnFBKxij}= z*Zm&=;q(?e3e<_$znMC#Yo`b5y^YtxhyIoqFZup{XA_|*>+v0dD}V zU$C2UI&#ht^Xr9`>S}t##Q*9}!GTD&k{n}1ySr4V2G~IKjz91&qnQ#UhBVS~8+7lg zHsn8Q(!e%Cmb_iU9J2|YJdy~&Yh*kWiQCdHmTu_cQhhbaRmdhnAsZ>6ZueCy%e;GgQfsWMdb-(ci!QxUe*9%5#^0d$2s(|? zu}P>j(t()(SBy1vZ)E}nmK#~pTtF5|5{z`thp`W?>r_*mDc z&@?2@CUhK4%@mGUkNOnII!d->Xkr>4&nRM4v}~qDnbGySc(sN zA;^BEGFac^emYhr`WvBVNMBd|gfPk3h)fQqX*!41d z!E}hmGdW5(fB*mht+bhfbj_Qts`}stBWU#LnA5q-3k`OifA41}iYw_>fCpXvQ}gll%2+#l@CsbHurd?m9paTr;h6GLf-(DIWve~G5;oS0zl gY|CLTY;pHNeOqg<*~oUymk?Tr00V}+CL#_109WH(R{#J2 diff --git a/content/manuals/desktop/images/build-ui-platform-menu.webp b/content/manuals/desktop/images/build-ui-platform-menu.webp deleted file mode 100644 index 8242889503b02345884dfdecdca0236ba60ba5e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7272 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 diff --git a/content/manuals/desktop/images/build-ui-timing-chart.webp b/content/manuals/desktop/images/build-ui-timing-chart.webp deleted file mode 100644 index f0374088a693454971551cfe193b6c857d73c423..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40314 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 z000000000000000K@I=_00001nj8QC0000000000001Ay00000000000000000000 Db4IQe diff --git a/content/manuals/desktop/images/builds-view.webp b/content/manuals/desktop/images/builds-view.webp deleted file mode 100644 index 56b807d49b22f9237fe91e01277b48ff00ec49e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116750 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 MMQJk3B!)b{5}`K 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 diff --git a/content/manuals/desktop/use-desktop/_index.md b/content/manuals/desktop/use-desktop/_index.md index b7b309cf6b19..c2685690380c 100644 --- a/content/manuals/desktop/use-desktop/_index.md +++ b/content/manuals/desktop/use-desktop/_index.md @@ -10,32 +10,48 @@ aliases: When you open Docker Desktop, the Docker Desktop Dashboard displays. -![Docker Desktop Dashboard on Containers view](../images/dashboard.webp) +![Docker Desktop Dashboard on Containers view](../images/dashboard.png) -The **Containers** view provides a runtime view of all your containers and applications. It allows you to interact with containers and applications, and manage the lifecycle of your applications directly from your machine. This view also provides an intuitive interface to perform common actions to inspect, interact with, and manage your Docker objects including containers and Docker Compose-based applications. For more information, see [Explore running containers and applications](container.md). - -The **Images** view displays a list of your Docker images and allows you to run an image as a container, pull the latest version of an image from Docker Hub, and inspect images. It also displays a summary of image vulnerabilities. In addition, the **Images** view contains clean-up options to remove unwanted images from the disk to reclaim space. If you are logged in, you can also see the images you and your organization have shared on Docker Hub. For more information, see [Explore your images](images.md). - -The **Volumes** view displays a list of volumes and allows you to easily create and delete volumes and see which ones are being used. For more information, see [Explore volumes](volumes.md). - -The **Builds** view lets you inspect your build history and manage builders. By default, it displays a list of all your ongoing and completed builds. [Explore builds](builds.md). +It provides a centralized interface to manage your [containers](container.md), [images](images.md), [volumes](volumes.md), and [builds](builds.md). In addition, the Docker Desktop Dashboard lets you: +- Use [Ask Gordon](/manuals/desktop/features/gordon/_index.md), a personal AI assistant embedded in Docker Desktop and the Docker CLI. It's designed to streamline your workflow and help you make the most of the Docker ecosystem. - Navigate to the **Settings** menu to configure your Docker Desktop settings. Select the **Settings** icon in the Dashboard header. - Access the **Troubleshoot** menu to debug and perform restart operations. Select the **Troubleshoot** icon in the Dashboard header. - Be notified of new releases, installation progress updates, and more in the **Notifications center**. Select the bell icon in the bottom-right corner of the Docker Desktop Dashboard to access the notification center. - Access the **Learning center** from the Dashboard header. It helps you get started with quick in-app walkthroughs and provides other resources for learning about Docker. For a more detailed guide about getting started, see [Get started](/get-started/introduction/_index.md). -- Get to the [Docker Scout](../../scout/_index.md) dashboard. -- Check the status of Docker services. - Access [Docker Hub](/manuals/docker-hub/_index.md) to search, browse, pull, run, or view details of images. +- Get to the [Docker Scout](../../scout/_index.md) dashboard. +- Navigate to [Docker Extensions](/manuals/extensions/_index.md). + +## Docker terminal + +From the Docker Dashboard footer, you can use the integrated terminal directly within Docker Desktop. + +The integrated terminal: + +- Persists your session if you navigate to another + part of the Docker Desktop Dashboard and then return. +- Supports copy, paste, search, and clearing your session. + +#### Open the integrated terminal + +To open the integrated terminal, either: + +- Hover over your running container and under the **Actions** column, select the **Show container actions** + menu. From the drop-down menu, select **Open in terminal**. +- Or, select the **Terminal** icon located in the bottom-right corner, next to the version number. + +To use your external terminal, navigate to the **General** tab in **Settings** +and select the **System default** option under **Choose your terminal**. ## Quick search -From the Docker Desktop Dashboard you can use Quick Search, which is located in the Dashboard header, to search for: +Use Quick Search, which is located in the Docker Dashboard header, to search for: - Any container or Compose application on your local system. You can see an overview of associated environment variables or perform quick actions, such as start, stop, or delete. @@ -49,9 +65,9 @@ From the Docker Desktop Dashboard you can use Quick Search, which is located in ## The Docker menu -Docker Desktop also provides an easy-access tray icon that appears in the taskbar and is referred to as the Docker menu {{< inline-image src="../../assets/images/whale-x.svg" alt="whale menu" >}}. +Docker Desktop also includes a tray icon, referred to as the Docker menu {{< inline-image src="../../assets/images/whale-x.svg" alt="whale menu" >}} for quick access. -To display the Docker menu, select the {{< inline-image src="../../assets/images/whale-x.svg" alt="whale menu" >}} icon. It displays the following options: +Select the {{< inline-image src="../../assets/images/whale-x.svg" alt="whale menu" >}} icon in your taskbar to open options such as: - **Dashboard**. This takes you to the Docker Desktop Dashboard. - **Sign in/Sign up** diff --git a/content/manuals/desktop/use-desktop/builds.md b/content/manuals/desktop/use-desktop/builds.md index 24b17e952443..71c32fe35ebf 100644 --- a/content/manuals/desktop/use-desktop/builds.md +++ b/content/manuals/desktop/use-desktop/builds.md @@ -6,16 +6,9 @@ keywords: Docker Dashboard, manage, gui, dashboard, builders, builds weight: 40 --- -![Builds view in Docker Desktop](../images/builds-view.webp) +The **Builds** view provides an interactive interface for inspecting build history, monitoring active builds, and managing builders directly in Docker Desktop. -The **Builds** view is a simple interface that lets you inspect your build -history and manage builders using Docker Desktop. - -Opening the **Builds** view in Docker Desktop displays a list of completed builds. -By default, the list is sorted by date, showing the most recent builds at the top. -You can switch to **Active builds** to view any ongoing builds. - -![Build UI screenshot active builds](../images/build-ui-active-builds.webp) +By default, the **Build history** tab displays a list of completed builds, sorted by date (newest first). Switch to the **Active builds** tab to view ongoing builds. If you're connected to a cloud builder through [Docker Build Cloud](../../build-cloud/_index.md), the Builds view also lists any active or completed cloud builds by other team members @@ -23,16 +16,12 @@ connected to the same cloud builder. ## Show build list -Select the **Builds** view in the Docker Desktop Dashboard to open the build list. +Open the **Builds** view from the Docker Dashboard to access: -The build list shows your completed and ongoing builds. The **Build history** -tab shows completed historical builds, and from here you can inspect the build -logs, dependencies, traces, and more. The **Active builds** tab shows builds -that are currently running. +- **Build history**: Completed builds with access to logs, dependencies, traces, and more +- **Active builds**: Builds currently in progress -The list shows builds for your active, running builders. It doesn't list builds -for inactive builders: builders that you've removed from your system, or -builders that have been stopped. +Only builds from active, running builders are listed. Builds from removed or stopped builders are not shown. ### Builder settings @@ -47,7 +36,9 @@ Docker Desktop settings. The **Import builds** button lets you import build records for builds by other people, or builds in a CI environment. When you've imported a build record, it gives you full access to the logs, traces, and other data for that build, -directly in Docker Desktop. The [build summary](/manuals/build/ci/github-actions/build-summary.md) +directly in Docker Desktop. + +The [build summary](/manuals/build/ci/github-actions/build-summary.md) for the `docker/build-push-action` and `docker/bake-action` GitHub Actions includes a link to download the build records, for inspecting CI jobs with Docker Desktop. @@ -63,8 +54,6 @@ If you're inspecting a multi-platform build, the drop-down menu in the top-right of this tab lets you filter the information down to a specific platform: -![Platform filter](../images/build-ui-platform-menu.webp?w=400) - The **Source details** section shows information about the frontend [frontend](/manuals/build/buildkit/frontend.md) and, if available, the source code repository used for the build. @@ -79,8 +68,6 @@ showing a breakdown of the build execution from various angles. - **Cache usage** shows the extent to which build operations were cached. - **Parallel execution** shows how much of the build execution time was spent running steps in parallel. -![Build timing charts](../images/build-ui-timing-chart.webp) - The chart colors and legend keys describe the different build operations. Build operations are defined as follows: @@ -168,8 +155,6 @@ If the build failed, an **Error** tab displays instead of the **Source** tab. The error message is inlined in the Dockerfile source, indicating where the failure happened and why. -![Build error displayed inline in the Dockerfile](../images/build-ui-error.webp) - ### Build logs The **Logs** tab displays the build logs. @@ -193,20 +178,16 @@ helping you identify patterns and shifts in build operations over time. For instance, significant spikes in build duration or a high number of cache misses could signal opportunities for optimizing the Dockerfile. -![Build history chart](../images/build-ui-history.webp) - You can navigate to and inspect a related build by selecting it in the chart, or using the **Past builds** list below the chart. ## Manage builders -The **Builder settings** view in the Docker Desktop settings lets you: +The **Builder** tab in **Settings** lets you: - Inspect the state and configuration of active builders - Start and stop a builder - Delete build history - Add or remove builders (or connect and disconnect, in the case of cloud builders) -![Builder settings drop-down](../images/build-ui-manage-builders.webp) - For more information about managing builders, see [Change settings](/manuals/desktop/settings-and-maintenance/settings.md#builders) diff --git a/content/manuals/desktop/use-desktop/container.md b/content/manuals/desktop/use-desktop/container.md index 40e3350cf64b..830d30f6f231 100644 --- a/content/manuals/desktop/use-desktop/container.md +++ b/content/manuals/desktop/use-desktop/container.md @@ -6,20 +6,20 @@ linkTitle: Containers weight: 10 --- -The **Containers** view lists all your running containers and applications. You must have running or stopped containers and applications to see them listed. +The **Containers** view lists all running and stopped containers and applications. It provides a clean interface to manage the lifecycle of your containers, interact with running applications, and inspect Docker objects—including Docker Compose apps. ## Container actions -Use the **Search** field to search for any specific container. +Use the **Search** field to find a specific container by name. -From the **Containers** view you can perform the following actions: -- Pause/Resume -- Stop/Start/Restart +From the **Containers** view you can: +- Start, stop, pause, resume, or restart containers - View image packages and CVEs -- Delete +- Delete containers - Open the application in VS code - Open the port exposed by the container in a browser -- Copy docker run. This lets you share container run details or modify certain parameters. +- Copy the `docker run` command for reuse or modification +- Use [Docker Debug](#execdebug) ## Resource usage @@ -31,7 +31,7 @@ When you [inspect a container](#inspect-a-container), the **Stats** tab displays You can obtain detailed information about the container when you select it. -From here, you can use the quick action buttons to perform various actions such as pause, resume, start or stop, or explore the **Logs**, **Inspect**, **Bind mounts**, **Exec**, **Files**, and **Stats** tabs. +From here, you can use the quick action buttons to perform various actions such as pause, resume, start or stop, or explore the **Logs**, **Inspect**, **Bind mounts**, **Debug**, **Files**, and **Stats** tabs. ### Logs @@ -53,40 +53,18 @@ Select **Logs** to see logs from the container. You can also: Select **Inspect** to view low-level information about the container. It displays the local path, version number of the image, SHA-256, port mapping, and other details. -### Integrated terminal +### Exec/Debug -From the **Exec** tab, you can use the integrated terminal, on a running -container, directly within Docker Desktop. You are able to quickly run commands -within your container so you can understand its current state or debug when -something goes wrong. +If you have not enabled Docker Debug in settings, the **Exec** tab displays. It lets you quickly run commands within your running container. -Using the integrated terminal is the same as running one of the following commands: +Using the **Exec** tab is the same as running one of the following commands: - `docker exec -it /bin/sh` - `docker exec -it cmd.exe` when accessing Windows containers -- `docker debug ` when using debug mode -The integrated terminal: +For more details, see the [`docker exec` CLI reference](/reference/cli/docker/exec/). -- Persists your session and **Debug mode** setting if you navigate to another - part of the Docker Desktop Dashboard and then return. -- Supports copy, paste, search, and clearing your session. -- When not using debug mode, it automatically detects the default user for a - running container from the image's Dockerfile. If no user is specified, or - you're using debug mode, it defaults to `root`. - -#### Open the integrated terminal - -To open the integrated terminal, either: - -- Hover over your running container and under the **Actions** column, select the **Show container actions** - menu. From the drop-down menu, select **Open in terminal**. -- Or, select the container and then select the **Exec** tab. - -To use your external terminal, navigate to the **General** tab in **Settings** -and select the **System default** option under **Choose your terminal**. - -#### Open the integrated terminal in debug mode +If you have enabled Docker Debug in settings, or toggled on **Debug mode** to the right of the tab options, the **Debug** tab displays. Debug mode requires a [Pro, Team, or Business subscription](/subscription/details/). Debug mode has several advantages, such as: @@ -95,7 +73,7 @@ Debug mode requires a [Pro, Team, or Business subscription](/subscription/detail - The ability to access containers that don't have a shell, for example, slim or distroless containers. -To open the integrated terminal in debug mode: +To use debug mode: 1. Sign in to Docker Desktop with an account that has a Pro, Team, or Business subscription. @@ -103,11 +81,9 @@ To open the integrated terminal in debug mode: - Hover over your running container and under the **Actions** column, select the **Show container actions** menu. From the drop-down menu, select **Use Docker Debug**. - - Or, select the container and then select the **Debug** tab. If the - **Debug** tab isn't visible, select the **Exec** tab and then enable the - **Debug mode** setting. + - Or, select the container and then select the **Debug** tab. -To use debug mode by default when accessing the integrated terminal, navigate to +To use debug mode by default, navigate to the **General** tab in **Settings** and select the **Enable Docker Debug by default** option. diff --git a/content/manuals/desktop/use-desktop/images.md b/content/manuals/desktop/use-desktop/images.md index c44b7b477d8f..b99038c6d25f 100644 --- a/content/manuals/desktop/use-desktop/images.md +++ b/content/manuals/desktop/use-desktop/images.md @@ -6,6 +6,9 @@ linkTitle: Images weight: 20 --- + +The **Images** view displays a list of your Docker images and allows you to run an image as a container, pull the latest version of an image from Docker Hub, and inspect images. It also displays a summary of image vulnerabilities. In addition, the **Images** view contains clean-up options to remove unwanted images from the disk to reclaim space. If you are logged in, you can also see the images you and your organization have shared on Docker Hub. For more information, see [Explore your images](images.md). + The **Images** view lets you manage Docker images without having to use the CLI. By default, it displays a list of all Docker images on your local disk. You can also view Hub images once you have signed in to Docker Hub. This allows you to collaborate with your team and manage your images directly through Docker Desktop. @@ -87,10 +90,10 @@ To remove individual images, select the bin icon. The **Images** view also allows you to manage and interact with images in Docker Hub repositories. By default, when you go to **Images** in Docker Desktop, you see a list of images that exist in your local image store. -The **Local** and **Hub repositories** tabs near the top toggles between viewing images in your local image store, +The **Local** and **Docker Hub repositories** tabs near the top toggles between viewing images in your local image store, and images in remote Docker Hub repositories that you have access to. -Switching to the **Hub repositories** tab prompts you to sign in to your Docker Hub account, if you're not already signed in. +Switching to the **Docker Hub repositories** tab prompts you to sign in to your Docker Hub account, if you're not already signed in. When signed in, it shows you a list of images in Docker Hub organizations and repositories that you have access to. Select an organization from the drop-down to view a list of repositories for that organization. diff --git a/content/manuals/desktop/use-desktop/pause.md b/content/manuals/desktop/use-desktop/pause.md index 2bfdc9d6c28b..e7b882097f0b 100644 --- a/content/manuals/desktop/use-desktop/pause.md +++ b/content/manuals/desktop/use-desktop/pause.md @@ -5,13 +5,12 @@ title: Pause Docker Desktop weight: 60 --- -When Docker Desktop is paused, the Linux VM running Docker Engine is paused, the current state of all your containers are saved in memory, and all processes are frozen. This reduces the CPU and memory usage and helps you retain a longer battery life on your laptop. +Pausing Docker Desktop temporarily suspends the Linux VM running Docker Engine. This saves the current state of all containers in memory and freezes all running processes, significantly reducing CPU and memory usage which is helpful for conserving battery on laptops. -You can manually pause Docker Desktop by selecting the Docker menu {{< inline-image src="../images/whale-x.svg" alt="whale menu" >}} and then **Pause**. To manually resume Docker Desktop, select the **Resume** option in the Docker menu, or run any Docker CLI command. +To pause Docker Desktop, select the **Pause** icon to the left of the footer in the Docker Dashboard. To manually resume Docker Desktop, select the **Resume** option in the Docker menu, or run any Docker CLI command. When you manually pause Docker Desktop, a paused status displays on the Docker menu and on the Docker Desktop Dashboard. You can still access the **Settings** and the **Troubleshoot** menu. > [!TIP] > -> The Resource Saver feature, available in Docker Desktop version 4.24 and later, is enabled by default and provides better -> CPU and memory savings than the manual Pause feature. See [here](resource-saver.md) for more info. +> The Resource Saver feature is enabled by default and provides better CPU and memory savings than the manual Pause feature. See [Resource Saver mode](resource-saver.md) for more info. diff --git a/content/manuals/desktop/use-desktop/resource-saver.md b/content/manuals/desktop/use-desktop/resource-saver.md index 4b14ec6dd2c3..10162288b357 100644 --- a/content/manuals/desktop/use-desktop/resource-saver.md +++ b/content/manuals/desktop/use-desktop/resource-saver.md @@ -6,7 +6,7 @@ linkTitle: Resource Saver mode weight: 50 --- -Resource Saver is a new feature available in Docker Desktop version 4.24 and later. It significantly reduces Docker +Resource Saver mode significantly reduces Docker Desktop's CPU and memory utilization on the host by 2 GBs or more, by automatically stopping the Docker Desktop Linux VM when no containers are running for a period of time. The default time is set to 5 minutes, but this can be adjusted to suit your needs. @@ -15,7 +15,7 @@ With Resource Saver mode, Docker Desktop uses minimal system resources when it's allowing you to save battery life on your laptop and improve your multi-tasking experience. -## How to configure Resource Saver +## Configure Resource Saver Resource Saver is enabled by default but can be disabled by navigating to the **Resources** tab, in **Settings**. You can also configure the idle timer as shown below. @@ -74,10 +74,3 @@ users enable WSL's `autoMemoryReclaim` feature as described in the [Docker Desktop WSL docs](/manuals/desktop/features/wsl/_index.md). Finally, since Docker Desktop does not stop the Linux VM on WSL, exit from Resource Saver mode is immediate (there's no exit delay). - -## Feedback - -To give feedback or report any bugs you may find, create an issue on the appropriate Docker Desktop GitHub repository: - -- [for-mac](https://github.com/docker/for-mac) -- [for-win](https://github.com/docker/for-win) diff --git a/content/manuals/desktop/use-desktop/volumes.md b/content/manuals/desktop/use-desktop/volumes.md index 7c504802d655..1486ff4f8dbf 100644 --- a/content/manuals/desktop/use-desktop/volumes.md +++ b/content/manuals/desktop/use-desktop/volumes.md @@ -6,10 +6,7 @@ linkTitle: Volumes weight: 30 --- -The **Volumes** view in Docker Desktop Dashboard lets you create, delete, and perform -other actions on your [volumes](/manuals/engine/storage/volumes.md). You can also see -which volumes are being used as well as inspect the files and folders in your -volumes. +The **Volumes** view in Docker Desktop lets you create, inspect, delete, clone, empty, export, and import [Docker volumes](/manuals/engine/storage/volumes.md). You can also browse files and folders in volumes and see which containers are using them. ## View your volumes diff --git a/data/redirects.yml b/data/redirects.yml index cae91bfb671d..be2a57af96fd 100644 --- a/data/redirects.yml +++ b/data/redirects.yml @@ -263,7 +263,7 @@ # Docker Debug "/reference/cli/docker/debug/": - /go/debug-cli/ -"/desktop/use-desktop/container/#integrated-terminal": +"/desktop/use-desktop/container/#debug": - /go/debug-gui/ # Docker Desktop - volumes cloud backup From 4a3f007a11c70f026e6986374f31df972de47619 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Tue, 8 Apr 2025 15:03:41 +0100 Subject: [PATCH 277/699] dmr-enable (#22385) ## Description https://dockercommunity.slack.com/archives/G0M5L8HKM/p1744114085379989?thread_ts=1744113337.599399&cid=G0M5L8HKM ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/desktop/features/gordon/_index.md | 12 ++++++++---- content/manuals/desktop/features/model-runner.md | 10 +++++++++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/content/manuals/desktop/features/gordon/_index.md b/content/manuals/desktop/features/gordon/_index.md index ec5ebcc3c62c..1ee9d3ad6484 100644 --- a/content/manuals/desktop/features/gordon/_index.md +++ b/content/manuals/desktop/features/gordon/_index.md @@ -102,15 +102,19 @@ Ask Gordon is not enabled by default. To enable the feature: After signing in to your Docker Account, enable the Docker AI feature: -1. Open the **Settings** view in Docker Desktop. -2. Navigate to **Features in development**. -3. Check the **Enable Docker AI** checkbox. +1. Navigate to the **Features in development** tab in settings. +2. Under the **Experimental features** tab, select **Access experimental features**. +3. Select **Apply and restart**. +4. Quit and reopen Docker Desktop to ensure the changes take effect. +5. Open the **Settings** view in Docker Desktop. +6. Navigate to **Features in development**. +7. From the **Beta** tab, check the **Enable Docker AI** checkbox. The Docker AI terms of service agreement is displayed. You must agree to the terms before you can enable the feature. Review the terms and select **Accept and enable** to continue. -4. Select **Apply & restart**. +8. Select **Apply & restart**. ## Using Ask Gordon diff --git a/content/manuals/desktop/features/model-runner.md b/content/manuals/desktop/features/model-runner.md index a66cbe37d84c..daec14150b43 100644 --- a/content/manuals/desktop/features/model-runner.md +++ b/content/manuals/desktop/features/model-runner.md @@ -21,7 +21,15 @@ The Docker Model Runner plugin lets you: Models are pulled from Docker Hub the first time they're used and stored locally. They're loaded into memory only at runtime when a request is made, and unloaded when not in use to optimize resources. Since models can be large, the initial pull may take some time — but after that, they're cached locally for faster access. You can interact with the model using [OpenAI-compatible APIs](#what-api-endpoints-are-available). -Docker Model Runner is enabled by default in Docker Desktop. +## Enable Docker Model Runner + +1. Navigate to the **Features in development** tab in settings. +2. Under the **Experimental features** tab, select **Access experimental features**. +3. Select **Apply and restart**. +4. Quit and reopen Docker Desktop to ensure the changes take effect. +5. Open the **Settings** view in Docker Desktop. +6. Navigate to **Features in development**. +7. From the **Beta** tab, check the **Enable Docker Model Runner** setting. ## Available commands From 902dcc0f13c5902e9468361ff6a061676dbc55f9 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Tue, 8 Apr 2025 16:08:01 +0100 Subject: [PATCH 278/699] ENGDOCS-2515b (#22378) ## Description Freshness to uninstall, feedback, settings, back-up pages ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- .../manuals/desktop/images/notifications.svg | 1 - .../backup-and-restore.md | 37 ++-- .../settings-and-maintenance/settings.md | 33 ++-- .../troubleshoot-and-support/feedback.md | 7 +- content/manuals/desktop/uninstall.md | 175 +++++++++++------- 5 files changed, 146 insertions(+), 107 deletions(-) delete mode 100644 content/manuals/desktop/images/notifications.svg diff --git a/content/manuals/desktop/images/notifications.svg b/content/manuals/desktop/images/notifications.svg deleted file mode 100644 index 45a9e4904f39..000000000000 --- a/content/manuals/desktop/images/notifications.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/content/manuals/desktop/settings-and-maintenance/backup-and-restore.md b/content/manuals/desktop/settings-and-maintenance/backup-and-restore.md index bec9b9f232b4..4ada95b5fda3 100644 --- a/content/manuals/desktop/settings-and-maintenance/backup-and-restore.md +++ b/content/manuals/desktop/settings-and-maintenance/backup-and-restore.md @@ -1,5 +1,6 @@ --- title: How to back up and restore your Docker Desktop data +linkTitle: Backup and restore data keywords: Docker Desktop, backup, restore, migration, reinstall, containers, images, volumes weight: 20 @@ -7,8 +8,7 @@ aliases: - /desktop/backup-and-restore/ --- -Use the following procedure to save and restore your images and container data. This is useful if you want to reset your VM disk or to move your Docker environment to a new -computer, for example. +Use this procedure to back up and restore your images and container data. This is useful if you want to reset your VM disk or to move your Docker environment to a new computer. > [!IMPORTANT] > @@ -18,12 +18,10 @@ computer, for example. 1. Commit your containers to an image with [`docker container commit`](/reference/cli/docker/container/commit.md). - Committing a container stores the container filesystem changes and some of the - container's configuration, for example labels and environment-variables, as a local image. Be aware that environment variables may contain sensitive - information such as passwords or proxy-authentication, so care should be taken - when pushing the resulting image to a registry. + Committing a container stores filesystem changes and some container configurations, such as labels and environment variables, as a local image. Be aware that environment variables may contain sensitive + information such as passwords or proxy-authentication, so take care when pushing the resulting image to a registry. - Also note that filesystem changes in volume that are attached to the + Also note that filesystem changes in a volume that are attached to the container are not included in the image, and must be backed up separately. If you used a [named volume](/manuals/engine/storage/_index.md#more-details-about-mount-types) to store container data, such as databases, refer to the [back up, restore, or migrate data volumes](/manuals/engine/storage/volumes.md#back-up-restore-or-migrate-data-volumes) page in the storage section. @@ -31,24 +29,33 @@ computer, for example. 2. Use [`docker push`](/reference/cli/docker/image/push.md) to push any images you have built locally and want to keep to the [Docker Hub registry](/manuals/docker-hub/_index.md). - Make sure to configure the [repository's visibility as "private"](/manuals/docker-hub/repos/_index.md) - for images that should not be publicly accessible. + > [!TIP] + > + > [Set the repository visibility to private](/manuals/docker-hub/repos/_index.md) if your image includes sensitive content. Alternatively, use [`docker image save -o images.tar image1 [image2 ...]`](/reference/cli/docker/image/save.md) - to save any images you want to keep to a local tar file. + to save any images you want to keep to a local `.tar` file. After backing up your data, you can uninstall the current version of Docker Desktop and [install a different version](/manuals/desktop/release-notes.md) or reset Docker Desktop to factory defaults. ## Restore your data -1. Use [`docker pull`](/reference/cli/docker/image/pull.md) to restore images - you pushed to Docker Hub. +1. Load your images. - If you backed up your images to a local tar file, use [`docker image load -i images.tar`](/reference/cli/docker/image/load.md) - to restore previously saved images. + - If you pushed to Docker Hub: + + ```console + $ docker pull + ``` + + - If you saved a `.tar` file: + + ```console + $ docker image load -i images.tar + ``` 2. Re-create your containers if needed, using [`docker run`](/reference/cli/docker/container/run.md), or [Docker Compose](/manuals/compose/_index.md). -Refer to the [backup, restore, or migrate data volumes](/manuals/engine/storage/volumes.md#back-up-restore-or-migrate-data-volumes) page in the storage section to restore volume data. +To restore volume data, refer to [backup, restore, or migrate data volumes](/manuals/engine/storage/volumes.md#back-up-restore-or-migrate-data-volumes). diff --git a/content/manuals/desktop/settings-and-maintenance/settings.md b/content/manuals/desktop/settings-and-maintenance/settings.md index d3fb8530d746..662d07d83df9 100644 --- a/content/manuals/desktop/settings-and-maintenance/settings.md +++ b/content/manuals/desktop/settings-and-maintenance/settings.md @@ -34,6 +34,8 @@ On the **General** tab, you can configure when to start Docker and specify other - **Choose theme for Docker Desktop**. Choose whether you want to apply a **Light** or **Dark** theme to Docker Desktop. Alternatively you can set Docker Desktop to **Use system settings**. +- **Configure shell completions**. Automatically edits your shell configuration and gives you word completion for commands, flags, and Docker objects (such as container and volume names) when you hit `` as you type into your terminal. For more information, see [Completion](/manuals/engine/cli/completion.md). + - **Choose container terminal**. Determines which terminal is launched when opening the terminal from a container. If you choose the integrated terminal, you can run commands in a running container straight from the Docker Desktop Dashboard. For more information, see [Explore containers](/manuals/desktop/use-desktop/container.md). @@ -44,6 +46,12 @@ If you choose the integrated terminal, you can run commands in a running contain - {{< badge color=blue text="Mac only" >}}**Include VM in Time Machine backups**. Select to back up the Docker Desktop virtual machine. This option is turned off by default. +- **Use containerd for pulling and storing images**. + Turns on the containerd image store. + This brings new features like faster container startup performance by lazy-pulling images, + and the ability to run Wasm applications with Docker. + For more information, see [containerd image store](/manuals/desktop/features/containerd.md). + - {{< badge color=blue text="Windows only" >}}**Expose daemon on tcp://localhost:2375 without TLS**. Check this option to enable legacy clients to connect to the Docker daemon. You must use this option with caution as exposing the daemon without TLS can result in remote code @@ -54,12 +62,6 @@ If you choose the integrated terminal, you can run commands in a running contain - {{< badge color=blue text="Windows only" >}}**Add the `*.docker.internal` names to the host's `/etc/hosts` file (Password required)**. Lets you resolve `*.docker.internal` DNS names from both the host and your containers. -- **Use containerd for pulling and storing images**. - Turns on the containerd image store. - This brings new features like faster container startup performance by lazy-pulling images, - and the ability to run Wasm applications with Docker. - For more information, see [containerd image store](/manuals/desktop/features/containerd.md). - - {{< badge color=blue text="Mac only" >}} **Choose Virtual Machine Manager (VMM)**. Choose the Virtual Machine Manager for creating and managing the Docker Desktop Linux VM. - Select **Docker VMM** for the latest and most performant Hypervisor/Virtual Machine Manager. This option is available only on Apple Silicon Macs running macOS 12.5 or later and is currently in Beta. > [!TIP] @@ -88,7 +90,7 @@ If you choose the integrated terminal, you can run commands in a running contain - **Show CLI hints**. Displays CLI hints and tips when running Docker commands in the CLI. This is turned on by default. To turn CLI hints on or off from the CLI, set `DOCKER_CLI_HINTS` to `true` or `false` respectively. -- **SBOM Indexing**. When this option is enabled, inspecting an image in Docker Desktop shows a **Start analysis** button that, when selected, analyzes the image with Docker Scout. +- **Enable Scout image analysis**. When this option is enabled, inspecting an image in Docker Desktop shows a **Start analysis** button that, when selected, analyzes the image with Docker Scout. - **Enable background SBOM indexing**. When this option is enabled, Docker Scout automatically analyzes images that you build or pull. @@ -128,7 +130,7 @@ Advanced settings are: - **Swap**. Configure swap file size as needed. The default is 1 GB. -- **Virtual disk limit**. Specify the maximum size of the disk image. +- **Disk usage limit**. Specify the maximum amount of disk space the engine can use. - **Disk image location**. Specify the location of the Linux volume where containers and images are stored. @@ -429,8 +431,6 @@ With Docker Desktop version 4.38 and later, you can choose your cluster provisio - **Kubeadm** creates a single-node cluster and the version is set by Docker Desktop. - **kind** creates a multi-node cluster and you can set the version and number of nodes. -Docker Desktop version 4.38 and later also lets you install the Kubernetes Dashboard within an existing Kubernetes cluster with the **Deploy the Kubernetes Dashboard into cluster** setting. It provides real-time visibility into workloads and nodes and helps you manage and monitor your Kubernetes clusters and applications easily. - Select **Show system containers (advanced)** to view internal containers when using Docker commands. @@ -499,12 +499,15 @@ For a list of current experimental features in the Docker CLI, see [Docker CLI E Use the **Notifications** tab to turn on or turn off notifications for the following events: - **Status updates on tasks and processes** +- **Recommendations from Docker** - **Docker announcements** - **Docker surveys** -By default, all notifications are turned on. You'll always receive error notifications and notifications about new Docker Desktop releases and updates. +By default, all general notifications are turned on. You'll always receive error notifications and notifications about new Docker Desktop releases and updates. + +You can also [configure notification settings for Docker Scout-related issues](/manuals/scout/explore/dashboard.md#notification-settings). -Notifications momentarily appear in the lower-right of the Docker Desktop Dashboard and then move to the **Notifications** drawer. To open the **Notifications** drawer, select {{< inline-image src="../images/notifications.svg" alt="notifications" >}}. +Notifications momentarily appear in the lower-right of the Docker Desktop Dashboard and then move to the **Notifications** drawer which can be accessed from the top-right of the Docker Desktop Dashboard. ## Advanced @@ -520,8 +523,8 @@ On Mac, you can reconfigure your initial installation settings on the **Advance ``` 3. Save and the close the file. Restart your shell to apply the changes to the PATH variable. -- **Enable default Docker socket (Requires password)**. Creates `/var/run/docker.sock` which some third party clients may use to communicate with Docker Desktop. For more information, see [permission requirements for macOS](/manuals/desktop/setup/install/mac-permission-requirements.md#installing-symlinks). +- **Allow the default Docker socket to be used (Requires password)**. Creates `/var/run/docker.sock` which some third party clients may use to communicate with Docker Desktop. For more information, see [permission requirements for macOS](/manuals/desktop/setup/install/mac-permission-requirements.md#installing-symlinks). -- **Enable privileged port mapping (Requires password)**. Starts the privileged helper process which binds the ports that are between 1 and 1024. For more information, see [permission requirements for macOS](/manuals/desktop/setup/install/mac-permission-requirements.md#binding-privileged-ports). +- **Allow privileged port mapping (Requires password)**. Starts the privileged helper process which binds the ports that are between 1 and 1024. For more information, see [permission requirements for macOS](/manuals/desktop/setup/install/mac-permission-requirements.md#binding-privileged-ports). - For more information on each configuration and use case, see [Permission requirements](/manuals/desktop/setup/install/mac-permission-requirements.md). +For more information on each configuration and use case, see [Permission requirements](/manuals/desktop/setup/install/mac-permission-requirements.md). diff --git a/content/manuals/desktop/troubleshoot-and-support/feedback.md b/content/manuals/desktop/troubleshoot-and-support/feedback.md index 3394c6de3949..6ab0af9cf893 100644 --- a/content/manuals/desktop/troubleshoot-and-support/feedback.md +++ b/content/manuals/desktop/troubleshoot-and-support/feedback.md @@ -12,7 +12,7 @@ There are many ways you can provide feedback on Docker Desktop or Docker Desktop ### In-product feedback -On each Docker Desktop Dashboard view, there is a **Give feedback** link. This sends you to a Google feedback form where you can share your feedback and ideas. +On each Docker Desktop Dashboard view, there is a **Give feedback** link. This opens a feedback form where you can share ideas directly with the Docker team. You can also use the `docker feedback` command to submit feedback directly from the command line. @@ -23,8 +23,7 @@ You can also use the `docker feedback` command to submit feedback directly from To get help from the community, review current user topics, join or start a discussion, sign in to the appropriate Docker forums: -- [Docker Desktop for Mac -forum](https://forums.docker.com/c/docker-for-mac) +- [Docker Desktop for Mac forum](https://forums.docker.com/c/docker-for-mac) - [Docker Desktop for Windows forum](https://forums.docker.com/c/docker-for-windows) - [Docker Desktop for Linux forum](https://forums.docker.com/c/docker-desktop-for-linux/60) @@ -36,7 +35,7 @@ GitHub](https://github.com/docker/for-mac/issues) - [Docker Desktop for Windows issues on GitHub](https://github.com/docker/for-win/issues) - [Docker Desktop for Linux issues on GitHub](https://github.com/docker/desktop-linux/issues) -- [Dev Environments issues on Github](https://github.com/docker/dev-environments/issues) +- [Dev Environments issues on GitHub](https://github.com/docker/dev-environments/issues) - [Docker Extensions issues on GitHub](https://github.com/docker/extensions-sdk/issues) ### Feedback via Community Slack channels diff --git a/content/manuals/desktop/uninstall.md b/content/manuals/desktop/uninstall.md index a33e0212e8dd..921bdf2f1723 100644 --- a/content/manuals/desktop/uninstall.md +++ b/content/manuals/desktop/uninstall.md @@ -15,13 +15,13 @@ weight: 210 {{< tabs >}} {{< tab name="Windows" >}} -To uninstall Docker Desktop from your Windows machine: +#### From the GUI 1. From the Windows **Start** menu, select **Settings** > **Apps** > **Apps & features**. 2. Select **Docker Desktop** from the **Apps & features** list and then select **Uninstall**. 3. Select **Uninstall** to confirm your selection. -You can also uninstall Docker Desktop from the CLI: +#### From the CLI 1. Locate the installer: ```console @@ -37,7 +37,7 @@ You can also uninstall Docker Desktop from the CLI: $ start /w "" "Docker Desktop Installer.exe" uninstall ``` -After uninstalling Docker Desktop, there may be some residual files left behind which you can remove manually. These are: +After uninstalling Docker Desktop, some residual files may remain which you can remove manually. These are: ```console C:\ProgramData\Docker @@ -52,128 +52,159 @@ C:\Users\\.docker {{< /tab >}} {{< tab name="Mac" >}} -To uninstall Docker Desktop from your Mac: +#### From the GUI -1. From the Docker menu, select the **Troubleshoot** icon in the top-right corner of the Docker Desktop Dashboard and then select **Uninstall**. -2. Select **Uninstall** to confirm your selection. +1. Open Docker Desktop. +2. In the top-right corner of the Docker Desktop Dashboard, select the **Troubleshoot** icon. +3. Select **Uninstall**. +4. When prompted, confirm by selecting **Uninstall** again. -You can also uninstall Docker Desktop from the CLI. Run: +You can then move the Docker application to the trash. -```console -$ /Applications/Docker.app/Contents/MacOS/uninstall -``` +#### From the CLI + +Run: -You may encounter the following error when uninstalling Docker Desktop using the uninstall command. ```console $ /Applications/Docker.app/Contents/MacOS/uninstall -Password: -Uninstalling Docker Desktop... -Error: unlinkat /Users//Library/Containers/com.docker.docker/.com.apple.containermanagerd.metadata.plist: operation not permitted ``` -The operation not permitted error is reported either on the file `.com.apple.containermanagerd.metadata.plist` or on the parent directory `/Users//Library/Containers/com.docker.docker/`. This error can be ignored as you have successfully uninstalled Docker Desktop. -You can remove the directory `/Users//Library/Containers/com.docker.docker/` later by allowing **Full Disk Access** to the terminal application you are using (**System Settings** > **Privacy & Security** > **Full Disk Access**). -After uninstalling Docker Desktop, there may be some residual files left behind which you can remove: +You can then move the Docker application to the trash. + +> [!NOTE] +> You may encounter the following error when uninstalling Docker Desktop using the uninstall command. +> +> ```console +> $ /Applications/Docker.app/Contents/MacOS/uninstall +> Password: +> Uninstalling Docker Desktop... +> Error: unlinkat /Users//Library/Containers/com.docker.docker/.com.apple.containermanagerd.metadata.plist: > operation not permitted +> ``` +> +> The operation not permitted error is reported either on the file `.com.apple.containermanagerd.metadata.plist` or on the parent directory `/Users//Library/Containers/com.docker.docker/`. This error can be ignored as you have successfully uninstalled Docker Desktop. +> You can remove the directory `/Users//Library/Containers/com.docker.docker/` later by allowing **Full Disk Access** to the terminal application you are using (**System Settings** > **Privacy & Security** > **Full Disk Access**). + +After uninstalling Docker Desktop, some residual files may remain which you can remove: ```console $ rm -rf ~/Library/Group\ Containers/group.com.docker $ rm -rf ~/.docker ``` -With Docker Desktop version 4.36 and earlier, the following files can also be left on the file system. You can remove these with administrative privileges: +With Docker Desktop version 4.36 and earlier, the following files may also be left on the file system. You can remove these with administrative privileges: ```console /Library/PrivilegedHelperTools/com.docker.vmnetd /Library/PrivilegedHelperTools/com.docker.socket ``` -You can also move the Docker application to the trash. - {{< /tab >}} -{{< tab name="Linux" >}} +{{< tab name="Ubuntu" >}} -Docker Desktop is removed from a Linux host using the package manager. +To uninstall Docker Desktop for Ubuntu: -Once Docker Desktop is removed, users must delete the `credsStore` and `currentContext` properties from the `~/.docker/config.json`. +1. Remove the Docker Desktop application. Run: -{{< /tab >}} -{{< tab name="Ubuntu" >}} + ```console + $ sudo apt remove docker-desktop + ``` -To remove Docker Desktop for Ubuntu, run: + This removes the Docker Desktop package itself but doesn’t delete all of its files or settings. -```console -$ sudo apt remove docker-desktop -``` +2. Manually remove leftover file. -For a complete cleanup, remove configuration and data files at `$HOME/.docker/desktop`, the symlink at `/usr/local/bin/com.docker.cli`, and purge -the remaining systemd service files. + ```console + $ rm -r $HOME/.docker/desktop + $ sudo rm /usr/local/bin/com.docker.cli + $ sudo apt purge docker-desktop + ``` -```console -$ rm -r $HOME/.docker/desktop -$ sudo rm /usr/local/bin/com.docker.cli -$ sudo apt purge docker-desktop -``` + This removes configuration and data files at `$HOME/.docker/desktop`, the symlink at `/usr/local/bin/com.docker.cli`, and purges the remaining systemd service files. + +3. Clean up Docker config settings. In `$HOME/.docker/config.json`, remove the `credsStore` and `currentContext` properties. -Remove the `credsStore` and `currentContext` properties from `$HOME/.docker/config.json`. Additionally, you must delete any edited configuration files manually. + These entries tell Docker where to store credentials and which context is active. If they remain after uninstalling Docker Desktop, they may conflict with a future Docker setup. {{< /tab >}} {{< tab name="Debian" >}} -To remove Docker Desktop for Debian, run: +To uninstall Docker Desktop for Debian, run: -```console -$ sudo apt remove docker-desktop -``` +1. Remove the Docker Desktop application: -For a complete cleanup, remove configuration and data files at `$HOME/.docker/desktop`, the symlink at `/usr/local/bin/com.docker.cli`, and purge -the remaining systemd service files. + ```console + $ sudo apt remove docker-desktop + ``` -```console -$ rm -r $HOME/.docker/desktop -$ sudo rm /usr/local/bin/com.docker.cli -$ sudo apt purge docker-desktop -``` + This removes the Docker Desktop package itself but doesn’t delete all of its files or settings. -Remove the `credsStore` and `currentContext` properties from `$HOME/.docker/config.json`. Additionally, you must delete any edited configuration files manually. +2. Manually remove leftover file. + + ```console + $ rm -r $HOME/.docker/desktop + $ sudo rm /usr/local/bin/com.docker.cli + $ sudo apt purge docker-desktop + ``` + + This removes configuration and data files at `$HOME/.docker/desktop`, the symlink at `/usr/local/bin/com.docker.cli`, and purges the remaining systemd service files. + +3. Clean up Docker config settings. In `$HOME/.docker/config.json`, remove the `credsStore` and `currentContext` properties. + + These entries tell Docker where to store credentials and which context is active. If they remain after uninstalling Docker Desktop, they may conflict with a future Docker setup. {{< /tab >}} {{< tab name="Fedora" >}} -To remove Docker Desktop for Fedora, run: +To uninstall Docker Desktop for Fedora: -```console -$ sudo dnf remove docker-desktop -``` +1. Remove the Docker Desktop application. Run: + + ```console + $ sudo dnf remove docker-desktop + ``` -For a complete cleanup, remove configuration and data files at `$HOME/.docker/desktop`, the symlink at `/usr/local/bin/com.docker.cli`, and purge -the remaining systemd service files. + This removes the Docker Desktop package itself but doesn’t delete all of its files or settings. -```console -$ rm -r $HOME/.docker/desktop -$ sudo rm /usr/local/bin/com.docker.cli -``` +2. Manually remove leftover file. + + ```console + $ rm -r $HOME/.docker/desktop + $ sudo rm /usr/local/bin/com.docker.cli + $ sudo apt purge docker-desktop + ``` -Remove the `credsStore` and `currentContext` properties from `$HOME/.docker/config.json`. Additionally, you must delete any edited configuration files manually. + This removes configuration and data files at `$HOME/.docker/desktop`, the symlink at `/usr/local/bin/com.docker.cli`, and purges the remaining systemd service files. + +3. Clean up Docker config settings. In `$HOME/.docker/config.json`, remove the `credsStore` and `currentContext` properties. + + These entries tell Docker where to store credentials and which context is active. If they remain after uninstalling Docker Desktop, they may conflict with a future Docker setup. {{< /tab >}} {{< tab name="Arch" >}} -To remove Docker Desktop for Arch, run: +To uninstall Docker Desktop for Arch: -```console -$ sudo pacman -R docker-desktop -``` +1. Remove the Docker Desktop application. Run: -For a complete cleanup, remove configuration and data files at `$HOME/.docker/desktop`, the symlink at `/usr/local/bin/com.docker.cli`, and purge -the remaining systemd service files. + ```console + $ sudo pacman remove docker-desktop + ``` -```console -$ rm -r $HOME/.docker/desktop -$ sudo rm /usr/local/bin/com.docker.cli -$ sudo pacman -Rns docker-desktop -``` + This removes the Docker Desktop package itself but doesn’t delete all of its files or settings. + +2. Manually remove leftover file. + + ```console + $ rm -r $HOME/.docker/desktop + $ sudo rm /usr/local/bin/com.docker.cli + $ sudo apt purge docker-desktop + ``` + + This removes configuration and data files at `$HOME/.docker/desktop`, the symlink at `/usr/local/bin/com.docker.cli`, and purges the remaining systemd service files. + +3. Clean up Docker config settings. In `$HOME/.docker/config.json`, remove the `credsStore` and `currentContext` properties. -Remove the `credsStore` and `currentContext` properties from `$HOME/.docker/config.json`. Additionally, you must delete any edited configuration files manually. + These entries tell Docker where to store credentials and which context is active. If they remain after uninstalling Docker Desktop, they may conflict with a future Docker setup. {{< /tab >}} {{< /tabs >}} From 6f45356dde58b2e9ad6ce3a85f2acf2e042707dc Mon Sep 17 00:00:00 2001 From: sheltongraves <148902861+sheltongraves@users.noreply.github.com> Date: Tue, 8 Apr 2025 14:03:55 -0400 Subject: [PATCH 279/699] Update latest.yaml to add group repo access (#22369) Adding API documentation for assign a group (Team) to a repository for access ## Description ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Co-authored-by: Sarah Sanders --- content/reference/api/hub/latest.yaml | 50 +++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/content/reference/api/hub/latest.yaml b/content/reference/api/hub/latest.yaml index 44f4bab98c76..f01d2d0bc39c 100644 --- a/content/reference/api/hub/latest.yaml +++ b/content/reference/api/hub/latest.yaml @@ -892,6 +892,42 @@ paths: $ref: "#/components/responses/Forbidden" "404": $ref: "#/components/responses/NotFound" + /v2/repositories/{namespace}/{repository}/groups: + parameters: + - $ref: "#/components/parameters/namespace" + - $ref: "#/components/parameters/repository" + post: + summary: Assign a group (Team) to a repository for access + tags: + - repositories + security: + - bearerAuth: [] + parameters: + - in: query + name: group_name + required: true + schema: + type: string + description: Name of the group (team) in the organization. + - in: query + name: permission + required: true + schema: + type: string + description: | + Access level for the group. Possible values: + - `read` + - `write` + - `admin` + responses: + "200": + $ref: "#/components/responses/team_repo" + "403": + $ref: "#/components/responses/forbidden" + "404": + $ref: "#/components/responses/NotFound" + + /v2/orgs/{org_name}/members: parameters: - $ref: "#/components/parameters/org_name" @@ -3087,6 +3123,20 @@ components: description: Resources this token has access to items: $ref: "#/components/schemas/orgAccessTokenResource" + team_repo: + allOf: + - $ref: "#/components/responses/team_repo" + properties: + group_name: + type: string + description: Name of the group + permission: + type: string + description: Repo access permission + enum: + - read + - write + - admin parameters: namespace: in: path From fa6e23b4262af0312927b2f11373fd5a53a2dc7b Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Tue, 8 Apr 2025 17:02:30 -0400 Subject: [PATCH 280/699] cx: add guided setup section for admin onboarding (#22353) ## Description - Admin Onboarding is releasing the week of April 7th. It includes an embedded "guided setup" feature - This adds the guided setup to the org onboarding guide - Preview: https://deploy-preview-22353--docsdocker.netlify.app/admin/organization/onboard/ ## Related issues or tickets - [ENGDOCS-2512](https://docker.atlassian.net/browse/ENGDOCS-2512) ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review [ENGDOCS-2512]: https://docker.atlassian.net/browse/ENGDOCS-2512?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- content/manuals/admin/organization/onboard.md | 64 ++++++++++++++----- 1 file changed, 48 insertions(+), 16 deletions(-) diff --git a/content/manuals/admin/organization/onboard.md b/content/manuals/admin/organization/onboard.md index fdf2c5a7ee5e..6fa0cf1936d1 100644 --- a/content/manuals/admin/organization/onboard.md +++ b/content/manuals/admin/organization/onboard.md @@ -4,7 +4,7 @@ weight: 20 description: Get started onboarding your Docker Team or Business organization. keywords: business, team, organizations, get started, onboarding toc_min: 1 -toc_max: 2 +toc_max: 3 aliases: - /docker-hub/onboard/ - /docker-hub/onboard-team/ @@ -26,7 +26,7 @@ In this guide, you'll learn how to do the following: ## Prerequisites -Before you start to onboard your organization, ensure that you: +Before you start onboarding your organization, ensure that you: - Have a Docker Team or Business subscription. See [Docker Pricing](https://www.docker.com/pricing/) for details. @@ -36,51 +36,74 @@ Before you start to onboard your organization, ensure that you: - Familiarize yourself with Docker concepts and terminology in the [administration overview](../_index.md) and [FAQs](/faq/admin/general-faqs/). -## Step 1: Identify your Docker users +## Onboard with guided setup -Identifying your users will ensure that you allocate your subscription seats efficiently and that all your Docker users receive the benefits of your subscription. +The Admin Console has a guided setup to help you easily +onboard your organization. The guided setup steps consist of basic onboarding +tasks. If you want to onboard outside of the guided setup, +see [Recommended onboarding steps](/manuals/admin/organization/onboard.md#recommended-onboarding-steps). + +To onboard using the guided setup, +navigate to the [Admin Console](https://app.docker.com) and +select **Guided setup** in the left-hand navigation. + +The guided setup walks you through the following onboarding steps: + +- **Invite your team**: Invite owners and members. +- **Manage user access**: Add and verify a domain, manage users with SSO, and +enforce Docker Desktop sign-in. +- **Docker Desktop security**: Configure image access management, registry access +management, and settings management. + +## Recommended onboarding steps + +### Step one: Identify your Docker users + +Identifying your users helps you allocate seats efficiently and ensures they +receive your Docker subscription benefits. 1. Identify the Docker users in your organization. - - If your organization uses device management software, like MDM or Jamf, you may use the device management software to help identify Docker users. See your device management software's documentation for details. You can identify Docker users by checking if Docker Desktop is installed at the following location on each user's machine: + - If your organization uses device management software, like MDM or Jamf, you can use the device management software to help identify Docker users. See your device management software's documentation for details. You can identify Docker users by checking if Docker Desktop is installed at the following location on each user's machine: - Mac: `/Applications/Docker.app` - Windows: `C:\Program Files\Docker\Docker` - Linux: `/opt/docker-desktop` - - If your organization doesn't use device management software or your users haven't installed Docker Desktop yet, you may survey your users. -2. Instruct all your organization's Docker users to update their existing Docker account's email address to an address that's in your organization's domain, or to create a new account using an email address in your organization's domain. + - If your organization doesn't use device management software or your users haven't installed Docker Desktop yet, you can survey your users. +2. Ask users to update their Docker account email to one in your organization’s domain, or create a new account with that email. - To update an account's email address, instruct your users to sign in to [Docker Hub](https://hub.docker.com), and update the email address to their email address in your organization's domain. - To create a new account, instruct your users to go [sign up](https://hub.docker.com/signup) using their email address in your organization's domain. 3. Ask your Docker sales representative or [contact sales](https://www.docker.com/pricing/contact-sales/) to get a list of Docker accounts that use an email address in your organization's domain. -## Step 2: Invite owners +### Step two: Invite owners When you create an organization, you are the only owner. It is optional to add additional owners. Owners can help you onboard and manage your organization. To add an owner, invite a user and assign them the owner role. For more details, see [Invite members](/admin/organization/members/). -## Step 3: Invite members +### Step three: Invite members When you add users to your organization, you gain visibility into their activity and you can enforce security settings. In addition, members of your organization receive increased pull limits and other organization wide benefits. To add a member, invite a user and assign them the member role. For more details, see [Invite members](/admin/organization/members/). -## Step 4: Manage members with SSO and SCIM +### Step four: Manage user access with SSO and SCIM Configuring SSO and SCIM is optional and only available to Docker Business subscribers. To upgrade a Docker Team subscription to a Docker Business subscription, see [Upgrade your subscription](/subscription/upgrade/). -You can manage your members in your identity provider and automatically provision them to your Docker organization with SSO and SCIM. See the following for more details. +Use your identity provider (IdP) to manage members and provision them to Docker +automatically via SSO and SCIM. See the following for more details: + - [Configure SSO](/manuals/security/for-admins/single-sign-on/configure.md) to authenticate and add members when they sign in to Docker through your identity provider. - Optional. [Enforce SSO](/manuals/security/for-admins/single-sign-on/connect.md) to ensure that when users sign in to Docker, they must use SSO. > [!NOTE] > - > Enforcing single sign-on (SSO) and [Step 5: Enforce sign-in for Docker - > Desktop](#step-5-enforce-sign-in-for-docker-desktop) are different - > features. For more details, see + > Enforcing single sign-on (SSO) and enforcing Docker Desktop sign in + are different features. For more details, see > [Enforcing sign-in versus enforcing single sign-on (SSO)](/security/for-admins/enforce-sign-in/#enforcing-sign-in-versus-enforcing-single-sign-on-sso). - [Configure SCIM](/security/for-admins/provisioning/scim/) to automatically provision, add, and de-provision members to Docker through your identity provider. -## Step 5: Enforce sign-in for Docker Desktop +### Step five: Enforce sign-in for Docker Desktop By default, members of your organization can use Docker Desktop without signing in. When users don’t sign in as a member of your organization, they don’t @@ -91,10 +114,19 @@ There are multiple ways you can enforce sign-in, depending on your company's set - [`.plist` method (Mac only)](/security/for-admins/enforce-sign-in/methods/#plist-method-mac-only) - [`registry.json` method (All)](/security/for-admins/enforce-sign-in/methods/#registryjson-method-all) +### Step six: Manage Docker Desktop security + +Docker offers the following security features to manage your organization's +security posture: + +- [Image Access Management](/manuals/security/for-admins/hardened-desktop/image-access-management.md): Control which types of images your developers can pull from Docker Hub. +- [Registry Access Management](/manuals/security/for-admins/hardened-desktop/registry-access-management.md): Define which registries your developers can access. +- [Settings management](/manuals/security/for-admins/hardened-desktop/settings-management.md): Set and control Docker Desktop settings for your users. + ## What's next - [Manage Docker products](./manage-products.md) to configure access and view usage. - Configure [Hardened Docker Desktop](/desktop/hardened-desktop/) to improve your organization’s security posture for containerized development. - [Audit your domains](/docker-hub/domain-audit/) to ensure that all Docker users in your domain are part of your organization. -Your Docker subscription provides many more additional features. To learn more, see [Docker subscriptions and features](/subscription/details/). +Your Docker subscription provides many more additional features. To learn more, see [Docker subscriptions and features](/subscription/details/). \ No newline at end of file From b2950312d8696ebb58da7f0bdaaac55fa1eb1bcc Mon Sep 17 00:00:00 2001 From: Lorena Rangel Date: Wed, 9 Apr 2025 11:51:30 +0200 Subject: [PATCH 281/699] Add known issue (#22394) ## Description Added known issue for https://github.com/docker/for-win/issues/14703 ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/desktop/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/manuals/desktop/release-notes.md b/content/manuals/desktop/release-notes.md index 354e530c4935..144b0ecc6f34 100644 --- a/content/manuals/desktop/release-notes.md +++ b/content/manuals/desktop/release-notes.md @@ -76,6 +76,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo #### For Windows - Switching to Windows Containers while the privileged helper error message is displayed could cause inconsistent state. As a workaround, quit Docker Desktop, change `UseWindowsContainers` to `false` in `settings-store.json` and restart Docker Desktop. +- After installation, `Docker Desktop.exe` does not contain the latest version information. ## 4.39.0 From 01505f4d80580ebded1bd2f5e91e9e5037847c1a Mon Sep 17 00:00:00 2001 From: stevenlele <15964380+stevenlele@users.noreply.github.com> Date: Wed, 9 Apr 2025 11:16:18 +0000 Subject: [PATCH 282/699] CLI: Add missing `pad` and `truncate` output formatting functions (#22384) See https://github.com/docker/cli/blob/master/templates/templates.go --------- Co-authored-by: Usha Mandya <47779042+usha-mandya@users.noreply.github.com> --- content/manuals/engine/cli/formatting.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/content/manuals/engine/cli/formatting.md b/content/manuals/engine/cli/formatting.md index e7b0c279343f..ad20c8c1cd9b 100644 --- a/content/manuals/engine/cli/formatting.md +++ b/content/manuals/engine/cli/formatting.md @@ -90,6 +90,26 @@ $ docker inspect --format "{{title .Name}}" container $ docker inspect --format "{{upper .Name}}" container ``` +## pad + +`pad` adds whitespace padding to a string. You can specify the number of spaces to add before and after the string. + +```console +$ docker image list --format '{{pad .Repository 5 10}}' +``` + +This example adds 5 spaces before the image repository name and 10 spaces after. + +## truncate + +`truncate` shortens a string to a specified length. If the string is shorter than the specified length, it remains unchanged. + +```console +$ docker image list --format '{{truncate .Repository 15}}' +``` + +This example displays the image repository name, truncating it to the first 15 characters if it's longer. + ## println `println` prints each value on a new line. From 034dbdfbccda7f5e3d3cae8887f8b4d0188d8d46 Mon Sep 17 00:00:00 2001 From: Monica Chao Date: Wed, 9 Apr 2025 07:37:03 -0500 Subject: [PATCH 283/699] docs: added note on populating builds tab when building windows container images (#22389) ## Description If a user switches to Windows containers and builds an image using the `docker build` command as it (using the legacy builder), the Builds tab is not populated. This is because the build history is provided by Buildkit. To populate the Builds tab, the customer must either set `DOCKER_BUILDKIT=1` or use the `buildx build` command. Current documentation does not mention this and a support ticket was raised. ## Related issues or tickets - SEG-1116 (Slack thread linked in ticket for context) ## Reviews - [X] Technical review @karman-docker - [X] Editorial review - [ ] Product review --------- Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- content/manuals/desktop/use-desktop/builds.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/manuals/desktop/use-desktop/builds.md b/content/manuals/desktop/use-desktop/builds.md index 71c32fe35ebf..c31b1e611409 100644 --- a/content/manuals/desktop/use-desktop/builds.md +++ b/content/manuals/desktop/use-desktop/builds.md @@ -14,6 +14,12 @@ If you're connected to a cloud builder through [Docker Build Cloud](../../build- the Builds view also lists any active or completed cloud builds by other team members connected to the same cloud builder. +> [!NOTE] +> +> When building Windows container images using the `docker build` command, the legacy builder is used which does not populate the **Builds** view. To switch to using BuildKit, you can either: +> - Set `DOCKER_BUILDKIT=1` in the build command, such as `DOCKER_BUILDKIT=1 docker build .` or +> - Use the `docker buildx build` command + ## Show build list Open the **Builds** view from the Docker Dashboard to access: From 284b9bce58afe1b81e30cd46f401782632baacc7 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Wed, 9 Apr 2025 15:15:10 +0100 Subject: [PATCH 284/699] Merge pull request #22393 from aevesdocker/ENGDOCS-2515c ENGDOCS-2515c --- _vale/Docker/Acronyms.yml | 1 + _vale/config/vocabularies/Docker/accept.txt | 1 + .../manuals/desktop/features/containerd.md | 30 +++---- .../manuals/desktop/features/desktop-cli.md | 9 +-- .../features/dev-environments/_index.md | 2 +- .../manuals/desktop/features/gordon/_index.md | 80 +++++++------------ content/manuals/desktop/features/gpu.md | 28 +++++-- .../manuals/desktop/features/kubernetes.md | 2 +- .../manuals/desktop/features/networking.md | 36 ++++----- .../features/synchronized-file-sharing.md | 14 +--- content/manuals/desktop/features/usbip.md | 14 ++-- content/manuals/desktop/features/vmm.md | 16 ++-- content/manuals/desktop/features/wasm.md | 32 +++----- .../manuals/desktop/features/wsl/_index.md | 2 +- data/summary.yaml | 6 +- 15 files changed, 116 insertions(+), 157 deletions(-) diff --git a/_vale/Docker/Acronyms.yml b/_vale/Docker/Acronyms.yml index b1dc301aa2ee..08a81fb0731c 100644 --- a/_vale/Docker/Acronyms.yml +++ b/_vale/Docker/Acronyms.yml @@ -78,6 +78,7 @@ exceptions: - KDE - LESS - LLDB + - LLM - LTS - MAC - MATE diff --git a/_vale/config/vocabularies/Docker/accept.txt b/_vale/config/vocabularies/Docker/accept.txt index 97d7666e2c2e..943435bcdcc1 100644 --- a/_vale/config/vocabularies/Docker/accept.txt +++ b/_vale/config/vocabularies/Docker/accept.txt @@ -77,6 +77,7 @@ Nginx Nutanix Nuxeo OAuth +Ollama OTel Okta PKG diff --git a/content/manuals/desktop/features/containerd.md b/content/manuals/desktop/features/containerd.md index e78c4448323a..6f80994faebc 100644 --- a/content/manuals/desktop/features/containerd.md +++ b/content/manuals/desktop/features/containerd.md @@ -1,6 +1,6 @@ --- title: containerd image store -weight: 10 +weight: 80 description: How to activate the containerd integration feature in Docker Desktop keywords: Docker, containerd, engine, image store, lazy-pull toc_max: 3 @@ -8,37 +8,31 @@ aliases: - /desktop/containerd/ --- -This page provides information about the ongoing integration of `containerd` for -image and file system management in the Docker Engine. +Docker Desktop is transitioning to use containerd for image and filesystem management. This page outlines the benefits, setup process, and new capabilities enabled by the containerd image store. > [!NOTE] > -> Images and containers are not shared between the classic image store and the -> new containerd image store. When you switch image stores, containers and -> images from the inactive store remain but are hidden until you switch back. +> Docker Desktop maintains separate image stores for the classic and containerd image stores. +> When switching between them, images and containers from the inactive store remain on disk but are hidden until you switch back. -## What is containerd? +## What is `containerd`? -`containerd` is an abstraction of the low-level kernel features -used to run and manage containers on a system. -It's a platform used in container software like Docker and Kubernetes. +`containerd` is a container runtime that provides a lightweight, consistent interface for container lifecycle management. It is already used under the hood by Docker Engine for creating, starting, and stopping containers. -Docker Engine already uses `containerd` for container lifecycle management, -which includes creating, starting, and stopping containers. -This page describes the next step of the containerd integration for Docker: -the containerd image store. +Docker Desktop’s ongoing integration of containerd now extends to the image store, offering more flexibility and modern image support. -## Image store +## What is the `containerd` image store? The image store is the component responsible for pushing, pulling, and storing images on the filesystem. + The classic Docker image store is limited in the types of images that it supports. For example, it doesn't support image indices, containing manifest lists. When you create multi-platform images, for example, the image index resolves all the platform-specific variants of the image. An image index is also required when building images with attestations. -The containerd image store extends range of image types +The containerd image store extends the range of image types that the Docker Engine can natively interact with. While this is a low-level architectural change, it's a prerequisite for unlocking a range of new use cases, including: @@ -88,8 +82,4 @@ and load them to your local image store: -## Feedback -Thanks for trying the new features available with `containerd`. Give feedback or -report any bugs you may find through the issues tracker on the -[feedback form](https://dockr.ly/3PODIhD). diff --git a/content/manuals/desktop/features/desktop-cli.md b/content/manuals/desktop/features/desktop-cli.md index 600224a500df..798009755976 100644 --- a/content/manuals/desktop/features/desktop-cli.md +++ b/content/manuals/desktop/features/desktop-cli.md @@ -1,14 +1,9 @@ --- -title: Using the Docker Desktop CLI +title: Use the Docker Desktop CLI linkTitle: Docker Desktop CLI -weight: 120 +weight: 100 description: How to use the Docker Desktop CLI keywords: cli, docker desktop, macos, windows, linux -params: - sidebar: - badge: - color: green - text: New --- {{< summary-bar feature_name="Docker Desktop CLI" >}} diff --git a/content/manuals/desktop/features/dev-environments/_index.md b/content/manuals/desktop/features/dev-environments/_index.md index 6393671d1203..def2e621485e 100644 --- a/content/manuals/desktop/features/dev-environments/_index.md +++ b/content/manuals/desktop/features/dev-environments/_index.md @@ -3,7 +3,7 @@ description: Dev Environments keywords: Dev Environments, share, local, Compose title: Overview of Dev Environments linkTitle: Dev Environments -weight: 40 +weight: 130 aliases: - /desktop/dev-environments/ params: diff --git a/content/manuals/desktop/features/gordon/_index.md b/content/manuals/desktop/features/gordon/_index.md index 1ee9d3ad6484..22f15e89738e 100644 --- a/content/manuals/desktop/features/gordon/_index.md +++ b/content/manuals/desktop/features/gordon/_index.md @@ -17,23 +17,22 @@ of the Docker ecosystem. ## What is Ask Gordon? -Ask Gordon is a suite of AI-powered capabilities integrated into Docker's tools. -These features, currently in Beta, are not enabled by default, and are not -production-ready. You may also encounter the term "Docker AI" as a broader -reference to this technology. +Ask Gordon provides AI-powered assistance in Docker tools. It offers contextual help for tasks like: + +- Improving Dockerfiles +- Running and troubleshooting containers +- Interacting with your images and code +- Finding vulnerabilities or configuration issues -The goal of Ask Gordon is to make Docker's tools for managing images and -containers more intuitive and accessible. It provides contextual assistance -tailored to your local environment, including Dockerfiles, containers, and -applications. +It understands your local environment, including source code, Dockerfiles, and images, to provide personalized and actionable guidance. -Ask Gordon integrates directly with Docker's tools to help you perform specific -tasks. It understands your local setup, such as your local source code and -images. For example, you can ask Gordon to help you identify vulnerabilities in -your project or how to optimize a Dockerfile in your local repository. This -tight integration ensures responses are practical and actionable. +These features are not enabled by default, and are not +production-ready. You may also encounter the term "Docker AI" as a broader +reference to this technology. -> [!NOTE] Ask Gordon is powered by Large Language Models (LLMs). Like all +> [!NOTE] +> +> Ask Gordon is powered by Large Language Models (LLMs). Like all > LLM-based tools, its responses may sometimes be inaccurate. Always verify the > information provided. @@ -81,40 +80,22 @@ making it more effective for all users. If you have concerns about data collection or usage, you can [disable](#disable-ask-gordon) the feature at any time. -## Setup - -To use this feature, you must have: - -- Docker Desktop version 4.38 or later. - -Ask Gordon is not enabled by default. To enable the feature: - -1. [Sign in](#sign-in) to your Docker account. -2. [Enable the feature](#enable-the-feature) in the Docker Desktop settings. +## Enable Ask Gordon -### Sign in - -1. Open Docker Desktop. -2. Select the **Sign in** button. -3. Complete the sign-in process in your web browser. - -### Enable the feature - -After signing in to your Docker Account, enable the Docker AI feature: - -1. Navigate to the **Features in development** tab in settings. -2. Under the **Experimental features** tab, select **Access experimental features**. -3. Select **Apply and restart**. -4. Quit and reopen Docker Desktop to ensure the changes take effect. -5. Open the **Settings** view in Docker Desktop. -6. Navigate to **Features in development**. -7. From the **Beta** tab, check the **Enable Docker AI** checkbox. +1. Sign in to your Docker account. +2. Navigate to the **Features in development** tab in settings. +3. Under the **Experimental features** tab, select **Access experimental features**. +4. Select **Apply and restart**. +5. Quit and reopen Docker Desktop to ensure the changes take effect. +6. Open the **Settings** view in Docker Desktop. +7. Navigate to **Features in development**. +8. From the **Beta** tab, check the **Enable Docker AI** checkbox. The Docker AI terms of service agreement is displayed. You must agree to the terms before you can enable the feature. Review the terms and select **Accept and enable** to continue. -8. Select **Apply & restart**. +9. Select **Apply & restart**. ## Using Ask Gordon @@ -122,14 +103,9 @@ The primary interfaces to Docker's AI capabilities are through the **Ask Gordon** view in Docker Desktop, or if you prefer to use the CLI: the `docker ai` CLI command. -If you've used an AI chatbot before, these interfaces will be pretty familiar to -you. You can chat with the Docker AI to get help with your Docker tasks. - -### Contextual help - Once you've enabled the Docker AI features, you'll also find references to **Ask Gordon** in various other places throughout the Docker Desktop user interface. -Whenever you encounter a button with the "sparkles" (✨) icon in the user +Whenever you encounter a button with the **Sparkles** (✨) icon in the user interface, you can use the button to get contextual support from Ask Gordon. ## Example workflows @@ -179,7 +155,7 @@ able to help you get set up: 2. Open the **Images** view in Docker Desktop and select the image. 3. Select the **Run** button. -In the _Run a new container_ dialog that opens, you should see a message about +In the **Run a new container** dialog, you should see a message about **Ask Gordon**. ![Ask Gordon hint in Docker Desktop](../../images/gordon-run-ctr.png) @@ -218,6 +194,8 @@ across several dimensions: ## Disable Ask Gordon +### For individual users + If you've enabled Ask Gordon and you want to disable it again: 1. Open the **Settings** view in Docker Desktop. @@ -225,6 +203,8 @@ If you've enabled Ask Gordon and you want to disable it again: 3. Clear the **Enable Docker AI** checkbox. 4. Select **Apply & restart**. +### For organizations + If you want to disable Ask Gordon for your entire Docker organization, using [Settings Management](/manuals/security/for-admins/hardened-desktop/settings-management/_index.md), @@ -271,4 +251,4 @@ here's how you can get in touch: the **Ask Gordon** view in Docker Desktop, or from the CLI by running the `docker ai feedback` command. -Thank you for helping us improve Ask Gordon. + diff --git a/content/manuals/desktop/features/gpu.md b/content/manuals/desktop/features/gpu.md index 494d178291dd..6e69184205fe 100644 --- a/content/manuals/desktop/features/gpu.md +++ b/content/manuals/desktop/features/gpu.md @@ -1,7 +1,7 @@ --- -title: GPU support in Docker Desktop +title: GPU support in Docker Desktop for Windows linkTitle: GPU support -weight: 80 +weight: 40 description: How to use GPU in Docker Desktop keywords: gpu, gpu support, nvidia, wsl2, docker desktop, windows toc_max: 3 @@ -13,22 +13,27 @@ aliases: > > Currently GPU support in Docker Desktop is only available on Windows with the WSL2 backend. -## Using NVIDIA GPUs with WSL2 +Docker Desktop for Windows supports NVIDIA GPU Paravirtualization (GPU-PV) on NVIDIA GPUs, allowing containers to access GPU resources for compute-intensive workloads like AI, machine learning, or video processing. -Docker Desktop for Windows supports WSL 2 GPU Paravirtualization (GPU-PV) on NVIDIA GPUs. To enable WSL 2 GPU Paravirtualization, you need: +## Prerequisites -- A machine with an NVIDIA GPU +To enable WSL 2 GPU Paravirtualization, you need: + +- A Windows machine with an NVIDIA GPU - Up to date Windows 10 or Windows 11 installation - [Up to date drivers](https://developer.nvidia.com/cuda/wsl) from NVIDIA supporting WSL 2 GPU Paravirtualization - The latest version of the WSL 2 Linux kernel. Use `wsl --update` on the command line - To make sure the [WSL 2 backend is turned on](wsl/_index.md#turn-on-docker-desktop-wsl-2) in Docker Desktop -To validate that everything works as expected, execute a `docker run` command with the `--gpus=all` flag. For example, the following will run a short benchmark on your GPU: +## Validate GPU support + +To confirm GPU access is working inside Docker, run the following: ```console $ docker run --rm -it --gpus=all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark ``` -The output will be similar to: + +This runs an n-body simulation benchmark on the GPU. The output will be similar to: ```console Run "nbody -benchmark [-numbodies=]" to measure performance. @@ -58,9 +63,16 @@ GPU Device 0: "GeForce RTX 2060 with Max-Q Design" with compute capability 7.5 = 2724.379 single-precision GFLOP/s at 20 flops per interaction ``` -Or if you wanted to try something more useful you could use the official [Ollama image](https://hub.docker.com/r/ollama/ollama) to run the Llama2 large language model. +## Run a real-world model: Llama2 with Ollama + +Use the [official Ollama image](https://hub.docker.com/r/ollama/ollama) to run the Llama2 LLM with GPU acceleration: ```console $ docker run --gpus=all -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama +``` + +Then start the model: + +```console $ docker exec -it ollama ollama run llama2 ``` diff --git a/content/manuals/desktop/features/kubernetes.md b/content/manuals/desktop/features/kubernetes.md index 264a163b0644..a83083bbe163 100644 --- a/content/manuals/desktop/features/kubernetes.md +++ b/content/manuals/desktop/features/kubernetes.md @@ -20,7 +20,7 @@ Kubernetes on Docker Desktop runs alongside other workloads, including Swarm ser ## What happens when I enable Kubernetes in Docker Desktop? -When you enable Kubernetes in Docker Desktop, the following actions are triggered in the Docker Desktop backend and VM: +The following actions are triggered in the Docker Desktop backend and VM: - Generation of certificates and cluster configuration - Download and installation of Kubernetes internal components diff --git a/content/manuals/desktop/features/networking.md b/content/manuals/desktop/features/networking.md index 0c10d88c2809..58d9a73c9b3e 100644 --- a/content/manuals/desktop/features/networking.md +++ b/content/manuals/desktop/features/networking.md @@ -2,6 +2,7 @@ description: Understand how networking works on Docker Desktop and see the known limitations keywords: networking, docker desktop, proxy, vpn, Linux, Mac, Windows title: Explore networking features on Docker Desktop +linkTitle: Networking aliases: - /desktop/linux/networking/ - /docker-for-mac/networking/ @@ -11,11 +12,10 @@ aliases: - /docker-for-windows/networking/ - /desktop/windows/networking/ - /desktop/networking/ -weight: 50 +weight: 30 --- -Docker Desktop provides several networking features to make it easier to -use. +Docker Desktop includes built-in networking capabilities to help you connect containers with services on your host, across containers, or through proxies and VPNs. ## Networking features for all platforms @@ -33,17 +33,21 @@ When you run a container with the `-p` argument, for example: $ docker run -p 80:80 -d nginx ``` -Docker Desktop makes whatever is running on port 80 in the container, in -this case, `nginx`, available on port 80 of `localhost`. In this example, the -host and container ports are the same. If, for example, you already have something running on port 80 of -your host machine, you can connect the container to a different port: +Docker Desktop makes whatever is running on port `80` in the container, in +this case, `nginx`, available on port `80` of `localhost`. In this example, the +host and container ports are the same. + +To avoid conflicts with services already using port `80` on the host: ```console $ docker run -p 8000:80 -d nginx ``` -Now, connections to `localhost:8000` are sent to port 80 in the container. The -syntax for `-p` is `HOST_PORT:CLIENT_PORT`. +Now connections to `localhost:8000` are sent to port `80` in the container. + +> [!TIP] +> +> The syntax for `-p` is `HOST_PORT:CLIENT_PORT`. ### HTTP/HTTPS Proxy support @@ -53,10 +57,6 @@ See [Proxies](/manuals/desktop/settings-and-maintenance/settings.md#proxies) {{< summary-bar feature_name="SOCKS5 proxy support" >}} -> [!NOTE] -> -> Requires a Business subscription. - SOCKS (Socket Secure) is a protocol that facilitates the routing of network packets between a client and a server through a proxy server. It provides a way to enhance privacy, security, and network performance for users and applications. You can enable SOCKS proxy support to allow outgoing requests, such as pulling images, and access Linux container backend IPs from the host. @@ -72,7 +72,7 @@ To enable and set up SOCKS proxy support: ### SSH agent forwarding -Docker Desktop on Mac and Linux allows you to use the host’s SSH agent inside a container. To do this: +Docker Desktop for Mac and Linux lets you use the host’s SSH agent inside a container. To do this: 1. Bind mount the SSH agent socket by adding the following parameter to your `docker run` command: @@ -104,9 +104,9 @@ services: ### Changing internal IP addresses -The internal IP addresses used by Docker can be changed from **Settings**. After changing IPs, it is necessary to reset the Kubernetes cluster and to leave any active Swarm. +The internal IP addresses used by Docker can be changed from **Settings**. After changing IPs, you need to reset the Kubernetes cluster and to leave any active Swarm. -### There is no docker0 bridge on the host +### There is no `docker0` bridge on the host Because of the way networking is implemented in Docker Desktop, you cannot see a `docker0` interface on the host. This interface is actually within the @@ -127,7 +127,7 @@ However if you are a Windows user, per-container IP addressing is possible with ### I want to connect from a container to a service on the host The host has a changing IP address, or none if you have no network access. -We recommend that you connect to the special DNS name `host.docker.internal`, +Docker recommends you connect to the special DNS name `host.docker.internal`, which resolves to the internal IP address used by the host. You can also reach the gateway using `gateway.docker.internal`. @@ -154,7 +154,7 @@ If you have installed Python on your machine, use the following instructions as Port forwarding works for `localhost`. `--publish`, `-p`, or `-P` all work. Ports exposed from Linux are forwarded to the host. -We recommend you publish a port, or to connect from another +Docker recommends you publish a port, or to connect from another container. This is what you need to do even on Linux if the container is on an overlay network, not a bridge network, as these are not routed. diff --git a/content/manuals/desktop/features/synchronized-file-sharing.md b/content/manuals/desktop/features/synchronized-file-sharing.md index f424fe3291d6..d0ca03e66eb0 100644 --- a/content/manuals/desktop/features/synchronized-file-sharing.md +++ b/content/manuals/desktop/features/synchronized-file-sharing.md @@ -1,6 +1,6 @@ --- title: Synchronized file shares -weight: 30 +weight: 70 description: Get started with Synchronized file shares on Docker Desktop. keyword: mutagen, file sharing, docker desktop, bind mounts aliases: @@ -40,7 +40,7 @@ After creating a file share instance, any container using a bind mount that poin To create a file share instance: 1. Sign in to Docker Desktop. 2. In **Settings**, navigate to the **File sharing** tab within the **Resources** section. -3. In the **Synchronized File Shares** section, select the **Create share** icon. +3. In the **Synchronized file shares** section, select **Create share**. 4. Select a host folder to share. The synchronized file share should initialize and be usable. File shares take a few seconds to initialize as files are copied into the Docker Desktop VM. During this time, the status indicator displays **Preparing**. There is also a status icon in the footer of the Docker Desktop Dashboard that keeps you updated. @@ -53,7 +53,7 @@ When the status indicator displays **Watching for filesystem changes**, your fil > [!TIP] > -> Compose can now automatically create file shares for bind mounts. +> Docker Compose can automatically create file shares for bind mounts. > Ensure you're signed in to Docker with a paid subscription and have enabled both **Access experimental features** and **Manage Synchronized file shares with Compose** in Docker Desktop's settings. ## Explore your file share instance @@ -93,11 +93,3 @@ In general, use your `.syncignore` file to exclude items that aren't critical to - POSIX-style Windows paths are not supported. Avoid setting the [`COMPOSE_CONVERT_WINDOWS_PATHS`](/manuals/compose/how-tos/environment-variables/envvars.md#compose_convert_windows_paths) environment variable in Docker Compose. - If you don't have the correct permissions to create symbolic links and your container attempts to create symbolic links in your file share instance, an **unable to create symbolic link** error message displays. For Windows users, see Microsoft's [Create symbolic links documentation](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/security-policy-settings/create-symbolic-links) for best practices and location of the **Create symbolic links** security policy setting. For Mac and Linux users, check that you have write permissions on the folder. - -## Feedback and support - -To give feedback or report bugs, visit: - -- [Docker Desktop for Mac issues on GitHub](https://github.com/docker/for-mac/issues) -- [Docker Desktop for Windows issues on GitHub](https://github.com/docker/for-win/issues) -- [Docker Desktop for Linux issues on GitHub](https://github.com/docker/desktop-linux/issues) diff --git a/content/manuals/desktop/features/usbip.md b/content/manuals/desktop/features/usbip.md index e5625f7937ce..4e833dd2e054 100644 --- a/content/manuals/desktop/features/usbip.md +++ b/content/manuals/desktop/features/usbip.md @@ -1,7 +1,7 @@ --- title: Using USB/IP with Docker Desktop linkTitle: USB/IP support -weight: 100 +weight: 50 description: How to use USB/IP in Docker Desktop keywords: usb, usbip, docker desktop, macos, windows, linux toc_max: 3 @@ -11,15 +11,11 @@ aliases: {{< summary-bar feature_name="USB/IP support" >}} -> [!NOTE] -> -> Available on Docker Desktop for Mac, Linux, and Windows with the Hyper-V backend. - USB/IP enables you to share USB devices over the network, which can then be accessed from within Docker containers. This page focuses on sharing USB devices connected to the machine you run Docker Desktop on. You can repeat the following process to attach and use additional USB devices as needed. > [!NOTE] > -> The Docker Desktop VM kernel image comes pre-configured with drivers for many common USB devices, but Docker can't guarantee every possible USB device will work with this setup. +> Docker Desktop includes built-in drivers for many common USB devices but Docker can't guarantee every possible USB device works with this setup. ## Setup and use @@ -48,6 +44,8 @@ To attach the USB device, start a privileged Docker container with the PID names $ docker run --rm -it --privileged --pid=host alpine ``` +`--privileged` gives the container full access to the host, and `--pid=host` allows it to share the host’s process namespace. + ### Step three: Enter the mount namespace of PID 1 Inside the container, enter the mount namespace of the `init` process to gain access to the pre-installed USB/IP tools: @@ -56,7 +54,7 @@ Inside the container, enter the mount namespace of the `init` process to gain ac $ nsenter -t 1 -m ``` -### Step four: Use USB/IP tools +### Step four: Use the USB/IP tools Now you can use the USB/IP tools as you would on any other system: @@ -102,7 +100,7 @@ Example output: event0 mice ``` -### Step five: Use the attached device in another container +### Step five: Access the device from another container While the initial container remains running to keep the USB device operational, you can access the attached device from another container. For example: diff --git a/content/manuals/desktop/features/vmm.md b/content/manuals/desktop/features/vmm.md index d9fbc02ee702..fc9be6f8456a 100644 --- a/content/manuals/desktop/features/vmm.md +++ b/content/manuals/desktop/features/vmm.md @@ -8,18 +8,18 @@ aliases: - /desktop/vmm/ --- -{{< summary-bar feature_name="VMM" >}} +Docker Desktop supports multiple Virtual Machine Managers (VMMs) to power the Linux VM that runs containers. You can choose the most suitable option based on your system architecture (Intel or Apple Silicon), performance needs, and feature requirements. This page provides an overview of the available options. -The Virtual Machine Manager (VMM) in Docker Desktop for Mac is responsible for creating and managing the virtual machine used to run containers. Depending on your system architecture and performance needs, you can choose from multiple VMM options in Docker Desktop's [settings](/manuals/desktop/settings-and-maintenance/settings.md#general). This page provides an overview of the available options. +To change the VMM, go to **Settings** > **General** > **Virtual Machine Manager**. ## Docker VMM -Docker VMM is a new, container-optimized hypervisor introduced in Docker Desktop 4.35 and available on Apple Silicon Macs only. Its enhanced speed and resource efficiency makes it an ideal choice for optimizing your workflow. +{{< summary-bar feature_name="VMM" >}} -Docker VMM brings exciting advancements specifically tailored for Apple Silicon machines. By optimizing both the Linux kernel and hypervisor layers, Docker VMM delivers significant performance enhancements across common developer tasks. +Docker VMM is a new, container-optimized hypervisor. By optimizing both the Linux kernel and hypervisor layers, Docker VMM delivers significant performance enhancements across common developer tasks. Some key performance enhancements provided by Docker VMM include: - - Faster I/O operations: With a cold cache, iterating over a large shared filesystem with `find` is 2x faster than when the Apple Virtualization Framework is used. + - Faster I/O operations: With a cold cache, iterating over a large shared filesystem with `find` is 2x faster than when the Apple Virtualization framework is used. - Improved caching: With a warm cache, performance can improve by as much as 25x, even surpassing native Mac operations. These improvements directly impact developers who rely on frequent file access and overall system responsiveness during containerized development. Docker VMM marks a significant leap in speed, enabling smoother workflows and faster iteration cycles. @@ -35,9 +35,9 @@ As Docker VMM is still in Beta, there are a few known limitations: - Docker VMM does not currently support Rosetta, so emulation of amd64 architectures is slow. Docker is exploring potential solutions. - Certain databases, like MongoDB and Cassandra, may fail when using virtiofs with Docker VMM. This issue is expected to be resolved in a future release. -## Apple Virtualization Framework +## Apple Virtualization framework -The Apple Virtualization Framework is a stable and well-established option for managing virtual machines on Mac. It has been a reliable choice for many Mac users over the years. This framework is best suited for developers who prefer a proven solution with solid performance and broad compatibility. +The Apple Virtualization framework is a stable and well-established option for managing virtual machines on Mac. It has been a reliable choice for many Mac users over the years. This framework is best suited for developers who prefer a proven solution with solid performance and broad compatibility. ## QEMU (Legacy) for Apple Silicon @@ -47,7 +47,7 @@ The Apple Virtualization Framework is a stable and well-established option for m QEMU is a legacy virtualization option for Apple Silicon Macs, primarily supported for older use cases. -Docker recommends transitioning to newer alternatives, such as Docker VMM or the Apple Virtualization Framework, as they offer superior performance and ongoing support. Docker VMM, in particular, offers substantial speed improvements and a more efficient development environment, making it a compelling choice for developers working with Apple Silicon. +Docker recommends transitioning to newer alternatives, such as Docker VMM or the Apple Virtualization framework, as they offer superior performance and ongoing support. Docker VMM, in particular, offers substantial speed improvements and a more efficient development environment, making it a compelling choice for developers working with Apple Silicon. Note that this is not related to using QEMU to emulate non-native architectures in [multi-platform builds](/manuals/build/building/multi-platform.md#qemu). diff --git a/content/manuals/desktop/features/wasm.md b/content/manuals/desktop/features/wasm.md index 7cb281a4d104..eba9c67ed008 100644 --- a/content/manuals/desktop/features/wasm.md +++ b/content/manuals/desktop/features/wasm.md @@ -1,6 +1,6 @@ --- title: Wasm workloads -weight: 20 +weight: 90 description: How to run Wasm workloads with Docker Desktop keywords: Docker, WebAssembly, wasm, containerd, engine toc_max: 3 @@ -15,13 +15,16 @@ params: {{< summary-bar feature_name="Wasm workloads" >}} -Wasm (short for WebAssembly) is a fast, light alternative to the Linux and -Windows containers you’re using in Docker today (with -[some tradeoffs](https://www.docker.com/blog/docker-wasm-technical-preview/)). +WebAssembly (Wasm) is a fast, light alternative Linux and +Windows containers. With Docker Desktop, you can now run Wasm workloads side by side with traditional containers. -This page provides information about the new ability to run Wasm applications +This page provides information about the ability to run Wasm applications alongside your Linux containers in Docker. +> [!TIP] +> +> Learn more about Wasm use cases and tradeoffs in the [Docker Wasm technical preview blog post](https://www.docker.com/blog/docker-wasm-technical-preview/). + ## Turn on Wasm workloads Wasm workloads require the [containerd image store](containerd.md) @@ -34,9 +37,7 @@ then pre-existing images and containers will be inaccessible. 4. Select **Apply & restart** to save the settings. 5. In the confirmation dialog, select **Install** to install the Wasm runtimes. -Docker Desktop downloads and installs the following runtimes that you can use -to run Wasm workloads: - +Docker Desktop downloads and installs the following runtimes: - `io.containerd.slight.v1` - `io.containerd.spin.v2` - `io.containerd.wasmedge.v1` @@ -211,16 +212,5 @@ Update your Docker Desktop to the latest version and try again. ## Known issues -- Docker Compose may not exit cleanly when interrupted - - Workaround: Clean up `docker-compose` processes by sending them a SIGKILL - (`killall -9 docker-compose`). -- Pushes to Hub might give an error stating - `server message: insufficient_scope: authorization failed`, even after logging - in using Docker Desktop - - Workaround: Run `docker login` in the CLI - -## Feedback - -Thanks for trying out Wasm workloads with Docker. Give feedback or report any -bugs you may find through the issues tracker on the -[public roadmap item](https://github.com/docker/roadmap/issues/426). +- Docker Compose may not exit cleanly when interrupted. As a workaround, clean up `docker-compose` processes by sending them a SIGKILL (`killall -9 docker-compose`). +- Pushes to Docker Hub might give an error stating `server message: insufficient_scope: authorization failed`, even after signing in through Docker Desktop. As a workaround, run `docker login` in the CLI diff --git a/content/manuals/desktop/features/wsl/_index.md b/content/manuals/desktop/features/wsl/_index.md index 3c45bb9fd900..bba84c34e9e0 100644 --- a/content/manuals/desktop/features/wsl/_index.md +++ b/content/manuals/desktop/features/wsl/_index.md @@ -5,7 +5,7 @@ keywords: wsl, wsl2, installing wsl2, wsl installation, docker wsl2, wsl docker, tech preview, wsl install docker, install docker wsl, how to install docker in wsl title: Docker Desktop WSL 2 backend on Windows linkTitle: WSL -weight: 90 +weight: 120 aliases: - /docker-for-windows/wsl/ - /docker-for-windows/wsl-tech-preview/ diff --git a/data/summary.yaml b/data/summary.yaml index fe53413d5359..4fe1f4f08607 100644 --- a/data/summary.yaml +++ b/data/summary.yaml @@ -206,18 +206,18 @@ Registry access management: subscription: [Business] for: Administrators SOCKS5 proxy support: - requires: Docker Desktop [4.28.0](/manuals/desktop/release-notes.md#4280) and later + subscription: [Business] SSO: subscription: [Business] for: Administrators Synchronized file sharing: subscription: [Pro, Team, Business] - requires: Docker Desktop [4.27](/manuals/desktop/release-notes.md#4270) and later USB/IP support: requires: Docker Desktop [4.35.0](/manuals/desktop/release-notes.md#4350) and later + for: Docker Desktop for Mac, Linux, and Windows with the Hyper-V backend VMM: - availability: Beta requires: Docker Desktop [4.35.0](/manuals/desktop/release-notes.md#4350) and later + for: Docker Desktop on Mac with Apple Silicon Wasm workloads: availability: Beta Wasmtime: From 2f787e1284be39aa4683cbf6e8c4ec5dcb1693c6 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Wed, 9 Apr 2025 16:53:05 +0200 Subject: [PATCH 285/699] build: note about sunset of gha cache v1 (#22395) ## Description Note about sunset of GitHub Cache service v1 on April 15th, 2025. ## Related issues or tickets * https://gh.io/gha-cache-sunset * https://github.com/docker/build-push-action/issues/1345 * https://github.com/docker/setup-buildx-action/discussions/414 * https://github.com/moby/buildkit/issues/5896 * https://github.com/actions/runner-images/issues/11766#issuecomment-2779675129 ## Reviews - [x] Technical review - [x] Editorial review - [ ] Product review Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- .../manuals/build/ci/github-actions/cache.md | 62 ++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/content/manuals/build/ci/github-actions/cache.md b/content/manuals/build/ci/github-actions/cache.md index f005c97cd5c4..5626447e1e43 100644 --- a/content/manuals/build/ci/github-actions/cache.md +++ b/content/manuals/build/ci/github-actions/cache.md @@ -87,9 +87,9 @@ jobs: {{< summary-bar feature_name="Cache backend API" >}} The [GitHub Actions cache exporter](../../cache/backends/gha.md) -backend uses the [GitHub Cache API](https://github.com/tonistiigi/go-actions-cache/blob/master/api.md) +backend uses the [GitHub Cache service API](https://github.com/tonistiigi/go-actions-cache) to fetch and upload cache blobs. That's why you should only use this cache -backend in a GitHub Action workflow, as the `url` (`$ACTIONS_CACHE_URL`) and +backend in a GitHub Action workflow, as the `url` (`$ACTIONS_RESULTS_URL`) and `token` (`$ACTIONS_RUNTIME_TOKEN`) attributes only get populated in a workflow context. @@ -121,6 +121,64 @@ jobs: cache-to: type=gha,mode=max ``` +> [!IMPORTANT] +> +> Starting [April 15th, 2025, only GitHub Cache service API v2 will be supported](https://gh.io/gha-cache-sunset). +> +> If you encounter the following error during your build: +> +> ```console +> ERROR: failed to solve: This legacy service is shutting down, effective April 15, 2025. Migrate to the new service ASAP. For more information: https://gh.io/gha-cache-sunset +> ``` +> +> You're probably using outdated tools that only support the legacy GitHub +> Cache service API v1. Here are the minimum versions you need to upgrade to +> depending on your use case: +> * Docker Buildx >= v0.21.0 +> * BuildKit >= v0.20.0 +> * Docker Compose >= v2.33.1 +> * Docker Engine >= v28.0.0 (if you're building using the Docker driver with containerd image store enabled) +> +> If you're building using the `docker/build-push-action` or `docker/bake-action` +> actions on GitHub hosted runners, Docker Buildx and BuildKit are already up +> to date but on self-hosted runners, you may need to update them yourself. +> Alternatively, you can use the `docker/setup-buildx-action` action to install +> the latest version of Docker Buildx: +> +> ```yaml +> - name: Set up Docker Buildx +> uses: docker/setup-buildx-action@v3 +> with: +> version: latest +> ``` +> +> If you're building using Docker Compose, you can use the +> `docker/setup-compose-action` action: +> +> ```yaml +> - name: Set up Docker Compose +> uses: docker/setup-compose-action@v1 +> with: +> version: latest +> ``` +> +> If you're building using the Docker Engine with the containerd image store +> enabled, you can use the `docker/setup-docker-action` action: +> +> ```yaml +> - +> name: Set up Docker +> uses: docker/setup-docker-action@v4 +> with: +> version: latest +> daemon-config: | +> { +> "features": { +> "containerd-snapshotter": true +> } +> } +> ``` + ### Cache mounts BuildKit doesn't preserve cache mounts in the GitHub Actions cache by default. From 9f6a8362cab1e0ff1e2a908728db633d3d02c070 Mon Sep 17 00:00:00 2001 From: Craig Osterhout <103533812+craig-osterhout@users.noreply.github.com> Date: Wed, 9 Apr 2025 09:01:16 -0700 Subject: [PATCH 286/699] trusted content: align doi description (#22370) ## Description Better align the DOI description. ## Related issues or tickets ENGDOCS-2535 ## Reviews - [ ] Editorial review - [ ] Product review Signed-off-by: Craig --- content/manuals/build/building/base-images.md | 5 ++--- content/manuals/build/building/best-practices.md | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/content/manuals/build/building/base-images.md b/content/manuals/build/building/base-images.md index 32ae78d8c469..17770a834eb7 100644 --- a/content/manuals/build/building/base-images.md +++ b/content/manuals/build/building/base-images.md @@ -22,9 +22,8 @@ For most cases, you don't need to create your own base image. Docker Hub contains a vast library of Docker images that are suitable for use as a base image in your build. [Docker Official Images](../../docker-hub/image-library/trusted-content.md#docker-official-images) -are specifically designed as a set of hardened, battle-tested images that -support a wide variety of platforms, languages, and frameworks. There are also -[Docker Verified +have clear documentation, promote best practices, and are regularly updated +There are also [Docker Verified Publisher](../../docker-hub/image-library/trusted-content.md#verified-publisher-images) images, created by trusted publishing partners, verified by Docker. diff --git a/content/manuals/build/building/best-practices.md b/content/manuals/build/building/best-practices.md index 61064998b33b..68ea0de2672b 100644 --- a/content/manuals/build/building/best-practices.md +++ b/content/manuals/build/building/best-practices.md @@ -46,9 +46,9 @@ image. When choosing an image, ensure it's built from a trusted source and keep it small. - [Docker Official Images](https://hub.docker.com/search?image_filter=official) - are some of the most secure and dependable images on Docker Hub. Typically, - Docker Official images have few or no packages containing CVEs, and are - thoroughly reviewed by Docker and project maintainers. + are a curated collection that have clear documentation, promote best + practices, and are regularly updated. They provide a trusted starting point + for many applications. - [Verified Publisher](https://hub.docker.com/search?image_filter=store) images are high-quality images published and maintained by the organizations From e22f722442a0d10c555b78b4bacba70ae11c1e2f Mon Sep 17 00:00:00 2001 From: Craig Osterhout <103533812+craig-osterhout@users.noreply.github.com> Date: Wed, 9 Apr 2025 09:01:52 -0700 Subject: [PATCH 287/699] hub & subscription: add go redirects (#22390) ## Description Added some vanity URLs for in-product links. ## Related issues or tickets BILL-2804 ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review Signed-off-by: Craig --- data/redirects.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/redirects.yml b/data/redirects.yml index be2a57af96fd..2cd45096e3a5 100644 --- a/data/redirects.yml +++ b/data/redirects.yml @@ -288,3 +288,9 @@ - /go/insights-images/ "/admin/organization/insights/#extensions": - /go/insights-extensions/ + +# Billing - cancellation +"/subscription/desktop-license/": + - /go/desktop-license/ +"/docker-hub/usage/pulls/": + - /go/hub-pull-limits/ From b720d48b048bd4ca3e5f177e9f8c41a558581cf4 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Wed, 9 Apr 2025 12:59:22 -0400 Subject: [PATCH 288/699] fix: settings management moved in AC UI (#22399) ## Description - Settings management has moved, this PR fixes this. I will update the UI tests as well ## Related issues or tickets - https://github.com/docker/docs/issues/22398 ## Reviews - [ ] Editorial review --- .../hardened-desktop/settings-management/_index.md | 5 +++-- .../settings-management/compliance-reporting.md | 2 +- .../settings-management/configure-admin-console.md | 9 +++++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md index bea9a3883877..a09f0ed2ba07 100644 --- a/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md @@ -25,10 +25,11 @@ For an extra layer of security, you can also use Settings Management to enable a ## How does it work? You can configure several Docker Desktop settings using either: + - An `admin-settings.json` file. This file is located on the Docker Desktop host and can only be accessed by developers with root or administrator privileges. - - Creating a settings policy in the Docker Admin Console + - Creating a settings policy in the Docker Admin Console. -Settings that are defined by an administrator override any previous values set by developers and ensure that these cannot be modified. +Settings that are defined by an administrator override any previous values set by developers and ensure that these cannot be modified. ## What features can I configure with Settings Management? diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/compliance-reporting.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/compliance-reporting.md index c556b435fe21..ffa67066c87d 100644 --- a/content/manuals/security/for-admins/hardened-desktop/settings-management/compliance-reporting.md +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/compliance-reporting.md @@ -50,7 +50,7 @@ This opens the Desktop settings reporting page. From here you can: 1. Sign in to the [Admin Console](https://app.docker.com/admin). 2. Select your organization or company from the **Choose profile** page. -3. Under Docker Desktop, select **Reporting**. By default, non-compliant users +3. Under **Docker Desktop**, select **Reporting**. By default, non-compliant users are displayed. 4. Optional. Select the **Hide compliant users** checkbox to show both compliant and non-compliant users. diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md index 6916938c3efd..646685fc950a 100644 --- a/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md @@ -20,9 +20,9 @@ organization for configurations to take effect. ## Create a settings policy -1. Within the [Docker Admin Console](https://admin.docker.com/) navigate to the company or organization you want to define a settings policy for. -2. Under the **Security and access** section, select **Desktop Settings Management**. -3. In the top-right corner, select **Create a settings policy**. +1. Within the [Docker Admin Console](https://app.docker.com/admin) navigate to the company or organization you want to define a settings policy for. +2. Under the **Docker Desktop** section, select **Settings Management**. +3. Select **Create a settings policy**. 4. Give your settings policy a name and an optional description. > [!TIP] @@ -68,7 +68,8 @@ If your settings policy needs to be rolled back, either delete the policy or edi ## Settings policy actions -From the **Actions** menu on the **Desktop Settings Management** page in the Docker Admin Console, you can: +From the **Actions** menu on the **Settings Management** page in the Docker Admin Console, you can: + - Edit or delete an existing settings policy. - Export a settings policy as an `admin-settings.json` file. - Promote a policy that is applied to a select group of users, to be the new global default policy for all users. \ No newline at end of file From 6057a7b51f5aebef7fccad80b98cc65234a2dd9f Mon Sep 17 00:00:00 2001 From: Nicolas De loof Date: Thu, 10 Apr 2025 10:30:57 +0200 Subject: [PATCH 289/699] fix use of x-* attribute in go templates (#22403) ## Description fix https://docs.docker.com/compose/bridge/customize/#add-your-own-templates as attributes with a `-` can't be accessed directly using dot-notation in a go template. See https://stackoverflow.com/questions/48146448/range-through-values-within-variable-containing-dashes-in-golang-templates ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review Signed-off-by: Nicolas De Loof --- content/manuals/compose/bridge/customize.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/manuals/compose/bridge/customize.md b/content/manuals/compose/bridge/customize.md index 62bdcb880ddb..d978ecf6b9fa 100644 --- a/content/manuals/compose/bridge/customize.md +++ b/content/manuals/compose/bridge/customize.md @@ -133,8 +133,8 @@ metadata: spec: rules: {{ range $name, $service := .services }} -{{ if $service.x-virtual-host }} - - host: ${{ $service.x-virtual-host }} +{{ range index $service "x-virtual-host" }} + - host: ${{ . }} http: paths: - path: "/" From 09fabd2fa0f57277130f13146541598529501962 Mon Sep 17 00:00:00 2001 From: Lorenz Vanthillo Date: Thu, 10 Apr 2025 10:55:47 +0200 Subject: [PATCH 290/699] BuildKit supports multiple cache exporters Related to https://github.com/docker/docs/issues/18590 --- content/manuals/build/cache/backends/_index.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/content/manuals/build/cache/backends/_index.md b/content/manuals/build/cache/backends/_index.md index 6dd4a8a9dee9..de54ea0f6cec 100644 --- a/content/manuals/build/cache/backends/_index.md +++ b/content/manuals/build/cache/backends/_index.md @@ -81,12 +81,11 @@ $ docker buildx build --push -t / \ ## Multiple caches -BuildKit currently only supports -[a single cache exporter](https://github.com/moby/buildkit/pull/3024). But you -can import from as many remote caches as you like. For example, a common pattern -is to use the cache of both the current branch and the main branch. The -following example shows importing cache from multiple locations using the -registry cache backend: +BuildKit supports multiple cache exporters, allowing you to push cache to more +than one destination. You can also import from as many remote caches as you'd +like. For example, a common pattern is to use the cache of both the current +branch and the main branch. The following example shows importing cache from +multiple locations using the registry cache backend: ```console $ docker buildx build --push -t / \ From 258e17544bc1ff8c5cab4fd872bf3f88214be80c Mon Sep 17 00:00:00 2001 From: Lorena Rangel Date: Thu, 10 Apr 2025 11:22:56 +0200 Subject: [PATCH 291/699] Update update release notes (#22407) ## Description Updates the line about the removal of `com.docker.admin`, as it is still present (and used) on Windows. ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/desktop/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/desktop/release-notes.md b/content/manuals/desktop/release-notes.md index 144b0ecc6f34..275183a50ed0 100644 --- a/content/manuals/desktop/release-notes.md +++ b/content/manuals/desktop/release-notes.md @@ -57,7 +57,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo - Fixed a race condition that prevented Docker Desktop Kubernetes from starting in some scenarios. - Improved the way ECI collects image digest info from a repository in environments where proxies are configured. - Users can now to specify a timeout when generating a private Extension Marketplace using the new `--timeout` flag. -- Removed unused internal helper tool `com.docker.admin`. +- Removed unused internal helper tool `com.docker.admin` for Mac and Linux. #### For Mac From 72953fc0e326645e1872bfe9bad12f7e2a411dba Mon Sep 17 00:00:00 2001 From: Mathieu Champlon Date: Thu, 10 Apr 2025 16:44:47 +0200 Subject: [PATCH 292/699] Remove obsolete a/b testing service (#22409) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description We’re removing this unused service. ## Related issues or tickets https://docker.atlassian.net/browse/DKP-2125 ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/desktop/setup/allow-list.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/manuals/desktop/setup/allow-list.md b/content/manuals/desktop/setup/allow-list.md index 92dc1d882002..3858c242f36e 100644 --- a/content/manuals/desktop/setup/allow-list.md +++ b/content/manuals/desktop/setup/allow-list.md @@ -19,7 +19,6 @@ This page contains the domain URLs that you need to add to a firewall allowlist | ------------------------------------------------------------------------------------ | -------------------------------------------- | | https://api.segment.io | Analytics | | https://cdn.segment.com | Analytics | -| https://experiments.docker.com | A/B testing | | https://notify.bugsnag.com | Error reports | | https://sessions.bugsnag.com | Error reports | | https://auth.docker.io | Authentication | From 7e76be01b2fad63f233a06248a06d60d147c7224 Mon Sep 17 00:00:00 2001 From: Guillaume Lours <705411+glours@users.noreply.github.com> Date: Thu, 10 Apr 2025 17:35:11 +0200 Subject: [PATCH 293/699] release-notes for Compose v2.35.0 version (#22411) ## Description Add release notes for latest Docker Compose `v2.35.0` version ## Related issues or tickets https://docker.atlassian.net/browse/APCLI-1094 ## Reviews - [ ] Technical review - [x] Editorial review - [ ] Product review --------- Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- .../compose/v2/docs/reference/compose.md | 8 +- .../v2/docs/reference/compose_build.md | 1 + .../v2/docs/reference/compose_config.md | 1 + .../compose/v2/docs/reference/compose_run.md | 2 + .../v2/docs/reference/compose_watch.md | 2 +- .../v2/docs/reference/docker_compose.yaml | 6 +- .../docs/reference/docker_compose_build.yaml | 10 +++ .../docs/reference/docker_compose_config.yaml | 10 +++ .../v2/docs/reference/docker_compose_run.yaml | 21 +++++ .../docs/reference/docker_compose_watch.yaml | 2 +- _vendor/modules.txt | 4 +- .../manuals/compose/releases/release-notes.md | 80 ++++++++++++------- go.mod | 10 ++- go.sum | 2 + hugo.yaml | 2 +- 15 files changed, 116 insertions(+), 45 deletions(-) diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/compose.md b/_vendor/github.com/docker/compose/v2/docs/reference/compose.md index cf858c1767ed..d1a1c2a46272 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/compose.md +++ b/_vendor/github.com/docker/compose/v2/docs/reference/compose.md @@ -78,10 +78,10 @@ to their predecessors. For example, consider this command line: ```console -$ docker compose -f docker-compose.yml -f docker-compose.admin.yml run backup_db +$ docker compose -f compose.yaml -f compose.admin.yaml run backup_db ``` -The `docker-compose.yml` file might specify a `webapp` service. +The `compose.yaml` file might specify a `webapp` service. ```yaml services: @@ -92,7 +92,7 @@ services: volumes: - "/data" ``` -If the `docker-compose.admin.yml` also specifies this same service, any matching fields override the previous file. +If the `compose.admin.yaml` also specifies this same service, any matching fields override the previous file. New values, add to the `webapp` service configuration. ```yaml @@ -207,4 +207,4 @@ $ docker compose --dry-run up --build -d From the example above, you can see that the first step is to pull the image defined by `db` service, then build the `backend` service. Next, the containers are created. The `db` service is started, and the `backend` and `proxy` wait until the `db` service is healthy before starting. -Dry Run mode works with almost all commands. You cannot use Dry Run mode with a command that doesn't change the state of a Compose stack such as `ps`, `ls`, `logs` for example. +Dry Run mode works with almost all commands. You cannot use Dry Run mode with a command that doesn't change the state of a Compose stack such as `ps`, `ls`, `logs` for example. diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/compose_build.md b/_vendor/github.com/docker/compose/v2/docs/reference/compose_build.md index 53150cdd8688..98d573e44c38 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/compose_build.md +++ b/_vendor/github.com/docker/compose/v2/docs/reference/compose_build.md @@ -20,6 +20,7 @@ run `docker compose build` to rebuild it. | `--dry-run` | `bool` | | Execute command in dry run mode | | `-m`, `--memory` | `bytes` | `0` | Set memory limit for the build container. Not supported by BuildKit. | | `--no-cache` | `bool` | | Do not use cache when building the image | +| `--print` | `bool` | | Print equivalent bake file | | `--pull` | `bool` | | Always attempt to pull a newer version of the image | | `--push` | `bool` | | Push service images | | `-q`, `--quiet` | `bool` | | Don't print anything to STDOUT | diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/compose_config.md b/_vendor/github.com/docker/compose/v2/docs/reference/compose_config.md index 0eac3de63718..9e87efd29cbc 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/compose_config.md +++ b/_vendor/github.com/docker/compose/v2/docs/reference/compose_config.md @@ -19,6 +19,7 @@ the canonical format. | `--hash` | `string` | | Print the service config hash, one per line. | | `--images` | `bool` | | Print the image names, one per line. | | `--no-consistency` | `bool` | | Don't check model consistency - warning: may produce invalid Compose output | +| `--no-env-resolution` | `bool` | | Don't resolve service env files | | `--no-interpolate` | `bool` | | Don't interpolate environment variables | | `--no-normalize` | `bool` | | Don't normalize compose model | | `--no-path-resolution` | `bool` | | Don't resolve file paths | diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/compose_run.md b/_vendor/github.com/docker/compose/v2/docs/reference/compose_run.md index e4be01d2db1c..25b28d1ded85 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/compose_run.md +++ b/_vendor/github.com/docker/compose/v2/docs/reference/compose_run.md @@ -74,6 +74,8 @@ specified in the service configuration. | `--no-deps` | `bool` | | Don't start linked services | | `-p`, `--publish` | `stringArray` | | Publish a container's port(s) to the host | | `--pull` | `string` | `policy` | Pull image before running ("always"\|"missing"\|"never") | +| `-q`, `--quiet` | `bool` | | Don't print anything to STDOUT | +| `--quiet-build` | `bool` | | Suppress progress output from the build process | | `--quiet-pull` | `bool` | | Pull without printing progress information | | `--remove-orphans` | `bool` | | Remove containers for services not defined in the Compose file | | `--rm` | `bool` | | Automatically remove the container when it exits | diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/compose_watch.md b/_vendor/github.com/docker/compose/v2/docs/reference/compose_watch.md index e2b4aef1a203..f6040c9094f2 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/compose_watch.md +++ b/_vendor/github.com/docker/compose/v2/docs/reference/compose_watch.md @@ -9,7 +9,7 @@ Watch build context for service and rebuild/refresh containers when files are up |:------------|:-------|:--------|:----------------------------------------------| | `--dry-run` | `bool` | | Execute command in dry run mode | | `--no-up` | `bool` | | Do not build & start services before watching | -| `--prune` | `bool` | | Prune dangling images on rebuild | +| `--prune` | `bool` | `true` | Prune dangling images on rebuild | | `--quiet` | `bool` | | hide build output | diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose.yaml b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose.yaml index a31cb41082eb..58ec47802a55 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose.yaml +++ b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose.yaml @@ -241,10 +241,10 @@ examples: |- For example, consider this command line: ```console - $ docker compose -f docker-compose.yml -f docker-compose.admin.yml run backup_db + $ docker compose -f compose.yaml -f compose.admin.yaml run backup_db ``` - The `docker-compose.yml` file might specify a `webapp` service. + The `compose.yaml` file might specify a `webapp` service. ```yaml services: @@ -255,7 +255,7 @@ examples: |- volumes: - "/data" ``` - If the `docker-compose.admin.yml` also specifies this same service, any matching fields override the previous file. + If the `compose.admin.yaml` also specifies this same service, any matching fields override the previous file. New values, add to the `webapp` service configuration. ```yaml diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_build.yaml b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_build.yaml index 92285de2efb3..3f53dcf73628 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_build.yaml +++ b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_build.yaml @@ -96,6 +96,16 @@ options: experimentalcli: false kubernetes: false swarm: false + - option: print + value_type: bool + default_value: "false" + description: Print equivalent bake file + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false - option: progress value_type: string default_value: auto diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_config.yaml b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_config.yaml index 8073d85ab6e0..15b1e7dc3989 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_config.yaml +++ b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_config.yaml @@ -59,6 +59,16 @@ options: experimentalcli: false kubernetes: false swarm: false + - option: no-env-resolution + value_type: bool + default_value: "false" + description: Don't resolve service env files + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false - option: no-interpolate value_type: bool default_value: "false" diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_run.yaml b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_run.yaml index 6e6ec71f8d0a..61c7ca0e8cbc 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_run.yaml +++ b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_run.yaml @@ -200,6 +200,27 @@ options: experimentalcli: false kubernetes: false swarm: false + - option: quiet + shorthand: q + value_type: bool + default_value: "false" + description: Don't print anything to STDOUT + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false + - option: quiet-build + value_type: bool + default_value: "false" + description: Suppress progress output from the build process + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false - option: quiet-pull value_type: bool default_value: "false" diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_watch.yaml b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_watch.yaml index 454bf36342ad..a3e3e8022011 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_watch.yaml +++ b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_watch.yaml @@ -19,7 +19,7 @@ options: swarm: false - option: prune value_type: bool - default_value: "false" + default_value: "true" description: Prune dangling images on rebuild deprecated: false hidden: false diff --git a/_vendor/modules.txt b/_vendor/modules.txt index 05e4f687fd63..add37c275805 100644 --- a/_vendor/modules.txt +++ b/_vendor/modules.txt @@ -1,6 +1,6 @@ # github.com/moby/moby v28.0.2+incompatible # github.com/moby/buildkit v0.20.1 # github.com/docker/buildx v0.22.0 -# github.com/docker/cli v28.0.2+incompatible -# github.com/docker/compose/v2 v2.34.0 +# github.com/docker/cli v28.0.4+incompatible +# github.com/docker/compose/v2 v2.35.0 # github.com/docker/scout-cli v1.15.0 diff --git a/content/manuals/compose/releases/release-notes.md b/content/manuals/compose/releases/release-notes.md index 9d67e1e17427..3b59ca3b7474 100644 --- a/content/manuals/compose/releases/release-notes.md +++ b/content/manuals/compose/releases/release-notes.md @@ -13,6 +13,28 @@ aliases: For more detailed information, see the [release notes in the Compose repo](https://github.com/docker/compose/releases/). +## 2.35.0 + +{{< release-date date="2025-04-10" >}} + +### Bug fixes and enhancements + +- Added support for Docker Model Runner to easily integrate AI models into your Compose applications +- Added `build --print` command to help debug complex build configurations by showing the equivalent bake file +- Added `volume.type=image` to provide more flexible volume management for container images +- Added `--quiet` options to the `run` command for cleaner output when running containers +- Added `config --no-env-resolution` option to view raw configuration without environment variable substitution +- Fixed behavior of `depends_on` to prevent unnecessary container recreation when dependencies change +- Fixed support for secrets defined by environment variables when using `include` +- Fixed volume mount handling to ensure bind mounts work correctly in all scenarios + +### Update + +- Dependencies upgrade: bump compose-go to v2.6.0 +- Dependencies upgrade: bump docker engine and cli to v28.0.4 +- Dependencies upgrade: bump buildx to v0.22.0 + + ## 2.34.0 {{< release-date date="2025-03-14" >}} @@ -32,13 +54,13 @@ For more detailed information, see the [release notes in the Compose repo](https - Dependencies upgrade: Bump compose-go v2.4.9 - Dependencies upgrade: Bump buildx v0.21.2 -## 2.33.1 +## 2.33.1 {{< release-date date="2025-02-21" >}} ### Bug fixes and enhancements -- Added support for `gw_priority`, `enable_ipv4` (requires Docker v28.0) +- Added support for `gw_priority`, `enable_ipv4` (requires Docker v28.0) - Fixed an issue with the navigation menu - Improved error message when using non-file secret/config with read-only service @@ -198,7 +220,7 @@ For more detailed information, see the [release notes in the Compose repo](https ### Bug fixes and enhancements -- Fixed an issue re-creating services when updating its profiles +- Fixed an issue re-creating services when updating its profiles - Fixed a regression when using the same YAML anchor multiple times in a Compose file ## 2.30.1 @@ -271,7 +293,7 @@ For more detailed information, see the [release notes in the Compose repo](https ### Bug fixes and enhancements -- Fixed an issue with services not stopping when restarting diverged dependencies. +- Fixed an issue with services not stopping when restarting diverged dependencies. - Fixed potential `nil` pointer error on the OTEL client. ## 2.29.3 @@ -285,7 +307,7 @@ For more detailed information, see the [release notes in the Compose repo](https ### Bug fixes and enhancements -- Combination of bind mount and `rebuild` are now allowed with `watch`. +- Combination of bind mount and `rebuild` are now allowed with `watch`. - Fixed a bug recreating containers when `--no-deps` is used with `up`. - Fixed a bug not closing streams when reattaching containers. - Restored recreation of anonymous volumes when using `-V` or `--renew-anon-volumes`. @@ -484,8 +506,8 @@ For more detailed information, see the [release notes in the Compose repo](https ### Bug fixes and enhancements -- Compose now ensures stable priority sort order for networks -- Fixed interpolation with curly braces (e.g. JSON) in default values +- Compose now ensures stable priority sort order for networks +- Fixed interpolation with curly braces (e.g. JSON) in default values - Fixed validation for non-unique `container_name` values - Fixed validation for `develop.watch` - Fixed environment loading for `include` @@ -580,15 +602,15 @@ This release fixes a build issue with Docker Desktop for Windows introduced in C - Dependencies upgrade: bump cli to 25.0.0-beta.3 - Dependencies upgrade: bump compose-go to 2.0.0-beta.3 -- Dependencies upgrade: bump golang to 1.21.6 +- Dependencies upgrade: bump golang to 1.21.6 ### Bug fixes and enhancements - Introduced `docker compose attach` to attach local standard input, output, and error streams to a service's running container. - Introduced `docker compose stats` to display a live stream of container(s) resource usage statistics. - Introduced `docker compose ps --orphans` to include/exclude services not declared. -- Introduced `docker compose logs --index` to select a replica container. -- Introduced `docker compose build --with-dependencies` to also build dependencies. +- Introduced `docker compose logs --index` to select a replica container. +- Introduced `docker compose build --with-dependencies` to also build dependencies. - Added source policies for build. - Included disabled services for shell completion. - Restored `Project` in ps JSON output. @@ -615,9 +637,9 @@ This release fixes a build issue with Docker Desktop for Windows introduced in C ### Update -- Dependencies upgrade: bump buildkit 0.12.3 -- Dependencies upgrade: bump docker 24.0.7 -- Dependencies upgrade: bump cli 24.0.7 +- Dependencies upgrade: bump buildkit 0.12.3 +- Dependencies upgrade: bump docker 24.0.7 +- Dependencies upgrade: bump cli 24.0.7 - Dependencies upgrade: bump 1.20.2 ### Bug fixes and enhancements @@ -641,7 +663,7 @@ This release fixes a build issue with Docker Desktop for Windows introduced in C - Introduced `--resolve-image-digests` so users can seal service images by digest when publishing a Compose application. - Improved Compose Watch configuration logging. - Compose now rejects a Compose file using `secrets|configs.driver` or `template_driver`. -- Compose now fails to start if a dependency is missing. +- Compose now fails to start if a dependency is missing. - Fixed SIGTERM support to stop/kill stack. - Fixed a `--hash` regression. - Fixed "Application failed to start after update" when an external network is on a watched service. @@ -775,7 +797,7 @@ This release fixes a build issue with Docker Desktop for Windows introduced in C * Fixed a DryRun mode issue when initializing CLI client. * Fixed a bug with random missing network when a service has more than one. * Fixed the Secrets file permission value to comply with the Compose Specification. -* Fixed an issue about `no-deps` flag not being applied. +* Fixed an issue about `no-deps` flag not being applied. * Fixed some source code comments. * Fixed a bug when `--index` is not set select. * Fixed a process leak in the wait e2e test. @@ -813,7 +835,7 @@ This release fixes a build issue with Docker Desktop for Windows introduced in C - Introduced `run --cap-add` to run maintenance commands using service image. - Fixed a bug during detection of swarm mode. - Fixed a bug when setting the project name via `COMPOSE_PROJECT_NAME` environment variable. -- Adjusted the display of the volumes flag with the help of `down` command. +- Adjusted the display of the volumes flag with the help of `down` command. - Fixed a bug in the `up` command which should not silently ignore missing `depends_on` services. - Aligned forward signal to container behaviour with the `docker run` one. - Compose now detects network name conflict. @@ -1072,10 +1094,10 @@ This release fixes a build issue with Docker Desktop for Windows introduced in C - Fixed race condition when collecting pulled images IDs. Fixed [compose#9897](https://github.com/docker/compose/pull/9897) - Compose doesn't stop the `pull` command for images that can be built. Fixed [compose#8724](https://github.com/docker/compose/pull/8724) - Fixed corner case when there's no container to attach to. Fixed [compose#8752](https://github.com/docker/compose/pull/8752) -- Compose containers' startup must run sequentially for engine to assign distinct ports within a configured range. Fixed +- Compose containers' startup must run sequentially for engine to assign distinct ports within a configured range. Fixed [compose#8530](https://github.com/docker/compose/pull/8530) - Fixed parsing of `repository:tag`. Fixed [compose#9208](https://github.com/docker/compose/pull/9208) -- Load project from files when explicitly set by user. Fixed [compose#9554](https://github.com/docker/compose/pull/9554) +- Load project from files when explicitly set by user. Fixed [compose#9554](https://github.com/docker/compose/pull/9554) ## 2.14.0 @@ -1343,7 +1365,7 @@ In this release, Docker Compose recreates new resources (networks, volumes, secr ### Bug fixes and enhancements - Fixed interpolation error message output. Fixes [compose-spec/compose-go#292](https://github.com/compose-spec/compose-go/pull/292). -- Defined precedence of the environment variables evaluation. Fixes [compose#9521](https://github.com/docker/compose/issues/9606), +- Defined precedence of the environment variables evaluation. Fixes [compose#9521](https://github.com/docker/compose/issues/9606), [compose#9638](https://github.com/docker/compose/issues/9638), [compose#9608](https://github.com/docker/compose/issues/9608), [compose#9578](https://github.com/docker/compose/issues/9578). @@ -1365,7 +1387,7 @@ For the full change log or additional information, check the [Compose repository ### Updates -- Dependencies upgrade: bumped [go to 1.18.4](https://github.com/golang/go/compare/go1.18.3...go1.18.4). +- Dependencies upgrade: bumped [go to 1.18.4](https://github.com/golang/go/compare/go1.18.3...go1.18.4). - Dependencies upgrade: bumped [compose-go to v1.2.9](https://github.com/compose-spec/compose-go/releases/tag/v1.2.9). ### Bug fixes and enhancements @@ -1448,7 +1470,7 @@ For the full change log or additional information, check the [Compose repository - Dependencies update: bumping [compose-go to 1.2.6](https://github.com/compose-spec/compose-go/releases/tag/v1.2.6). - Dependencies update: bumping [compose-go to 1.2.7](https://github.com/compose-spec/compose-go/releases/tag/v1.2.7). -- Dependencies update: bumping [golang to 1.18](https://go.dev/doc/devel/release#go1.18). +- Dependencies update: bumping [golang to 1.18](https://go.dev/doc/devel/release#go1.18). ### Bug fixes and enhancements @@ -1511,10 +1533,10 @@ For the full change log or additional information, check the [Compose repository - Added ssh config to the build options when building an image from a `docker compose up` command. Fixes [#9338](https://github.com/docker/compose/issues/9338). - Added inspection to container checking if a TTY is required. Running services with `tty:true` specified now show console output. Fixes [#9288](https://github.com/docker/compose/issues/9288). -For the full change log or additional information, check the [Compose repository 2.4.1 release page](https://github.com/docker/compose/releases/tag/v2.4.1). +For the full change log or additional information, check the [Compose repository 2.4.1 release page](https://github.com/docker/compose/releases/tag/v2.4.1). -## 2.4.0 +## 2.4.0 {{< release-date date="2022-04-1" >}} @@ -1536,10 +1558,10 @@ For the full change log or additional information, check the [Compose repository - Removed code regarding an obsolete warning. - Vendor: github.com/containerd/containerd v1.6.2. Includes a fix for CVE-2022-24769 (doesn't affect our codebase). -For the full change log or additional information, check the [Compose repository 2.4.0 release page](https://github.com/docker/compose/releases/tag/v2.4.0). +For the full change log or additional information, check the [Compose repository 2.4.0 release page](https://github.com/docker/compose/releases/tag/v2.4.0). -## 2.3.4 +## 2.3.4 {{< release-date date="2022-03-25" >}} @@ -1551,7 +1573,7 @@ For the full change log or additional information, check the [Compose repository - Removed a container with no candidate now produces a warning instead of an error. Fixes [#9255](https://github.com/docker/compose/issues/9255). - Removed the "Deprecated" mentions from -i and -t options to run and exec commands. These options are on by default and in use. Fixes [#9229](https://github.com/docker/compose/pull/9229#discussion_r819730788). -- Removed the "Deprecated" mention from the --filter flag, to keep consistency with other commands. +- Removed the "Deprecated" mention from the --filter flag, to keep consistency with other commands. - Removed the need to get the original compose.yaml file to run 'docker compose kill'. ### Updates @@ -1567,9 +1589,9 @@ For the full change log or additional information, check the [Compose repository Fixes [#9172](https://github.com/docker/compose/issues/9172), [#9145](https://github.com/docker/compose/issues/9145). - Changed Compose API reference docs automation to pick up diffs code vs. docs. -For the full change log or additional information, check the [Compose repository 2.3.4 release page](https://github.com/docker/compose/releases/tag/v2.3.4). +For the full change log or additional information, check the [Compose repository 2.3.4 release page](https://github.com/docker/compose/releases/tag/v2.3.4). -## Other Releases +## Other Releases (2022-03-8 to 2022-04-14) @@ -1701,7 +1723,7 @@ For a list of PRs and issues fixed in this release, see [Compose 1.28.3](https:/ - CI setup update -## 1.28.0 +## 1.28.0 (2021-01-20) diff --git a/go.mod b/go.mod index b4589b26c998..7bb751dbd1d1 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,13 @@ module github.com/docker/docs -go 1.23.6 +go 1.23.8 + +toolchain go1.24.1 require ( github.com/docker/buildx v0.22.0 // indirect - github.com/docker/cli v28.0.2+incompatible // indirect - github.com/docker/compose/v2 v2.34.0 // indirect + github.com/docker/cli v28.0.4+incompatible // indirect + github.com/docker/compose/v2 v2.35.0 // indirect github.com/docker/scout-cli v1.15.0 // indirect github.com/moby/buildkit v0.20.1 // indirect github.com/moby/moby v28.0.2+incompatible // indirect @@ -14,7 +16,7 @@ require ( replace ( github.com/docker/buildx => github.com/docker/buildx v0.22.0 github.com/docker/cli => github.com/docker/cli v28.0.2+incompatible - github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.34.0 + github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.35.0 github.com/docker/scout-cli => github.com/docker/scout-cli v1.15.0 github.com/moby/buildkit => github.com/moby/buildkit v0.20.0 github.com/moby/moby => github.com/moby/moby v28.0.2+incompatible diff --git a/go.sum b/go.sum index 4963ee67b97b..a5d17463c694 100644 --- a/go.sum +++ b/go.sum @@ -223,6 +223,8 @@ github.com/docker/compose/v2 v2.33.1 h1:i/V1gUpdbc4tMRfx30aYzw7oHKM8NGB2Oe4AUJUo github.com/docker/compose/v2 v2.33.1/go.mod h1:TdDv/kdWOFrCWum5SVxVGVr+P9znSZepukHF1Dam25U= github.com/docker/compose/v2 v2.34.0 h1:mUhgA6AiRVO9hEndD2G2oOQi5Y0g/4H8xSPVUc5TYdU= github.com/docker/compose/v2 v2.34.0/go.mod h1:TgTD4Ku0vOSB3NZgOXp6HcCE6wDSBjg7r8bjWraV5/4= +github.com/docker/compose/v2 v2.35.0 h1:bU23OeFrbGyHYrKijMSEwkOeDg2TLhAGntU2F3hwX1o= +github.com/docker/compose/v2 v2.35.0/go.mod h1:S5ejUILn9KTYC6noX3IxznWu3/sb3FxdZqIYbq4seAk= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= diff --git a/hugo.yaml b/hugo.yaml index dd4c0c974029..86fb60d1ed75 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -139,7 +139,7 @@ params: # (Used to show e.g., "latest" and "latest"-1 in engine install examples docker_ce_version_prev: "28.0.3" # Latest Docker Compose version - compose_version: "v2.34.0" + compose_version: "v2.35.0" # Latest BuildKit version buildkit_version: "0.20.2" From 11e8cb3925933743326f2058fa7f41fed5aaa3a5 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Fri, 11 Apr 2025 08:11:39 +0100 Subject: [PATCH 294/699] Merge pull request #22408 from aevesdocker/ENGDOCS-2549 ENGDOCS-2549 --- content/reference/compose-file/deploy.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/content/reference/compose-file/deploy.md b/content/reference/compose-file/deploy.md index b23ae1c9c1c5..602a4af09a49 100644 --- a/content/reference/compose-file/deploy.md +++ b/content/reference/compose-file/deploy.md @@ -254,11 +254,10 @@ deploy: - `on-failure`, the container is restarted if it exits due to an error, which manifests as a non-zero exit code. - `any` (default), containers are restarted regardless of the exit status. - `delay`: How long to wait between restart attempts, specified as a [duration](extension.md#specifying-durations). The default is 0, meaning restart attempts can occur immediately. -- `max_attempts`: How many times to attempt to restart a container before giving up (default: never give up). If the restart does not - succeed within the configured `window`, this attempt doesn't count toward the configured `max_attempts` value. - For example, if `max_attempts` is set to '2', and the restart fails on the first attempt, more than two restarts must be attempted. -- `window`: How long to wait before deciding if a restart has succeeded, specified as a [duration](extension.md#specifying-durations) (default: - decide immediately). +- `max_attempts`: The maximum number of failed restart attempts allowed before giving up. (Default: unlimited retries.) +A failed attempt only counts toward `max_attempts` if the container does not successfully restart within the time defined by `window`. +For example, if `max_attempts` is set to `2` and the container fails to restart within the window on the first try, Compose continues retrying until two such failed attempts occur, even if that means trying more than twice. +- `window`: The amount of time to wait after a restart to determine whether it was successful, specified as a [duration](extension.md#specifying-durations) (default: the result is evaluated immediately after the restart). ```yml deploy: From c9366f284e90ac194e10d144119e4bb10a4d2dca Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Fri, 11 Apr 2025 10:23:54 -0400 Subject: [PATCH 295/699] cx: add deprecation alerts to hub org management docs (#22386) ## Description Core experiences is planning to deprecate org management in Docker Hub in a few months (~2ish months). This will remove org management from the following DH pages: - Members - Teams - Activity Logs - Settings - General - Settings - Security - Settings - Image Access - Settings Registry Access - Settings - Deactivate org This PR: - Adds an include for the hub management callouts - Adds the new include to all docs that mention deprecated flows/pages for hub org management (docs across Admin and Security mostly) - Restructuring docs w/ Admin Console vs. Docker Hub tabs, leading with Admin Console - Some other small nits while I was in this area _I am still waiting on confirmation about Team repo management. This is not currently in the Admin Console._ ## Related issues or tickets - [ENGDOCS-2516](https://docker.atlassian.net/browse/ENGDOCS-2516) ## Reviews - [ ] Editorial review - [ ] Product review [ENGDOCS-2516]: https://docker.atlassian.net/browse/ENGDOCS-2516?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- content/includes/hub-org-management.md | 6 + content/manuals/admin/_index.md | 4 +- .../admin/organization/activity-logs.md | 10 +- .../admin/organization/convert-account.md | 2 +- .../admin/organization/deactivate-account.md | 2 + .../admin/organization/manage-a-team.md | 38 ++--- content/manuals/admin/organization/members.md | 143 +++++++++++------- content/manuals/admin/organization/orgs.md | 105 ++++++------- content/manuals/security/faqs/general.md | 6 +- .../faqs/single-sign-on/domain-faqs.md | 3 +- .../faqs/single-sign-on/enforcement-faqs.md | 3 +- .../security/faqs/single-sign-on/idp-faqs.md | 3 +- .../faqs/single-sign-on/users-faqs.md | 3 +- .../security/for-admins/domain-audit.md | 10 +- .../image-access-management.md | 10 +- .../registry-access-management.md | 10 +- .../security/for-admins/provisioning/scim.md | 4 + .../for-admins/single-sign-on/configure.md | 4 + .../for-admins/single-sign-on/connect.md | 2 + .../for-admins/single-sign-on/manage.md | 4 + hugo_stats.json | 4 - 21 files changed, 224 insertions(+), 152 deletions(-) create mode 100644 content/includes/hub-org-management.md diff --git a/content/includes/hub-org-management.md b/content/includes/hub-org-management.md new file mode 100644 index 000000000000..b75bb77bf96d --- /dev/null +++ b/content/includes/hub-org-management.md @@ -0,0 +1,6 @@ +> [!IMPORTANT] +> +> Organization management is moving to the Admin Console. +> +> Manage members, team, settings, and activity logs in the Docker Admin Console. +> Access to these features in Docker Hub will end soon. Explore the [Admin Console](https://app.docker.com/admin). \ No newline at end of file diff --git a/content/manuals/admin/_index.md b/content/manuals/admin/_index.md index 1b57bac28d27..cf5274bfd919 100644 --- a/content/manuals/admin/_index.md +++ b/content/manuals/admin/_index.md @@ -35,9 +35,9 @@ aliases: - /docker-hub/admin-overview --- -Administrators can manage companies and organizations using the Docker Admin Console, or manage organizations in Docker Hub. +Administrators can manage companies and organizations using the Docker Admin Console. -The Docker Admin Console is available for customers with a Docker Business subscription. The [Docker Admin Console](https://admin.docker.com) provides administrators with centralized observability, access management, and controls for their company and organizations. To provide these features, Docker uses the following hierarchy and roles. +The [Docker Admin Console](https://admin.docker.com) provides administrators with centralized observability, access management, and controls for their company and organizations. To provide these features, Docker uses the following hierarchy and roles. ![Docker hierarchy](./images/docker-admin-structure.webp) diff --git a/content/manuals/admin/organization/activity-logs.md b/content/manuals/admin/organization/activity-logs.md index 75ad5712c0d8..18c9b5a14085 100644 --- a/content/manuals/admin/organization/activity-logs.md +++ b/content/manuals/admin/organization/activity-logs.md @@ -23,14 +23,16 @@ Owners can also see the activity logs for their repository if the repository is ## Manage activity logs {{< tabs >}} -{{< tab name="Docker Hub" >}} +{{< tab name="Admin Console" >}} -{{% admin-org-audit-log product="hub" %}} +{{% admin-org-audit-log product="admin" %}} {{< /tab >}} -{{< tab name="Admin Console" >}} +{{< tab name="Docker Hub" >}} -{{% admin-org-audit-log product="admin" %}} +{{% include "hub-org-management.md" %}} + +{{% admin-org-audit-log product="hub" %}} {{< /tab >}} {{< /tabs >}} diff --git a/content/manuals/admin/organization/convert-account.md b/content/manuals/admin/organization/convert-account.md index 5b1aa3547f2e..00db9570d89f 100644 --- a/content/manuals/admin/organization/convert-account.md +++ b/content/manuals/admin/organization/convert-account.md @@ -54,7 +54,7 @@ Consider the following effects of converting your account: 1. Ensure you have removed your user account from any company or teams or organizations. Also make sure that you have a new Docker ID before you convert an account. See the [Prerequisites](#prerequisites) section for details. -2. Sign in to your [Docker account](https://app.docker.com/login). +2. Sign in to [Docker Home](https://app.docker.com/login). 3. In Docker Home, select your avatar in the top-right corner to open the drop-down. diff --git a/content/manuals/admin/organization/deactivate-account.md b/content/manuals/admin/organization/deactivate-account.md index 9f82fbe267f8..b0ad4ab3525e 100644 --- a/content/manuals/admin/organization/deactivate-account.md +++ b/content/manuals/admin/organization/deactivate-account.md @@ -49,6 +49,8 @@ Once you have completed all the previous steps, you can deactivate your organiza {{< /tab >}} {{< tab name="Docker Hub" >}} +{{% include "hub-org-management.md" %}} + 1. On Docker Hub, select **My Hub**. 2. Choose the organization you want to deactivate. 3. In **Settings**, select the **Deactivate org** and then **Deactivate organization**. diff --git a/content/manuals/admin/organization/manage-a-team.md b/content/manuals/admin/organization/manage-a-team.md index 5a12db5e995a..1491f77edea7 100644 --- a/content/manuals/admin/organization/manage-a-team.md +++ b/content/manuals/admin/organization/manage-a-team.md @@ -35,20 +35,22 @@ The organization owner can also add additional organization owners to help them ## Create a team {{< tabs >}} -{{< tab name="Docker Hub" >}} +{{< tab name="Admin Console" >}} -1. Sign in to [Docker Hub](https://hub.docker.com). -2. Select **My Hub** and choose your organization. -3. Select the **Teams** and then select **Create Team**. +1. In Admin Console, select your organization. +2. In the **User management** section, select **Teams**. +3. Select **Create team**. 4. Fill out your team's information and select **Create**. 5. [Add members to your team](members.md#add-a-member-to-a-team). {{< /tab >}} -{{< tab name="Admin Console" >}} +{{< tab name="Docker Hub" >}} -1. In Admin Console, select your organization. -2. In the **User management** section, select **Teams**. -3. Select **Create team**. +{{% include "hub-org-management.md" %}} + +1. Sign in to [Docker Hub](https://hub.docker.com). +2. Select **My Hub** and choose your organization. +3. Select the **Teams** and then select **Create Team**. 4. Fill out your team's information and select **Create**. 5. [Add members to your team](members.md#add-a-member-to-a-team). @@ -118,8 +120,19 @@ To view a team's permissions across all repositories: Organization owners can delete a team in Docker Hub or Admin Console. When you remove a team from your organization, this action revokes the members' access to the team's permitted resources. It won't remove users from other teams that they belong to, nor will it delete any resources. {{< tabs >}} +{{< tab name="Admin Console" >}} + +1. In the [Admin Console](https://app.docker.com/admin), select your organization. +2. In the **User management** section, select **Teams**. +3. Select the **Actions** icon next to the name of the team you want to delete. +4. Select **Delete team**. +5. Review the confirmation message, then select **Delete**. + +{{< /tab >}} {{< tab name="Docker Hub" >}} +{{% include "hub-org-management.md" %}} + 1. Sign in to [Docker Hub](https://hub.docker.com). 2. Select **My Hub** and choose your organization. 3. Select **Teams**. @@ -128,15 +141,6 @@ Organization owners can delete a team in Docker Hub or Admin Console. When you r 6. Select **Delete Team**. 7. Review the confirmation message, then select **Delete**. -{{< /tab >}} -{{< tab name="Admin Console" >}} - -1. In the [Admin Console](https://app.docker.com/admin), select your organization. -2. In the **User management** section, select **Teams**. -3. Select the **Actions** icon next to the name of the team you want to delete. -4. Select **Delete team**. -5. Review the confirmation message, then select **Delete**. - {{< /tab >}} {{< /tabs >}} diff --git a/content/manuals/admin/organization/members.md b/content/manuals/admin/organization/members.md index dba13af4b787..536de693e38b 100644 --- a/content/manuals/admin/organization/members.md +++ b/content/manuals/admin/organization/members.md @@ -12,14 +12,16 @@ Learn how to manage members for your organization in Docker Hub and the Docker A ## Invite members {{< tabs >}} -{{< tab name="Docker Hub" >}} +{{< tab name="Admin Console" >}} -{{% admin-users product="hub" %}} +{{% admin-users product="admin" %}} {{< /tab >}} -{{< tab name="Admin Console" >}} +{{< tab name="Docker Hub" >}} -{{% admin-users product="admin" %}} +{{% include "hub-org-management.md" %}} + +{{% admin-users product="hub" %}} {{< /tab >}} {{< /tabs >}} @@ -59,8 +61,20 @@ After inviting members, you can resend or remove invitations as needed. ### Resend an invitation {{< tabs >}} +{{< tab name="Admin Console" >}} + +To resend an invitation from the Admin Console: + +1. In the [Admin Console](https://app.docker.com/admin), select your organization. +2. Select **Members**. +3. Select the **action menu** next to the invitee and select **Resend invitation**. +4. Select **Invite** to confirm. + +{{< /tab >}} {{< tab name="Docker Hub" >}} +{{% include "hub-org-management.md" %}} + To resend an invitation from Docker Hub: 1. Sign in to [Docker Hub](https://hub.docker.com/). @@ -73,23 +87,25 @@ You can also resend an invitation using the Docker Hub API. For more information see the [Resend an invite](https://docs.docker.com/reference/api/hub/latest/#tag/invites/paths/~1v2~1invites~1%7Bid%7D~1resend/patch) API endpoint. {{< /tab >}} +{{< /tabs >}} + +### Remove an invitation + +{{< tabs >}} {{< tab name="Admin Console" >}} -To resend an invitation from the Admin Console: +To remove an invitation from the Admin Console: 1. In the [Admin Console](https://app.docker.com/admin), select your organization. 2. Select **Members**. -3. Select the **action menu** next to the invitee and select **Resend invitation**. -4. Select **Invite** to confirm. +3. Select the **action menu** next to the invitee and select **Remove invitee**. +4. Select **Remove** to confirm. {{< /tab >}} -{{< /tabs >}} - -### Remove an invitation - -{{< tabs >}} {{< tab name="Docker Hub" >}} +{{% include "hub-org-management.md" %}} + To remove a member's invitation from Docker Hub: 1. Sign in to [Docker Hub](https://hub.docker.com/). @@ -100,16 +116,6 @@ To remove a member's invitation from Docker Hub: You can also remove an invitation using the Docker Hub API. For more information, see the [Cancel an invite](https://docs.docker.com/reference/api/hub/latest/#tag/invites/paths/~1v2~1invites~1%7Bid%7D/delete) API endpoint. -{{< /tab >}} -{{< tab name="Admin Console" >}} - -To remove an invitation from the Admin Console: - -1. In the [Admin Console](https://app.docker.com/admin), select your organization. -2. Select **Members**. -3. Select the **action menu** next to the invitee and select **Remove invitee**. -4. Select **Remove** to confirm. - {{< /tab >}} {{< /tabs >}} @@ -120,8 +126,23 @@ Use Docker Hub or the Admin Console to add or remove team members. Organization ### Add a member to a team {{< tabs >}} +{{< tab name="Admin Console" >}} + +To add a member to a team with the Admin Console: + +1. In the [Admin Console](https://app.docker.com/admin), select your organization. +2. Select the team name. +3. Select **Add member**. You can add the member by searching for their email address or username. + + > [!NOTE] + > + > An invitee must first accept the invitation to join the organization before being added to the team. + +{{< /tab >}} {{< tab name="Docker Hub" >}} +{{% include "hub-org-management.md" %}} + To add a member to a team with Docker Hub: 1. Sign in to [Docker Hub](https://hub.docker.com). @@ -137,19 +158,6 @@ To add a member to a team with Docker Hub: > > An invitee must first accept the invitation to join the organization before being added to the team. -{{< /tab >}} -{{< tab name="Admin Console" >}} - -To add a member to a team with the Admin Console: - -1. In the [Admin Console](https://app.docker.com/admin), select your organization. -2. Select the team name. -3. Select **Add member**. You can add the member by searching for their email address or username. - - > [!NOTE] - > - > An invitee must first accept the invitation to join the organization before being added to the team. - {{< /tab >}} {{< /tabs >}} @@ -162,16 +170,6 @@ To add a member to a team with the Admin Console: Organization owners can remove a member from a team in Docker Hub or Admin Console. Removing the member from the team will revoke their access to the permitted resources. {{< tabs >}} -{{< tab name="Docker Hub" >}} - -To remove a member from a specific team with Docker Hub: - -1. Sign in to [Docker Hub](https://hub.docker.com). -2. Select **My Hub**, your organization, **Teams**, and then the team. -3. Select the **X** next to the user’s name to remove them from the team. -4. When prompted, select **Remove** to confirm. - -{{< /tab >}} {{< tab name="Admin Console" >}} To remove a member from a specific team with the Admin Console: @@ -181,6 +179,18 @@ To remove a member from a specific team with the Admin Console: 3. Select the **X** next to the user's name to remove them from the team. 4. When prompted, select **Remove** to confirm. +{{< /tab >}} +{{< tab name="Docker Hub" >}} + +{{% include "hub-org-management.md" %}} + +To remove a member from a specific team with Docker Hub: + +1. Sign in to [Docker Hub](https://hub.docker.com). +2. Select **My Hub**, your organization, **Teams**, and then the team. +3. Select the **X** next to the user’s name to remove them from the team. +4. When prompted, select **Remove** to confirm. + {{< /tab >}} {{< /tabs >}} @@ -190,12 +200,27 @@ Organization owners can manage [roles](/security/for-admins/roles-and-permission within an organization. If an organization is part of a company, the company owner can also manage that organization's roles. If you have SSO enabled, you can use [SCIM for role mapping](/security/for-admins/provisioning/scim/). +{{< tabs >}} +{{< tab name="Admin Console" >}} + +To update a member role in the Admin Console: + +1. In the [Admin Console](https://app.docker.com/admin), select your organization. +2. Select the **Members** tab. +3. Find the username of the member whose role you want to edit. Select the +**Actions menu**, then **Edit role**. + > [!NOTE] > > If you're the only owner of an organization, > you need to assign a new owner before you can edit your role. -To update a member role: +{{< /tab >}} +{{< tab name="Docker Hub" >}} + +{{% include "hub-org-management.md" %}} + +To update a member role in Docker Hub: 1. Sign in to [Docker Hub](https://hub.docker.com). 2. Select **My Hub**, your organization, and then **Members**. @@ -203,6 +228,14 @@ To update a member role: 4. Select **Edit role**. 5. Select their organization, select the role you want to assign, and then select **Save**. +> [!NOTE] +> +> If you're the only owner of an organization, +> you need to assign a new owner before you can edit your role. + +{{< /tab >}} +{{< /tabs >}} + ## Export members CSV file {{< summary-bar feature_name="Admin orgs" >}} @@ -216,22 +249,24 @@ Owners can export a CSV file containing all members. The CSV file for a company - Account Created: The time and date when the user account was created {{< tabs >}} -{{< tab name="Docker Hub" >}} +{{< tab name="Admin Console" >}} To export a CSV file of your members: -1. Sign in to [Docker Hub](https://hub.docker.com). -2. Select **My Hub**, your organization, and then **Members**. -3. Select the **Action** icon and then select **Export users as CSV**. +1. In the [Admin Console](https://app.docker.com/admin), select your organization. +2. Select **Members**. +3. Select the **download** icon to export a CSV file of all members. {{< /tab >}} -{{< tab name="Admin Console" >}} +{{< tab name="Docker Hub" >}} + +{{% include "hub-org-management.md" %}} To export a CSV file of your members: -1. In the [Admin Console](https://app.docker.com/admin), select your organization. -2. Select **Members**. -3. Select the **download** icon to export a CSV file of all members. +1. Sign in to [Docker Hub](https://hub.docker.com). +2. Select **My Hub**, your organization, and then **Members**. +3. Select the **Action** icon and then select **Export users as CSV**. {{< /tab >}} {{< /tabs >}} \ No newline at end of file diff --git a/content/manuals/admin/organization/orgs.md b/content/manuals/admin/organization/orgs.md index 8e4e602fa09a..ef048a8a0c9c 100644 --- a/content/manuals/admin/organization/orgs.md +++ b/content/manuals/admin/organization/orgs.md @@ -26,13 +26,16 @@ detailed instructions on converting an existing user account to an organization, [Convert an account into an organization](/manuals/admin/organization/convert-account.md). {{< tabs >}} -{{< tab name="Docker Hub" >}} +{{< tab name="Admin Console" >}} -1. Sign in to [Docker Hub](https://hub.docker.com/) using your Docker ID, your email address, or your social provider. -2. Select **My Hub**, select the account drop-down, and then **Create Organization** to create a new organization. -3. Choose a plan for your organization, a billing cycle, and specify how many seats you need. See [Docker Pricing](https://www.docker.com/pricing/) for details on the features offered in the Team and Business plan. -4. Select **Continue to profile**. -5. Enter an **Organization namespace**. This is the official, unique name for +To create an organization: + +1. Sign in to [Docker Home](https://app.docker.com/). +2. Under Settings and administration, select **Go to Admin Console**. +3. Select the **Organization** drop-down in the left-hand navigation and then **Create Organization**. +4. Choose a plan for your organization, a billing cycle, and specify how many seats you need. See [Docker Pricing](https://www.docker.com/pricing/) for details on the features offered in the Team and Business plan. +5. Select **Continue to profile**. +6. Enter an **Organization namespace**. This is the official, unique name for your organization in Docker Hub. It's not possible to change the name of the organization after you've created it. @@ -40,27 +43,26 @@ organization after you've created it. > > You can't use the same name for the organization and your Docker ID. If you want to use your Docker ID as the organization name, then you must first [convert your account into an organization](/manuals/admin/organization/convert-account.md). -6. Enter your **Company name**. This is the full name of your company. Docker +7. Enter your **Company name**. This is the full name of your company. Docker displays the company name on your organization page and in the details of any public images you publish. You can update the company name anytime by navigating to your organization's **Settings** page. -7. Select **Continue to billing** to continue. -8. Enter your organization's billing information and select **Continue to payment** to continue to the billing portal. -9. Provide your card details and select **Purchase**. +8. Select **Continue to billing** to continue. +9. Enter your organization's billing information and select **Continue to payment** to continue to the billing portal. +10. Provide your card details and select **Purchase**. You've now created an organization. {{< /tab >}} -{{< tab name="Admin Console" >}} +{{< tab name="Docker Hub" >}} -To create an organization: +{{% include "hub-org-management.md" %}} -1. Sign in to [Docker Home](https://app.docker.com/). -2. Under Settings and administration, select **Go to Admin Console**. -3. Select the **Organization** drop-down in the left-hand navigation and then **Create Organization**. -4. Choose a plan for your organization, a billing cycle, and specify how many seats you need. See [Docker Pricing](https://www.docker.com/pricing/) for details on the features offered in the Team and Business plan. -5. Select **Continue to profile**. -6. Enter an **Organization namespace**. This is the official, unique name for +1. Sign in to [Docker Hub](https://hub.docker.com/) using your Docker ID, your email address, or your social provider. +2. Select **My Hub**, select the account drop-down, and then **Create Organization** to create a new organization. +3. Choose a plan for your organization, a billing cycle, and specify how many seats you need. See [Docker Pricing](https://www.docker.com/pricing/) for details on the features offered in the Team and Business plan. +4. Select **Continue to profile**. +5. Enter an **Organization namespace**. This is the official, unique name for your organization in Docker Hub. It's not possible to change the name of the organization after you've created it. @@ -68,13 +70,13 @@ organization after you've created it. > > You can't use the same name for the organization and your Docker ID. If you want to use your Docker ID as the organization name, then you must first [convert your account into an organization](/manuals/admin/organization/convert-account.md). -7. Enter your **Company name**. This is the full name of your company. Docker +6. Enter your **Company name**. This is the full name of your company. Docker displays the company name on your organization page and in the details of any public images you publish. You can update the company name anytime by navigating to your organization's **Settings** page. -8. Select **Continue to billing** to continue. -9. Enter your organization's billing information and select **Continue to payment** to continue to the billing portal. -10. Provide your card details and select **Purchase**. +7. Select **Continue to billing** to continue. +8. Enter your organization's billing information and select **Continue to payment** to continue to the billing portal. +9. Provide your card details and select **Purchase**. You've now created an organization. @@ -84,12 +86,40 @@ You've now created an organization. ## View an organization {{< tabs >}} +{{< tab name="Admin Console" >}} + +To view an organization in the Admin Console: + +1. Sign in to [Docker Home](https://app.docker.com). +2. Under Settings and administration, select **Go to Admin Console**. +3. Select your organization from the **Organization** drop-down in the left-hand navigation. + +The Admin Console displays various options that let you to +configure your organization. + +- **Members**: Displays a list of team members. You + can invite new members using the **Invite members** button. See [Manage members](./members.md) for details. + +- **Teams**: Displays a list of existing teams and the number of + members in each team. See [Create a team](./manage-a-team.md) for details. + +- **Activity** Displays the audit logs, a chronological list of activities that + occur at organization and repository levels. It provides the org owners a + report of all their team member activities. See [Audit logs](./activity-logs.md) for + details. + +- **Security and access**: Manage security settings. For more information, see [Security](/manuals/security/_index.md). + +- **Organization settings**: Update general settings, manage your company settings, or [deactivate your organization](/manuals/admin/organization/deactivate-account.md). + +{{< /tab >}} {{< tab name="Docker Hub" >}} +{{% include "hub-org-management.md" %}} + To view an organization: -1. Sign in to [Docker Hub](https://hub.docker.com) with a user account that is a member of any team in the - organization. +1. Sign in to [Docker Hub](https://hub.docker.com) with a user account that is a member of any team in the organization. > [!NOTE] > @@ -133,33 +163,6 @@ configure your organization. - **Billing**: Displays information about your existing [Docker subscription (plan)](../../subscription/_index.md), including the number of seats and next payment due date. For how to access the billing history and payment methods for your organization, see [View billing history](../../billing/history.md). -{{< /tab >}} -{{< tab name="Admin Console" >}} - -To view an organization in the Admin Console: - -1. Sign in to [Docker Home](https://app.docker.com). -2. Under Settings and administration, select **Go to Admin Console**. -3. Select your organization from the **Organization** drop-down in the left-hand navigation. - -The Admin Console displays various options that let you to -configure your organization. - -- **Members**: Displays a list of team members. You - can invite new members using the **Invite members** button. See [Manage members](./members.md) for details. - -- **Teams**: Displays a list of existing teams and the number of - members in each team. See [Create a team](./manage-a-team.md) for details. - -- **Activity** Displays the audit logs, a chronological list of activities that - occur at organization and repository levels. It provides the org owners a - report of all their team member activities. See [Audit logs](./activity-logs.md) for - details. - -- **Security and access**: Manage security settings. For more information, see [Security](/manuals/security/_index.md). - -- **Organization settings**: Update general settings, manage your company settings, or [deactivate your organization](/manuals/admin/organization/deactivate-account.md). - {{< /tab >}} {{< /tabs >}} diff --git a/content/manuals/security/faqs/general.md b/content/manuals/security/faqs/general.md index 1a9ad087e8cf..341c76c2a714 100644 --- a/content/manuals/security/faqs/general.md +++ b/content/manuals/security/faqs/general.md @@ -52,9 +52,9 @@ Some users authenticate by signing in to Docker Desktop and joining their domain Organizations set up in Docker use verified domains and any team member with an email domain other than what's verified is noted as a "Guest" in that organization. -### How long are Docker Hub logs available? +### How long are activity logs available? -Docker provides various types of audit logs and log retention varies. For example, Docker Hub Activity logs are available for 90 days. You are responsible for exporting logs or setting up drivers to their own internal systems. +Docker provides various types of audit logs and log retention varies. For example, Docker activity logs are available for 90 days. You are responsible for exporting logs or setting up drivers to their own internal systems. ### Can I export a list of all users with their assigned roles and privileges and if so, in what format? @@ -84,4 +84,4 @@ Extensions are not covered as part of Docker’s Third-Party Risk Management Pro ### Can I disable private repos in my organization via a setting to make sure nobody is pushing images into Docker Hub? -No. With [Registry Access Management](/manuals/security/for-admins/hardened-desktop/registry-access-management.md) (RAM), administrators can ensure that their developers using Docker Desktop only access allowed registries. This is done through the Registry Access Management dashboard on Docker Hub. +No. With [Registry Access Management](/manuals/security/for-admins/hardened-desktop/registry-access-management.md) (RAM), administrators can ensure that their developers using Docker Desktop only access allowed registries. This is done through the Registry Access Management dashboard in the Admin Console. diff --git a/content/manuals/security/faqs/single-sign-on/domain-faqs.md b/content/manuals/security/faqs/single-sign-on/domain-faqs.md index 805a45be66d7..642e54006ada 100644 --- a/content/manuals/security/faqs/single-sign-on/domain-faqs.md +++ b/content/manuals/security/faqs/single-sign-on/domain-faqs.md @@ -1,7 +1,8 @@ --- description: Single sign-on domain FAQs keywords: Docker, Docker Hub, SSO FAQs, single sign-on, domains, domain verification, domain management -title: FAQS on SSO and domains +title: FAQs for SSO and domains +linkTitle: Domains tags: [FAQ] aliases: - /single-sign-on/domain-faqs/ diff --git a/content/manuals/security/faqs/single-sign-on/enforcement-faqs.md b/content/manuals/security/faqs/single-sign-on/enforcement-faqs.md index 90ea423a1577..f77b93ac6152 100644 --- a/content/manuals/security/faqs/single-sign-on/enforcement-faqs.md +++ b/content/manuals/security/faqs/single-sign-on/enforcement-faqs.md @@ -1,7 +1,8 @@ --- description: Single sign-on enforcement FAQs keywords: Docker, Docker Hub, SSO FAQs, single sign-on, enforce SSO, SSO enforcement -title: FAQs on SSO and enforcement +title: FAQs for SSO and enforcement +linkTitle: Enforcement tags: [FAQ] aliases: - /single-sign-on/enforcement-faqs/ diff --git a/content/manuals/security/faqs/single-sign-on/idp-faqs.md b/content/manuals/security/faqs/single-sign-on/idp-faqs.md index 01aff89b9b17..2b456e005540 100644 --- a/content/manuals/security/faqs/single-sign-on/idp-faqs.md +++ b/content/manuals/security/faqs/single-sign-on/idp-faqs.md @@ -1,7 +1,8 @@ --- description: Single sign-on IdP FAQs keywords: Docker, Docker Hub, SSO FAQs, single sign-on, IdP -title: FAQs on SSO and identity providers +title: FAQs for SSO and identity providers +linkTitle: Identity providers tags: [FAQ] aliases: - /single-sign-on/idp-faqs/ diff --git a/content/manuals/security/faqs/single-sign-on/users-faqs.md b/content/manuals/security/faqs/single-sign-on/users-faqs.md index 5488e1fa4485..8deb9adb440e 100644 --- a/content/manuals/security/faqs/single-sign-on/users-faqs.md +++ b/content/manuals/security/faqs/single-sign-on/users-faqs.md @@ -1,7 +1,8 @@ --- description: Single sign-on user management FAQs keywords: Docker, Docker Hub, SSO FAQs, single sign-on -title: FAQs on SSO and managing users +title: FAQs for SSO and user management +linkTitle: User management tags: [FAQ] aliases: - /single-sign-on/users-faqs/ diff --git a/content/manuals/security/for-admins/domain-audit.md b/content/manuals/security/for-admins/domain-audit.md index 57ae7edabfa6..ac9f13b920d5 100644 --- a/content/manuals/security/for-admins/domain-audit.md +++ b/content/manuals/security/for-admins/domain-audit.md @@ -45,14 +45,16 @@ Before you audit your domains, review the following required prerequisites: ## Audit your domains for uncaptured users {{< tabs >}} -{{< tab name="Docker Hub" >}} +{{< tab name="Admin Console" >}} -{{% admin-domain-audit product="hub" %}} +{{% admin-domain-audit product="admin" %}} {{< /tab >}} -{{< tab name="Admin Console" >}} +{{< tab name="Docker Hub" >}} -{{% admin-domain-audit product="admin" %}} +{{% include "hub-org-management.md" %}} + +{{% admin-domain-audit product="hub" %}} {{< /tab >}} {{< /tabs >}} diff --git a/content/manuals/security/for-admins/hardened-desktop/image-access-management.md b/content/manuals/security/for-admins/hardened-desktop/image-access-management.md index 18c5a8132a68..8dfaaddf22a1 100644 --- a/content/manuals/security/for-admins/hardened-desktop/image-access-management.md +++ b/content/manuals/security/for-admins/hardened-desktop/image-access-management.md @@ -24,14 +24,16 @@ You first need to [enforce sign-in](/manuals/security/for-admins/enforce-sign-in ## Configure {{< tabs >}} -{{< tab name="Docker Hub" >}} +{{< tab name="Admin Console" >}} -{{% admin-image-access product="hub" %}} +{{% admin-image-access product="admin" %}} {{< /tab >}} -{{< tab name="Admin Console" >}} +{{< tab name="Docker Hub" >}} -{{% admin-image-access product="admin" %}} +{{% include "hub-org-management.md" %}} + +{{% admin-image-access product="hub" %}} {{< /tab >}} {{< /tabs >}} diff --git a/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md b/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md index f2b3ac55b82a..0ee60ecd0bad 100644 --- a/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md +++ b/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md @@ -46,14 +46,16 @@ feature always takes effect. ## Configure Registry Access Management permissions {{< tabs >}} -{{< tab name="Docker Hub" >}} +{{< tab name="Admin Console" >}} -{{% admin-registry-access product="hub" %}} +{{% admin-registry-access product="admin" %}} {{< /tab >}} -{{< tab name="Admin Console" >}} +{{< tab name="Docker Hub" >}} -{{% admin-registry-access product="admin" %}} +{{% include "hub-org-management.md" %}} + +{{% admin-registry-access product="hub" %}} {{< /tab >}} {{< /tabs >}} diff --git a/content/manuals/security/for-admins/provisioning/scim.md b/content/manuals/security/for-admins/provisioning/scim.md index 2e68d80ef13d..a76de476b39a 100644 --- a/content/manuals/security/for-admins/provisioning/scim.md +++ b/content/manuals/security/for-admins/provisioning/scim.md @@ -58,6 +58,8 @@ You must [configure SSO](../single-sign-on/configure/_index.md) before you enabl {{< /tab >}} {{< tab name="Docker Hub" >}} +{{% include "hub-org-management.md" %}} + {{% admin-scim %}} {{< /tab >}} @@ -248,6 +250,8 @@ If SCIM is disabled, any user provisioned through SCIM will remain in the organi {{< /tab >}} {{< tab name="Docker Hub" >}} +{{% include "hub-org-management.md" %}} + {{% admin-scim-disable %}} {{< /tab >}} diff --git a/content/manuals/security/for-admins/single-sign-on/configure.md b/content/manuals/security/for-admins/single-sign-on/configure.md index df1b0a88a1d9..7e2984612e8d 100644 --- a/content/manuals/security/for-admins/single-sign-on/configure.md +++ b/content/manuals/security/for-admins/single-sign-on/configure.md @@ -31,6 +31,8 @@ Get started creating a single sign-on (SSO) connection for your organization or {{< /tab >}} {{< tab name="Docker Hub" >}} +{{% include "hub-org-management.md" %}} + 1. Sign in to [Docker Hub](https://hub.docker.com/). 2. Select **My Hub** and then your organization from the list. 3. On your organization page, select **Settings** and then **Security**. @@ -54,6 +56,8 @@ Verifying your domain ensures Docker knows you own it. Domain verification is do {{< /tab >}} {{< tab name="Docker Hub" >}} +{{% include "hub-org-management.md" %}} + 1. Navigate to your domain host, create a new TXT record, and paste the **TXT Record Value** from Docker. 2. TXT Record Verification can take 72 hours. Once you have waited for TXT record verification, return to the **Security** page of Docker Hub and select **Verify** next to your domain name. diff --git a/content/manuals/security/for-admins/single-sign-on/connect.md b/content/manuals/security/for-admins/single-sign-on/connect.md index 68d8e0133567..a5aaf812f76e 100644 --- a/content/manuals/security/for-admins/single-sign-on/connect.md +++ b/content/manuals/security/for-admins/single-sign-on/connect.md @@ -43,6 +43,8 @@ Make sure you have completed the following before you begin: {{< /tab >}} {{< tab name="Docker Hub" >}} +{{% include "hub-org-management.md" %}} + 1. Sign in to Docker Hub. 2. Select **My Hub** and then your organization from the list. 3. On your organization page, select **Settings** and then **Security**. diff --git a/content/manuals/security/for-admins/single-sign-on/manage.md b/content/manuals/security/for-admins/single-sign-on/manage.md index a3d320261a2e..4c188a3e5ea8 100644 --- a/content/manuals/security/for-admins/single-sign-on/manage.md +++ b/content/manuals/security/for-admins/single-sign-on/manage.md @@ -28,6 +28,8 @@ aliases: {{< /tab >}} {{< tab name="Docker Hub" >}} +{{% include "hub-org-management.md" %}} + {{% admin-sso-management product="hub" %}} {{< /tab >}} @@ -43,6 +45,8 @@ aliases: {{< /tab >}} {{< tab name="Docker Hub" >}} +{{% include "hub-org-management.md" %}} + {{% admin-sso-management-connections product="hub" %}} {{< /tab >}} diff --git a/hugo_stats.json b/hugo_stats.json index 36588423e141..a01b564ea82f 100644 --- a/hugo_stats.json +++ b/hugo_stats.json @@ -109,10 +109,6 @@ "Using-the-CLI", "Using-the-GUI", "VS-Code", - "Version-4.15-4.17", - "Version-4.17-and-earlier", - "Version-4.18-and-later", - "Versions-prior-to-4.15", "Vue", "WSL-2-backend-Arm-Beta", "WSL-2-backend-x86_64", From 12698a8d47caf7b6a86477c22cc5fdf17102d362 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Fri, 11 Apr 2025 16:08:30 +0100 Subject: [PATCH 296/699] ENGDOCS-2553 (#22413) ## Description Adds new `volume.type=image` to the spec ## Related issues or tickets https://github.com/compose-spec/compose-spec/pull/585/files ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/reference/compose-file/services.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/content/reference/compose-file/services.md b/content/reference/compose-file/services.md index 873105e0d9c1..56eb4e95f3d9 100644 --- a/content/reference/compose-file/services.md +++ b/content/reference/compose-file/services.md @@ -2040,8 +2040,8 @@ The short syntax uses a single string with colon-separated values to specify a v The long form syntax lets you configure additional fields that can't be expressed in the short form. -- `type`: The mount type. Either `volume`, `bind`, `tmpfs`, `npipe`, or `cluster` -- `source`: The source of the mount, a path on the host for a bind mount, or the +- `type`: The mount type. Either `volume`, `bind`, `tmpfs`, `image`, `npipe`, or `cluster` +- `source`: The source of the mount, a path on the host for a bind mount, a Docker image reference for an image mount, or the name of a volume defined in the [top-level `volumes` key](volumes.md). Not applicable for a tmpfs mount. - `target`: The path in the container where the volume is mounted. @@ -2058,6 +2058,8 @@ expressed in the short form. - `tmpfs`: Configures additional tmpfs options: - `size`: The size for the tmpfs mount in bytes (either numeric or as bytes unit). - `mode`: The file mode for the tmpfs mount as Unix permission bits as an octal number. Introduced in Docker Compose version [2.14.0](/manuals/compose/releases/release-notes.md#2260). +- `image`: Configures additional image options: + - `subpath`: Path inside the source image to mount instead of the image root. Available in [Docker Compose version 2.35.0](/manuals/compose/releases/release-notes.md#2350) - `consistency`: The consistency requirements of the mount. Available values are platform specific. > [!TIP] From 2c4fffec57f4e4c7f29f23680865e55247bddbee Mon Sep 17 00:00:00 2001 From: Bokyeom <79684339+k-kbk@users.noreply.github.com> Date: Mon, 14 Apr 2025 16:09:26 +0900 Subject: [PATCH 297/699] Fix minor typos (#22419) ## Description Fixed minor typos to improve readability. --- content/manuals/compose/how-tos/profiles.md | 6 +++--- content/manuals/compose/how-tos/startup-order.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/manuals/compose/how-tos/profiles.md b/content/manuals/compose/how-tos/profiles.md index 9f745510b94b..5d90153606b1 100644 --- a/content/manuals/compose/how-tos/profiles.md +++ b/content/manuals/compose/how-tos/profiles.md @@ -111,8 +111,8 @@ services: # Only start backend and db $ docker compose up -d -# This runs db-migrations (and,if necessary, start db) -# by implicitly enabling the profiles `tools` +# This runs db-migrations (and, if necessary, start db) +# by implicitly enabling the profiles "tools" $ docker compose run db-migrations ``` @@ -150,7 +150,7 @@ services: $ docker compose up -d # Start mock-backend (and, if necessary, db) -# by implicitly enabling profiles `dev` +# by implicitly enabling profiles "dev" $ docker compose up -d mock-backend # This fails because profiles "dev" is not enabled diff --git a/content/manuals/compose/how-tos/startup-order.md b/content/manuals/compose/how-tos/startup-order.md index e76deb436692..2234fff15690 100644 --- a/content/manuals/compose/how-tos/startup-order.md +++ b/content/manuals/compose/how-tos/startup-order.md @@ -55,7 +55,7 @@ Compose waits for healthchecks to pass on dependencies marked with `service_heal `restart: true` ensures that if `db` is updated or restarted due to an explicit Compose operation, for example `docker compose restart`, the `web` service is also restarted automatically, ensuring it re-establishes connections or dependencies correctly. -The healthcheck for the `db` service uses the `pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'` command to check if the PostgreSQL database is ready. The service is retried every 10 seconds, up to 5 times. +The healthcheck for the `db` service uses the `pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}` command to check if the PostgreSQL database is ready. The service is retried every 10 seconds, up to 5 times. Compose also removes services in dependency order. `web` is removed before `db` and `redis`. From 00297fd8e3a6a88cc8a238c60cd05b820851b8d1 Mon Sep 17 00:00:00 2001 From: Carlos Quintero Date: Mon, 14 Apr 2025 09:10:00 +0200 Subject: [PATCH 298/699] Fix typo (#22417) Fix small typo --- .../for-admins/hardened-desktop/registry-access-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md b/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md index 0ee60ecd0bad..cf3892b1a54f 100644 --- a/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md +++ b/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md @@ -20,7 +20,7 @@ Docker Admin Console. Registry Access Management supports both cloud and on-prem registries. This feature operates at the DNS level and therefore is compatible with all -egistries. You can add any hostname or domain name you’d like to include in the +registries. You can add any hostname or domain name you’d like to include in the list of allowed registries. However, if the registry redirects to other domains such as `s3.amazon.com`, then you must add those domains to the list. From d111b09ddbe4b39d7e65df77083b4b836bcf1d9e Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Mon, 14 Apr 2025 11:08:13 +0100 Subject: [PATCH 299/699] dmr banner (#22422) ## Description ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- layouts/index.html | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/layouts/index.html b/layouts/index.html index f72b1faae556..c157c1943bee 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -162,21 +162,20 @@

Gen AI catalog {{ partial From 013c3abd81d5eec250c36b771b79cab5c80e391b Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Mon, 14 Apr 2025 11:09:33 +0100 Subject: [PATCH 300/699] Oss 5 (#22383) ## Description https://docker.atlassian.net/browse/OSS-5 ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/engine/storage/volumes.md | 30 ++++++++++++----------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/content/manuals/engine/storage/volumes.md b/content/manuals/engine/storage/volumes.md index 5fbe2748f0ef..0aa9c3fe708f 100644 --- a/content/manuals/engine/storage/volumes.md +++ b/content/manuals/engine/storage/volumes.md @@ -526,7 +526,7 @@ store data in the cloud, without changing the application logic. When you create a volume using `docker volume create`, or when you start a container which uses a not-yet-created volume, you can specify a volume driver. -The following examples use the `vieux/sshfs` volume driver, first when creating +The following examples use the `rclone/docker-volume-rclone` volume driver, first when creating a standalone volume, and then when starting a container which creates a new volume. @@ -555,27 +555,29 @@ host and can connect to the second node using SSH. On the Docker host, install the `vieux/sshfs` plugin: ```console -$ docker plugin install --grant-all-permissions vieux/sshfs +$ docker plugin install --grant-all-permissions rclone/docker-volume-rclone --aliases rclone ``` ### Create a volume using a volume driver -This example specifies an SSH password, but if the two hosts have shared keys -configured, you can exclude the password. Each volume driver may have zero or more +This example mounts the `/remote` directory on host `1.2.3.4` into a +volume named `rclonevolume`. Each volume driver may have zero or more configurable options, you specify each of them using an `-o` flag. ```console -$ docker volume create --driver vieux/sshfs \ - -o sshcmd=test@node2:/home/test \ - -o password=testpassword \ - sshvolume +$ docker volume create \ + -d rclone \ + --name rclonevolume \ + -o type=sftp \ + -o path=remote \ + -o sftp-host=1.2.3.4 \ + -o sftp-user=user \ + -o "sftp-password=$(cat file_containing_password_for_remote_host)" ``` -### Start a container which creates a volume using a volume driver +This volume can now be mounted into containers. -The following example specifies an SSH password. However, if the two hosts have -shared keys configured, you can exclude the password. -Each volume driver may have zero or more configurable options. +### Start a container which creates a volume using a volume driver > [!NOTE] > @@ -584,8 +586,8 @@ Each volume driver may have zero or more configurable options. ```console $ docker run -d \ - --name sshfs-container \ - --mount type=volume,volume-driver=vieux/sshfs,src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \ + --name rclone-container \ + --mount type=volume,volume-driver=rclone,src=rclonevolume,target=/app,volume-opt=type=sftp,volume-opt=path=remote, volume-opt=sftp-host=1.2.3.4,volume-opt=sftp-user=user,volume-opt=-o "sftp-password=$(cat file_containing_password_for_remote_host)" \ nginx:latest ``` From fbdd387c0ea01113fdb31f4bab0dc1b34da1b885 Mon Sep 17 00:00:00 2001 From: David Karlsson <35727626+dvdksn@users.noreply.github.com> Date: Mon, 14 Apr 2025 15:26:13 +0200 Subject: [PATCH 301/699] kapa: change bot protection mechanism to hcaptcha --- layouts/partials/head.html | 1 + 1 file changed, 1 insertion(+) diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 0c08af0753e6..fc2d6ee2aeb9 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -68,6 +68,7 @@ data-project-logo="/assets/images/logo-icon-white.svg" data-project-name="Docker" data-user-analytics-fingerprint-enabled="true" +data-bot-protection-mechanism="hcaptcha" data-website-id="{{ site.Params.kapa.id }}" > {{/* preload Roboto Flex as it's a critical font: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/preload */}} From 983e42eaea6290780c79a40bf7c6fc76f88329b0 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Mon, 14 Apr 2025 13:33:21 -0400 Subject: [PATCH 302/699] Merge pull request #22415 from sarahsanders-docker/TXT-records iam: add DNS host instructions for adding TXT records --- .../for-admins/single-sign-on/configure.md | 51 +++++++++++++------ 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/content/manuals/security/for-admins/single-sign-on/configure.md b/content/manuals/security/for-admins/single-sign-on/configure.md index 7e2984612e8d..b0304d8b6f9b 100644 --- a/content/manuals/security/for-admins/single-sign-on/configure.md +++ b/content/manuals/security/for-admins/single-sign-on/configure.md @@ -4,12 +4,12 @@ keywords: configure, sso, docker hub, hub, docker admin, admin, security title: Configure single sign-on linkTitle: Configure aliases: -- /docker-hub/domains/ -- /docker-hub/sso-connection/ -- /docker-hub/enforcing-sso/ -- /single-sign-on/configure/ -- /admin/company/settings/sso-configuration/ -- /admin/organization/security-settings/sso-configuration/ + - /docker-hub/domains/ + - /docker-hub/sso-connection/ + - /docker-hub/enforcing-sso/ + - /single-sign-on/configure/ + - /admin/company/settings/sso-configuration/ + - /admin/organization/security-settings/sso-configuration/ --- {{< summary-bar feature_name="SSO" >}} @@ -45,21 +45,43 @@ Get started creating a single sign-on (SSO) connection for your organization or ## Step two: Verify your domain -Verifying your domain ensures Docker knows you own it. Domain verification is done by adding your Docker TXT Record Value to your domain host. The TXT Record Value proves ownership, which signals the Domain Name System (DNS) to add this record. It can take up to 72 hours for DNS to recognize the change. When the change is reflected in DNS, Docker will automatically check the record to confirm your ownership. +Verifying your domain ensures Docker knows you own it. To verify, you add a TXT record to your Domain Name System (DNS) host using the value Docker provides. The TXT Record Value proves ownership, which signals the DNS to add this record. It can take up to 72 hours for DNS to recognize the change. When the change is reflected in DNS, Docker automatically checks the record to confirm your ownership. + +Use the **TXT Record Value** provided by Docker and follow the steps based on your DNS host. If your provider isn't listed, use the instructions for other providers. + +> [!TIP] +> +> The record name field controls where the TXT record is applied in your domain, for example root or subdomain. In general, refer to the following tips for adding a record name: +> +> - Use `@` or leave the record name empty for root domains like `example.com`, depending on your provider. +> - Don't enter values like `docker`, `docker-verification`, `www`, or your domain name. These values may direct to the wrong place. +> +> Check your DNS provider's documentation to verify record name requirements. {{< tabs >}} -{{< tab name="Admin Console" >}} +{{< tab name="AWS Route 53" >}} -1. Navigate to your domain host, create a new TXT record, and paste the **TXT Record Value** from Docker. -2. TXT record verification can take 72 hours. Once you have waited for TXT record verification, return to the **Domain management** page of the Admin Console and select **Verify** next to your domain name. +1. To add your TXT record to AWS, see [Creating records by using the Amazon Route 53 console](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-creating.html). +2. TXT record verification can take 72 hours. Once you have waited for TXT record verification, return to the **Domain management** page of the [Admin Console](https://app.docker.com/admin) and select **Verify** next to your domain name. {{< /tab >}} -{{< tab name="Docker Hub" >}} +{{< tab name="Google Cloud DNS" >}} -{{% include "hub-org-management.md" %}} +1. To add your TXT record to Google Cloud DNS, see [Verifying your domain with a TXT record](https://cloud.google.com/identity/docs/verify-domain-txt). +2. TXT record verification can take 72 hours. Once you have waited for TXT record verification, return to the **Domain management** page of the [Admin Console](https://app.docker.com/admin) and select **Verify** next to your domain name. -1. Navigate to your domain host, create a new TXT record, and paste the **TXT Record Value** from Docker. -2. TXT Record Verification can take 72 hours. Once you have waited for TXT record verification, return to the **Security** page of Docker Hub and select **Verify** next to your domain name. +{{< /tab >}} +{{< tab name="GoDaddy" >}} + +1. To add your TXT record to GoDaddy, see [Add a TXT record](https://www.godaddy.com/help/add-a-txt-record-19232). +2. TXT record verification can take 72 hours. Once you have waited for TXT record verification, return to the **Domain management** page of the [Admin Console](https://app.docker.com/admin) and select **Verify** next to your domain name. + +{{< /tab >}} +{{< tab name="Other providers" >}} + +1. Sign in to your domain host. +2. Add a TXT record to your DNS settings and save the record. +3. TXT record verification can take 72 hours. Once you have waited for TXT record verification, return to the **Domain management** page of the [Admin Console](https://app.docker.com/admin) and select **Verify** next to your domain name. {{< /tab >}} {{< /tabs >}} @@ -76,4 +98,3 @@ The following videos walk through verifying your domain to create your SSO conne ## What's next? [Connect Docker and your IdP](../single-sign-on/connect.md). - From 6aa8403d80513182382fef9a361adaf57fc35224 Mon Sep 17 00:00:00 2001 From: Bokyeom <79684339+k-kbk@users.noreply.github.com> Date: Tue, 15 Apr 2025 18:12:03 +0900 Subject: [PATCH 303/699] Merge pull request #22426 from k-kbk/patch-1 Fix minor typos in file-watch.md --- content/manuals/compose/how-tos/file-watch.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/manuals/compose/how-tos/file-watch.md b/content/manuals/compose/how-tos/file-watch.md index 2af413a3b5cb..5cef4963916e 100644 --- a/content/manuals/compose/how-tos/file-watch.md +++ b/content/manuals/compose/how-tos/file-watch.md @@ -40,7 +40,7 @@ For example, in a Node.js project, it's not recommended to sync the `node_module The `watch` attribute defines a list of rules that control automatic service updates based on local file changes. -Each rule requires, a `path` pattern and `action` to take when a modification is detected. There are two possible actions for `watch` and depending on +Each rule requires a `path` pattern and `action` to take when a modification is detected. There are two possible actions for `watch` and depending on the `action`, additional fields might be accepted or required. Watch mode can be used with many different languages and frameworks. @@ -95,8 +95,8 @@ image rebuild (e.g. `package.json`). If `action` is set to `sync+restart`, Compose synchronizes your changes with the service containers and restarts it. -`sync+restart` is ideal when config file changes, and you don't need to rebuild the image but just restart the main process of the service containers. -It will work well when you update a database configuration or your `nginx.conf` file for example +`sync+restart` is ideal when the config file changes, and you don't need to rebuild the image but just restart the main process of the service containers. +It will work well when you update a database configuration or your `nginx.conf` file, for example. >[!TIP] > @@ -116,7 +116,7 @@ For `path: ./app/html` and a change to `./app/html/index.html`: ### `ignore` -The `ignore` patterns are relative to the `path` defined in the current `watch` action, not to the project directory. In the following Example 1, the ignore path would be relative to the `./web` directory specified in the `path` attribute. +The `ignore` patterns are relative to the `path` defined in the current `watch` action, not to the project directory. In the following Example 1, the ignore path would be relative to the `./web` directory specified in the `path` attribute. ## Example 1 From 5a79330e6fd4cdcc245e794395ea358bea8c0ee6 Mon Sep 17 00:00:00 2001 From: "Adam.lee" Date: Tue, 15 Apr 2025 20:23:00 +0800 Subject: [PATCH 304/699] Fix some error description in the volumes manual (#22430) ## Description This Pull Request fixes a few error description in the "volumes" manual. ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/engine/storage/volumes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/manuals/engine/storage/volumes.md b/content/manuals/engine/storage/volumes.md index 0aa9c3fe708f..a62ca6f0facd 100644 --- a/content/manuals/engine/storage/volumes.md +++ b/content/manuals/engine/storage/volumes.md @@ -494,7 +494,7 @@ $ docker run --rm \ alpine mkdir -p /logs/app1 /logs/app2 $ docker run -d \ --name=app1 \ - --mount src=logs,dst=/var/log/app1/,volume-subpath=app1 \ + --mount src=logs,dst=/var/log/app1,volume-subpath=app1 \ app1:latest $ docker run -d \ --name=app2 \ @@ -552,7 +552,7 @@ volume. The following example assumes that you have two nodes, the first of which is a Docker host and can connect to the second node using SSH. -On the Docker host, install the `vieux/sshfs` plugin: +On the Docker host, install the `rclone/docker-volume-rclone` plugin: ```console $ docker plugin install --grant-all-permissions rclone/docker-volume-rclone --aliases rclone From 458ca8b842871ac4dc647033fd5a96f0136dd637 Mon Sep 17 00:00:00 2001 From: aevesdocker Date: Tue, 15 Apr 2025 13:27:23 +0100 Subject: [PATCH 305/699] network link --- content/manuals/engine/network/tutorials/standalone.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/engine/network/tutorials/standalone.md b/content/manuals/engine/network/tutorials/standalone.md index f9ee9490bce8..3e4c4a09d2a8 100644 --- a/content/manuals/engine/network/tutorials/standalone.md +++ b/content/manuals/engine/network/tutorials/standalone.md @@ -9,7 +9,7 @@ aliases: This series of tutorials deals with networking for standalone Docker containers. For networking with swarm services, see [Networking with swarm services](/manuals/engine/network/tutorials/overlay.md). If you need to -learn more about Docker networking in general, see the [overview](_index.md). +learn more about Docker networking in general, see the [overview](/manuals/engine/network/_index.md). This topic includes two different tutorials. You can run each of them on Linux, Windows, or a Mac, but for the last one, you need a second Docker From b1b6504d0e9656c868ef231a5ebc5a6e66e822f7 Mon Sep 17 00:00:00 2001 From: crazy-max <1951866+crazy-max@users.noreply.github.com> Date: Tue, 15 Apr 2025 17:00:07 +0000 Subject: [PATCH 306/699] vendor: github.com/docker/buildx v0.23.0 Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- _vendor/modules.txt | 4 +- data/buildx/docker_buildx_build.yaml | 2 +- data/buildx/docker_buildx_history.yaml | 2 + data/buildx/docker_buildx_history_export.yaml | 55 +++++++++++++++++++ data/buildx/docker_buildx_history_ls.yaml | 20 +++++++ go.mod | 6 +- go.sum | 2 + 7 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 data/buildx/docker_buildx_history_export.yaml diff --git a/_vendor/modules.txt b/_vendor/modules.txt index add37c275805..a945859abb37 100644 --- a/_vendor/modules.txt +++ b/_vendor/modules.txt @@ -1,6 +1,6 @@ # github.com/moby/moby v28.0.2+incompatible -# github.com/moby/buildkit v0.20.1 -# github.com/docker/buildx v0.22.0 +# github.com/moby/buildkit v0.21.0 +# github.com/docker/buildx v0.23.0 # github.com/docker/cli v28.0.4+incompatible # github.com/docker/compose/v2 v2.35.0 # github.com/docker/scout-cli v1.15.0 diff --git a/data/buildx/docker_buildx_build.yaml b/data/buildx/docker_buildx_build.yaml index d92407407222..57a0d8cbfeac 100644 --- a/data/buildx/docker_buildx_build.yaml +++ b/data/buildx/docker_buildx_build.yaml @@ -1433,7 +1433,7 @@ examples: |- ###### `type=file` usage In the following example, `type=file` is automatically detected because no - environment variable mathing `aws` (the ID) is set. + environment variable matching `aws` (the ID) is set. ```console $ docker buildx build --secret id=aws,src=$HOME/.aws/credentials . diff --git a/data/buildx/docker_buildx_history.yaml b/data/buildx/docker_buildx_history.yaml index e563d56c7bea..cc77851b07e4 100644 --- a/data/buildx/docker_buildx_history.yaml +++ b/data/buildx/docker_buildx_history.yaml @@ -5,6 +5,7 @@ usage: docker buildx history pname: docker buildx plink: docker_buildx.yaml cname: + - docker buildx history export - docker buildx history import - docker buildx history inspect - docker buildx history logs @@ -13,6 +14,7 @@ cname: - docker buildx history rm - docker buildx history trace clink: + - docker_buildx_history_export.yaml - docker_buildx_history_import.yaml - docker_buildx_history_inspect.yaml - docker_buildx_history_logs.yaml diff --git a/data/buildx/docker_buildx_history_export.yaml b/data/buildx/docker_buildx_history_export.yaml new file mode 100644 index 000000000000..e70b8f8fba95 --- /dev/null +++ b/data/buildx/docker_buildx_history_export.yaml @@ -0,0 +1,55 @@ +command: docker buildx history export +short: Export a build into Docker Desktop bundle +long: Export a build into Docker Desktop bundle +usage: docker buildx history export [OPTIONS] [REF] +pname: docker buildx history +plink: docker_buildx_history.yaml +options: + - option: all + value_type: bool + default_value: "false" + description: Export all records for the builder + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false + - option: output + shorthand: o + value_type: string + description: Output file path + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false +inherited_options: + - option: builder + value_type: string + description: Override the configured builder instance + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false + - option: debug + shorthand: D + value_type: bool + default_value: "false" + description: Enable debug logging + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false +deprecated: false +hidden: false +experimental: false +experimentalcli: false +kubernetes: false +swarm: false + diff --git a/data/buildx/docker_buildx_history_ls.yaml b/data/buildx/docker_buildx_history_ls.yaml index a1bdf1833ee1..ab7a3abbb3b1 100644 --- a/data/buildx/docker_buildx_history_ls.yaml +++ b/data/buildx/docker_buildx_history_ls.yaml @@ -5,6 +5,16 @@ usage: docker buildx history ls pname: docker buildx history plink: docker_buildx_history.yaml options: + - option: filter + value_type: stringArray + default_value: '[]' + description: Provide filter values (e.g., `status=error`) + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false - option: format value_type: string default_value: table @@ -15,6 +25,16 @@ options: experimentalcli: false kubernetes: false swarm: false + - option: local + value_type: bool + default_value: "false" + description: List records for current repository only + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false - option: no-trunc value_type: bool default_value: "false" diff --git a/go.mod b/go.mod index 7bb751dbd1d1..b19b80e56f8d 100644 --- a/go.mod +++ b/go.mod @@ -5,16 +5,16 @@ go 1.23.8 toolchain go1.24.1 require ( - github.com/docker/buildx v0.22.0 // indirect + github.com/docker/buildx v0.23.0 // indirect github.com/docker/cli v28.0.4+incompatible // indirect github.com/docker/compose/v2 v2.35.0 // indirect github.com/docker/scout-cli v1.15.0 // indirect - github.com/moby/buildkit v0.20.1 // indirect + github.com/moby/buildkit v0.21.0 // indirect github.com/moby/moby v28.0.2+incompatible // indirect ) replace ( - github.com/docker/buildx => github.com/docker/buildx v0.22.0 + github.com/docker/buildx => github.com/docker/buildx v0.23.0 github.com/docker/cli => github.com/docker/cli v28.0.2+incompatible github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.35.0 github.com/docker/scout-cli => github.com/docker/scout-cli v1.15.0 diff --git a/go.sum b/go.sum index a5d17463c694..4c52ab50f7f1 100644 --- a/go.sum +++ b/go.sum @@ -102,6 +102,8 @@ github.com/docker/buildx v0.21.3 h1:LEmhk3D9WOboMeC+hlfOUnB1jylXcDfGHjqAL7Tvwks= github.com/docker/buildx v0.21.3/go.mod h1:8V4UMnlKsaGYwz83BygmIbJIFEAYGHT6KAv8akDZmqo= github.com/docker/buildx v0.22.0 h1:pGTcGZa+kxpYUlM/6ACsp1hXhkEDulz++RNXPdE8Afk= github.com/docker/buildx v0.22.0/go.mod h1:ThbnUe4kNiStlq6cLXruElyEdSTdPL3k/QerNUmPvHE= +github.com/docker/buildx v0.23.0 h1:qoYhuWyZ6PVCrWbkxClLzBWDBCUkyFK6Chjzg6nU+V8= +github.com/docker/buildx v0.23.0/go.mod h1:y/6Zf/y3Bf0zTWqgg8PuNFATcqnuhFmQuNf4VyrnPtg= github.com/docker/cli v24.0.2+incompatible h1:QdqR7znue1mtkXIJ+ruQMGQhpw2JzMJLRXp6zpzF6tM= github.com/docker/cli v24.0.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v24.0.4+incompatible h1:Y3bYF9ekNTm2VFz5U/0BlMdJy73D+Y1iAAZ8l63Ydzw= From e4bb9a9b973bb520888445a7ce4f9a0004559e90 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Wed, 16 Apr 2025 07:45:37 +0100 Subject: [PATCH 307/699] Go dmr (#22431) ## Description Adds a go link for the DMR feature in DD ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- data/redirects.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/redirects.yml b/data/redirects.yml index 2cd45096e3a5..5a9ab2b671d6 100644 --- a/data/redirects.yml +++ b/data/redirects.yml @@ -294,3 +294,9 @@ - /go/desktop-license/ "/docker-hub/usage/pulls/": - /go/hub-pull-limits/ + +# Desktop DMR + +"/desktop/features/model-runner/": + - /go/model-runner/ + \ No newline at end of file From ced10b917e8e1fdea5f3f42f120bb528668b5e0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Gronowski?= Date: Wed, 16 Apr 2025 11:49:43 +0000 Subject: [PATCH 308/699] Merge pull request #22437 from vvoland/fix-make-vendor Fix `make vendor` --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index cfe29a65fbf6..c7e22db80cc7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ # check=skip=InvalidBaseImagePlatform ARG ALPINE_VERSION=3.21 -ARG GO_VERSION=1.23 +ARG GO_VERSION=1.23.8 ARG HTMLTEST_VERSION=0.17.0 ARG HUGO_VERSION=0.141.0 ARG NODE_VERSION=22 From 3da3b16a61aef1c77fa0e0037e2d30a3e452e67b Mon Sep 17 00:00:00 2001 From: Cesar Talledo Date: Wed, 16 Apr 2025 06:13:36 -0700 Subject: [PATCH 309/699] admin-settings: add note regarding KinD + ECI config. (#22435) ## Description In the admin-settings docs, in the section that describes settings for Docker Desktop Kubernetes, add a note indicating that if a custom repository is used for Kubernetes node images, and if Enhanced Container Isolation (ECI) is enabled, the custom repository images must also be added to the ECI Docker Socket image list setting. ## Related issues or tickets https://docker.atlassian.net/browse/POS-2924 https://docker.atlassian.net/browse/SEG-1102 ## Reviews - [ ] Technical review - [X] Editorial review - [ ] Product review --------- Signed-off-by: Cesar Talledo Co-authored-by: Sarah Sanders --- .../configure-json-file.md | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md index 3fdcf7b0054d..9b61004cf50f 100644 --- a/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md @@ -182,7 +182,7 @@ The following `admin-settings.json` code and table provides an example of the re } ``` -### General +### General |Parameter|OS|Description|Version| |:-------------------------------|---|:-------------------------------|---| @@ -195,7 +195,7 @@ The following `admin-settings.json` code and table provides an example of the re | `desktopTerminalEnabled` | | If `value` is set to `false`, developers cannot use the Docker terminal to interact with the host machine and execute commands directly from Docker Desktop. | | |`exposeDockerAPIOnTCP2375`| Windows only| Exposes the Docker API on a specified port. If `value` is set to true, the Docker API is exposed on port 2375. Note: This is unauthenticated and should only be enabled if protected by suitable firewall rules.| | -### File sharing and emulation +### File sharing and emulation |Parameter|OS|Description|Version| |:-------------------------------|---|:-------------------------------|---| @@ -241,7 +241,7 @@ The following `admin-settings.json` code and table provides an example of the re |        `dockerDaemonOptions` | | Overrides the options in the Linux daemon config file. See the [Docker Engine reference](/reference/cli/dockerd/#daemon-configuration-file).| | > [!NOTE] -> +> > This setting is not available to configure via the Docker Admin Console. ### Kubernetes @@ -250,7 +250,16 @@ The following `admin-settings.json` code and table provides an example of the re |:-------------------------------|---|:-------------------------------|---| |`kubernetes`| | If `enabled` is set to true, a Kubernetes single-node cluster is started when Docker Desktop starts. If `showSystemContainers` is set to true, Kubernetes containers are displayed in the Docker Desktop Dashboard and when you run `docker ps`. `imagesRepository` lets you specify which repository Docker Desktop pulls the Kubernetes images from. For example, `"imagesRepository": "registry-1.docker.io/docker"`. | | -### Features in development +> [!NOTE] +> +> When using the `imagesRepository` setting and Enhanced Container Isolation (ECI), add the following images to the [ECI Docker socket mount image list](#enhanced-container-isolation): +> +> `/desktop-cloud-provider-kind:*` +> `/desktop-containerd-registry-mirror:*` +> +> These containers mount the Docker socket, so you must add the images to the ECI images list. If not, ECI will block the mount and Kubernetes won't start. + +### Features in development |Parameter|OS|Description|Version| |:-------------------------------|---|:-------------------------------|---| @@ -258,7 +267,7 @@ The following `admin-settings.json` code and table provides an example of the re | `allowBetaFeatures`| | If `value` is set to `false`, beta features are disabled.| | | `enableDockerAI` | | If `value` is set to `false`, Docker AI (Ask Gordon) features are disabled. | | -### Enhanced Container Isolation +### Enhanced Container Isolation |Parameter|OS|Description|Version| |:-------------------------------|---|:-------------------------------|---| @@ -282,4 +291,4 @@ For settings to take effect: So as not to disrupt your developers' workflow, Docker doesn't automatically mandate that developers re-launch and re-authenticate once a change has been made. -In Docker Desktop, developers see the relevant settings grayed out. \ No newline at end of file +In Docker Desktop, developers see the relevant settings grayed out. From 5226053fe9532565e8bfac0fa250d4a4e5b60192 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Wed, 16 Apr 2025 15:17:35 +0200 Subject: [PATCH 310/699] buildx: buildx history export stub Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- .../cli/docker/buildx/history/export.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 content/reference/cli/docker/buildx/history/export.md diff --git a/content/reference/cli/docker/buildx/history/export.md b/content/reference/cli/docker/buildx/history/export.md new file mode 100644 index 000000000000..6f38ca206415 --- /dev/null +++ b/content/reference/cli/docker/buildx/history/export.md @@ -0,0 +1,16 @@ +--- +datafolder: buildx +datafile: docker_buildx_history_export +title: docker buildx history export +layout: cli +aliases: +- /engine/reference/commandline/buildx_history_export/ +--- + + From 98beb3b9cbbb7d52bde5d20ddb33af429be8678d Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Wed, 16 Apr 2025 16:18:19 +0200 Subject: [PATCH 311/699] build: dockerfile 1.14.1 and 1.15.0 release notes (#22443) ## Description * https://github.com/moby/buildkit/releases/tag/dockerfile%2F1.14.1 * https://github.com/moby/buildkit/releases/tag/dockerfile%2F1.15.0 ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- .../buildkit/dockerfile-release-notes.md | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/content/manuals/build/buildkit/dockerfile-release-notes.md b/content/manuals/build/buildkit/dockerfile-release-notes.md index 6aada35dcd6a..35e5a586b04c 100644 --- a/content/manuals/build/buildkit/dockerfile-release-notes.md +++ b/content/manuals/build/buildkit/dockerfile-release-notes.md @@ -13,6 +13,37 @@ issues, and bug fixes in [Dockerfile reference](/reference/dockerfile.md). For usage, see the [Dockerfile frontend syntax](frontend.md) page. +## 1.15.0 + +{{< release-date date="2025-04-15" >}} + +The full release note for this release is available +[on GitHub](https://github.com/moby/buildkit/releases/tag/dockerfile%2F1.15.0). + +```dockerfile +# syntax=docker/dockerfile:1.15.0 +``` + +- Build error for invalid target now shows suggestions for correct possible names. [moby/buildkit#5851](https://github.com/moby/buildkit/pull/5851) +- Fix SBOM attestation producing error for Windows targets. [moby/buildkit#5837](https://github.com/moby/buildkit/pull/5837) +- Fix recursive `ARG` producing an infinite loop when processing an outline request. [moby/buildkit#5823](https://github.com/moby/buildkit/pull/5823) +- Fix parsing syntax directive from JSON that would fail if the JSON had other datatypes than strings. [moby/buildkit#5815](https://github.com/moby/buildkit/pull/5815) +- Fix platform in image config being in unnormalized form (regression from 1.12). [moby/buildkit#5776](https://github.com/moby/buildkit/pull/5776) +- Fix copying into destination directory when directory is not present with WCOW. [moby/buildkit#5249](https://github.com/moby/buildkit/pull/5249) + +## 1.14.1 + +{{< release-date date="2025-03-05" >}} + +The full release note for this release is available +[on GitHub](https://github.com/moby/buildkit/releases/tag/dockerfile%2F1.14.1). + +```dockerfile +# syntax=docker/dockerfile:1.14.1 +``` + +- Normalize platform in image config. [moby/buildkit#5776](https://github.com/moby/buildkit/pull/5776) + ## 1.14.0 {{< release-date date="2025-02-19" >}} From 6324a8ce55e3cd3afe099795fa00a49aadadf6ff Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Wed, 16 Apr 2025 16:19:52 +0200 Subject: [PATCH 312/699] build: buildx 0.22.0 and 0.23.0 release notes (#22442) ## Description * https://github.com/docker/buildx/releases/tag/v0.22.0 * https://github.com/docker/buildx/releases/tag/v0.23.0 ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- content/manuals/build/release-notes.md | 48 ++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/content/manuals/build/release-notes.md b/content/manuals/build/release-notes.md index 978cf201ca49..14a60eef2e79 100644 --- a/content/manuals/build/release-notes.md +++ b/content/manuals/build/release-notes.md @@ -10,6 +10,54 @@ toc_max: 2 This page contains information about the new features, improvements, and bug fixes in [Docker Buildx](https://github.com/docker/buildx). +## 0.23.0 + +{{< release-date date="2025-04-15" >}} + +The full release note for this release is available +[on GitHub](https://github.com/docker/buildx/releases/tag/v0.23.0). + +### New + +- New `buildx history export` command allows exporting the build record into a bundle that can be imported to [Docker Desktop](/desktop/). [docker/buildx#3073](https://github.com/docker/buildx/pull/3073) + +### Enhancements + +- New `--local` and `--filter` flags allow filtering history records in `buildx history ls`. [docker/buildx#3091](https://github.com/docker/buildx/pull/3091) +- Compose compatibility has been updated to v2.6.0. [docker/buildx#3080](https://github.com/docker/buildx/pull/3080), [docker/buildx#3105](https://github.com/docker/buildx/pull/3105) +- Support CLI environment variables in standalone mode. [docker/buildx#3087](https://github.com/docker/buildx/pull/3087) + +### Bug fixes + +- Fix `--print` output for Bake producing output with unescaped variables that could cause build errors later. [docker/buildx#3097](https://github.com/docker/buildx/pull/3097) +- Fix `additional_contexts` field not working correctly when pointing to another service. [docker/buildx#3090](https://github.com/docker/buildx/pull/3090) +- Fix empty validation block crashing the Bake HCL parser. [docker/buildx#3101](https://github.com/docker/buildx/pull/3101) + +## 0.22.0 + +{{< release-date date="2025-03-18" >}} + +The full release note for this release is available +[on GitHub](https://github.com/docker/buildx/releases/tag/v0.22.0). + +### New + +- New command `buildx history import` lets you import build records into Docker Desktop for further debugging in the [Build UI](/desktop/use-desktop/builds/). This command requires [Docker Desktop](/desktop/) to be installed. [docker/buildx#3039](https://github.com/docker/buildx/pull/3039) + +### Enhancements + +- History records can now be opened by offset from the latest in `history inspect`, `history logs` and `history open` commands (e.g. `^1`). [docker/buildx#3049](https://github.com/docker/buildx/pull/3049), [docker/buildx#3055](https://github.com/docker/buildx/pull/3055) +- Bake now supports the `+=` operator to append when using `--set` for overrides. [docker/buildx#3031](https://github.com/docker/buildx/pull/3031) +- Docker container driver adds GPU devices to the container if available. [docker/buildx#3063](https://github.com/docker/buildx/pull/3063) +- Annotations can now be set when using overrides with Bake. [docker/buildx#2997](https://github.com/docker/buildx/pull/2997) +- NetBSD binaries are now included in the release. [docker/buildx#2901](https://github.com/docker/buildx/pull/2901) +- The `inspect` and `create` commands now return an error if a node fails to boot. [docker/buildx#3062](https://github.com/docker/buildx/pull/3062) + +### Bug fixes + +- Fix double pushing with Docker driver when the containerd image store is enabled. [docker/buildx#3023](https://github.com/docker/buildx/pull/3023) +- Fix multiple tags being pushed for `imagetools create` command. Now only the final manifest pushes by tag. [docker/buildx#3024](https://github.com/docker/buildx/pull/3024) + ## 0.21.0 {{< release-date date="2025-02-19" >}} From a996f877f912a96469b237df0b5b4442a95107c5 Mon Sep 17 00:00:00 2001 From: Ian Lee Date: Wed, 16 Apr 2025 23:47:11 -0700 Subject: [PATCH 313/699] Fixed typo in kubectl path (#22447) Noticed a typo in the path for kubectl at least as of Docker Desktop 4.40.0 --- content/manuals/desktop/features/kubernetes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/desktop/features/kubernetes.md b/content/manuals/desktop/features/kubernetes.md index a83083bbe163..1a7f77313e15 100644 --- a/content/manuals/desktop/features/kubernetes.md +++ b/content/manuals/desktop/features/kubernetes.md @@ -37,7 +37,7 @@ Turning the Kubernetes server on or off in Docker Desktop does not affect your o 4. Choose your [cluster provisioning method](#cluster-provisioning-method). 5. Select **Apply & Restart** to save the settings. -This sets up the images required to run the Kubernetes server as containers, and installs the `kubectl` command-line tool on your system at `/usr/local/bin/kubectl` (Mac) or `C:\Program Files\Docker\Docker\Resources\bin\kubectl.exe` (Windows). +This sets up the images required to run the Kubernetes server as containers, and installs the `kubectl` command-line tool on your system at `/usr/local/bin/kubectl` (Mac) or `C:\Program Files\Docker\Docker\resources\bin\kubectl.exe` (Windows). > [!NOTE] > From 060688a95e84090f46c9fb8b21da47fba92d4d73 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Thu, 17 Apr 2025 08:31:11 -0400 Subject: [PATCH 314/699] admin: clarification for company owner seats (#22440) ## Description - Company owners do not normally occupy seats, but there are some caveats where they might (SSO is enabled or they are a member of an org) - Updated company owners doc, and FAQ ## Related issues or tickets - [ENGDOCS-2562](https://docker.atlassian.net/browse/ENGDOCS-2562?atlOrigin=eyJpIjoiMGZiNGEyMDRkNDNmNDE5MWI5YTZlN2VkMWFkMDM1MjkiLCJwIjoiaiJ9) ## Reviews - [ ] Editorial review [ENGDOCS-2562]: https://docker.atlassian.net/browse/ENGDOCS-2562?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- content/manuals/admin/company/owners.md | 10 +++++++-- content/manuals/admin/faqs/company-faqs.md | 24 ++++++++++++++-------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/content/manuals/admin/company/owners.md b/content/manuals/admin/company/owners.md index 6f50a39e104b..6ce17576fb19 100644 --- a/content/manuals/admin/company/owners.md +++ b/content/manuals/admin/company/owners.md @@ -12,8 +12,14 @@ A company can have multiple owners. Company owners have company-wide observability and can manage company-wide settings that apply to all associated organizations. In addition, company owners have the same access as organization owners for all associated organizations. Unlike organization owners, company -owners don't need to be member of an organization. When company owners aren't a -member in an organization, they don't occupy a seat. +owners don't need to be member of an organization. + +> [!NOTE] +> +> Company owners do not occupy a seat unless one of the following is true: +> +> - They are added as a member of an organization under your company +> - SSO is enabled ## Add a company owner diff --git a/content/manuals/admin/faqs/company-faqs.md b/content/manuals/admin/faqs/company-faqs.md index 9e8efcbc7f2e..33e0fb425e2f 100644 --- a/content/manuals/admin/faqs/company-faqs.md +++ b/content/manuals/admin/faqs/company-faqs.md @@ -32,14 +32,22 @@ You can add a maximum of 10 company owners to a single company account. ### Do company owners occupy a subscription seat? -Company owners don't occupy a seat in any organization unless they are added as a -member of the organization. Since company owners have the same access as -organization owners for all organizations associated with the company, it is not -necessary to add company owners to an organization. - -Note that when you first create a company, your account will be both a company -owner and an organization owner. Your account will occupy a seat as long as -you're an organization owner. +Company owners do not occupy a seat unless one of the following is true: + +- They are added as a member of an organization under your company +- SSO is enabled + +Although company owners have the same access as organization owners across all +organizations in the company, it's not necessary to add them to any +organization. Doing so will cause them to occupy a seat. + +When you first create a company, your account is both a company owner and an +organization owner. In that case, your account will occupy a seat as long as +you remain an organization owner. + +To avoid occupying a seat, [assign another user as the organization owner](/manuals/admin/organization/members.md#update-a-member-role) and remove yourself from the organization. +You'll retain full administrative access as a company owner without using a +subscription seat. ### What permissions does the company owner have in the associated/nested organizations? From a86ab99a21b99d9fec1867ca5fc43d53932eef5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Gronowski?= Date: Thu, 17 Apr 2025 14:05:52 +0000 Subject: [PATCH 315/699] engine: v28.1.0 (#22438) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Signed-off-by: Paweł Gronowski Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Co-authored-by: Usha Mandya <47779042+usha-mandya@users.noreply.github.com> --- _vale/config/vocabularies/Docker/accept.txt | 1 + .../docker/cli/docs/extend/_index.md | 64 +- .../github.com/moby/moby/docs/api/v1.44.yaml | 8 +- .../github.com/moby/moby/docs/api/v1.45.yaml | 8 +- .../github.com/moby/moby/docs/api/v1.46.yaml | 8 +- .../github.com/moby/moby/docs/api/v1.47.yaml | 8 +- .../github.com/moby/moby/docs/api/v1.48.yaml | 19 +- .../github.com/moby/moby/docs/api/v1.49.yaml | 13535 ++++++++++++++++ .../moby/moby/docs/api/version-history.md | 17 + _vendor/modules.txt | 4 +- content/manuals/engine/release-notes/28.md | 73 + content/reference/api/engine/version/v1.48.md | 2 - content/reference/api/engine/version/v1.49.md | 8 + go.mod | 8 +- go.sum | 4 + hugo.yaml | 8 +- 16 files changed, 13705 insertions(+), 70 deletions(-) create mode 100644 _vendor/github.com/moby/moby/docs/api/v1.49.yaml create mode 100644 content/reference/api/engine/version/v1.49.md diff --git a/_vale/config/vocabularies/Docker/accept.txt b/_vale/config/vocabularies/Docker/accept.txt index 943435bcdcc1..f2621ae38394 100644 --- a/_vale/config/vocabularies/Docker/accept.txt +++ b/_vale/config/vocabularies/Docker/accept.txt @@ -97,6 +97,7 @@ Sysbox Sysdig Testcontainers Traefik +Trixie Ubuntu Unix VMware diff --git a/_vendor/github.com/docker/cli/docs/extend/_index.md b/_vendor/github.com/docker/cli/docs/extend/_index.md index 57528444d1ee..8c85b104852f 100644 --- a/_vendor/github.com/docker/cli/docs/extend/_index.md +++ b/_vendor/github.com/docker/cli/docs/extend/_index.md @@ -35,31 +35,38 @@ Plugins that start successfully are listed as enabled in the output. After a plugin is installed, you can use it as an option for another Docker operation, such as creating a volume. -In the following example, you install the `sshfs` plugin, verify that it is +In the following example, you install the [`rclone` plugin](https://rclone.org/docker/), verify that it is enabled, and use it to create a volume. > [!NOTE] -> This example is intended for instructional purposes only. Once the volume is -> created, your SSH password to the remote host is exposed as plaintext when -> inspecting the volume. Delete the volume as soon as you are done with the -> example. +> This example is intended for instructional purposes only. -1. Install the `sshfs` plugin. +1. Set up the pre-requisite directories. By default they must exist on the host at the following locations: - ```console - $ docker plugin install vieux/sshfs + - `/var/lib/docker-plugins/rclone/config`. Reserved for the `rclone.conf` config file and must exist even if it's empty and the config file is not present. + - `/var/lib/docker-plugins/rclone/cache`. Holds the plugin state file as well as optional VFS caches. - Plugin "vieux/sshfs" is requesting the following privileges: - - network: [host] - - capabilities: [CAP_SYS_ADMIN] - Do you grant the above permissions? [y/N] y +2. Install the `rclone` plugin. - vieux/sshfs + ```console + $ docker plugin install rclone/docker-volume-rclone --alias rclone + + Plugin "rclone/docker-volume-rclone" is requesting the following privileges: + - network: [host] + - mount: [/var/lib/docker-plugins/rclone/config] + - mount: [/var/lib/docker-plugins/rclone/cache] + - device: [/dev/fuse] + - capabilities: [CAP_SYS_ADMIN] + Do you grant the above permissions? [y/N] ``` - The plugin requests 2 privileges: + The plugin requests 5 privileges: - It needs access to the `host` network. + - Access to pre-requisite directories to mount to store: + - Your Rclone config files + - Temporary cache data + - Gives access to the FUSE (Filesystem in Userspace) device. This is required because Rclone uses FUSE to mount remote storage as if it were a local filesystem. - It needs the `CAP_SYS_ADMIN` capability, which allows the plugin to run the `mount` command. @@ -68,24 +75,25 @@ enabled, and use it to create a volume. ```console $ docker plugin ls - ID NAME TAG DESCRIPTION ENABLED - 69553ca1d789 vieux/sshfs latest the `sshfs` plugin true + ID NAME DESCRIPTION ENABLED + aede66158353 rclone:latest Rclone volume plugin for Docker true ``` 3. Create a volume using the plugin. This example mounts the `/remote` directory on host `1.2.3.4` into a - volume named `sshvolume`. + volume named `rclonevolume`. This volume can now be mounted into containers. ```console $ docker volume create \ - -d vieux/sshfs \ - --name sshvolume \ - -o sshcmd=user@1.2.3.4:/remote \ - -o password=$(cat file_containing_password_for_remote_host) - - sshvolume + -d rclone \ + --name rclonevolume \ + -o type=sftp \ + -o path=remote \ + -o sftp-host=1.2.3.4 \ + -o sftp-user=user \ + -o "sftp-password=$(cat file_containing_password_for_remote_host)" ``` 4. Verify that the volume was created successfully. @@ -94,21 +102,21 @@ enabled, and use it to create a volume. $ docker volume ls DRIVER NAME - vieux/sshfs sshvolume + rclone rclonevolume ``` -5. Start a container that uses the volume `sshvolume`. +5. Start a container that uses the volume `rclonevolume`. ```console - $ docker run --rm -v sshvolume:/data busybox ls /data + $ docker run --rm -v rclonevolume:/data busybox ls /data ``` -6. Remove the volume `sshvolume` +6. Remove the volume `rclonevolume` ```console - $ docker volume rm sshvolume + $ docker volume rm rclonevolume sshvolume ``` diff --git a/_vendor/github.com/moby/moby/docs/api/v1.44.yaml b/_vendor/github.com/moby/moby/docs/api/v1.44.yaml index 0ef23a392e77..8e4e6121e622 100644 --- a/_vendor/github.com/moby/moby/docs/api/v1.44.yaml +++ b/_vendor/github.com/moby/moby/docs/api/v1.44.yaml @@ -9647,13 +9647,9 @@ paths: ### Image tarball format - An image tarball contains one directory per image layer (named using its long ID), each containing these files: + An image tarball contains [Content as defined in the OCI Image Layout Specification](https://github.com/opencontainers/image-spec/blob/v1.1.1/image-layout.md#content). - - `VERSION`: currently `1.0` - the file format version - - `json`: detailed layer information, similar to `docker inspect layer_id` - - `layer.tar`: A tarfile containing the filesystem changes in this layer - - The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories for storing attribute changes and deletions. + Additionally, includes the manifest.json file associated with a backwards compatible docker save format. If the tarball defines a repository, the tarball should also include a `repositories` file at the root that contains a list of repository and tag names mapped to layer IDs. diff --git a/_vendor/github.com/moby/moby/docs/api/v1.45.yaml b/_vendor/github.com/moby/moby/docs/api/v1.45.yaml index e0ec5013cc5a..56d346fea4ce 100644 --- a/_vendor/github.com/moby/moby/docs/api/v1.45.yaml +++ b/_vendor/github.com/moby/moby/docs/api/v1.45.yaml @@ -9627,13 +9627,9 @@ paths: ### Image tarball format - An image tarball contains one directory per image layer (named using its long ID), each containing these files: + An image tarball contains [Content as defined in the OCI Image Layout Specification](https://github.com/opencontainers/image-spec/blob/v1.1.1/image-layout.md#content). - - `VERSION`: currently `1.0` - the file format version - - `json`: detailed layer information, similar to `docker inspect layer_id` - - `layer.tar`: A tarfile containing the filesystem changes in this layer - - The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories for storing attribute changes and deletions. + Additionally, includes the manifest.json file associated with a backwards compatible docker save format. If the tarball defines a repository, the tarball should also include a `repositories` file at the root that contains a list of repository and tag names mapped to layer IDs. diff --git a/_vendor/github.com/moby/moby/docs/api/v1.46.yaml b/_vendor/github.com/moby/moby/docs/api/v1.46.yaml index b6ff826e7a96..8c4be6c3ce01 100644 --- a/_vendor/github.com/moby/moby/docs/api/v1.46.yaml +++ b/_vendor/github.com/moby/moby/docs/api/v1.46.yaml @@ -9761,13 +9761,9 @@ paths: ### Image tarball format - An image tarball contains one directory per image layer (named using its long ID), each containing these files: + An image tarball contains [Content as defined in the OCI Image Layout Specification](https://github.com/opencontainers/image-spec/blob/v1.1.1/image-layout.md#content). - - `VERSION`: currently `1.0` - the file format version - - `json`: detailed layer information, similar to `docker inspect layer_id` - - `layer.tar`: A tarfile containing the filesystem changes in this layer - - The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories for storing attribute changes and deletions. + Additionally, includes the manifest.json file associated with a backwards compatible docker save format. If the tarball defines a repository, the tarball should also include a `repositories` file at the root that contains a list of repository and tag names mapped to layer IDs. diff --git a/_vendor/github.com/moby/moby/docs/api/v1.47.yaml b/_vendor/github.com/moby/moby/docs/api/v1.47.yaml index e5e76c1bc590..4eb222a05074 100644 --- a/_vendor/github.com/moby/moby/docs/api/v1.47.yaml +++ b/_vendor/github.com/moby/moby/docs/api/v1.47.yaml @@ -9902,13 +9902,9 @@ paths: ### Image tarball format - An image tarball contains one directory per image layer (named using its long ID), each containing these files: + An image tarball contains [Content as defined in the OCI Image Layout Specification](https://github.com/opencontainers/image-spec/blob/v1.1.1/image-layout.md#content). - - `VERSION`: currently `1.0` - the file format version - - `json`: detailed layer information, similar to `docker inspect layer_id` - - `layer.tar`: A tarfile containing the filesystem changes in this layer - - The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories for storing attribute changes and deletions. + Additionally, includes the manifest.json file associated with a backwards compatible docker save format. If the tarball defines a repository, the tarball should also include a `repositories` file at the root that contains a list of repository and tag names mapped to layer IDs. diff --git a/_vendor/github.com/moby/moby/docs/api/v1.48.yaml b/_vendor/github.com/moby/moby/docs/api/v1.48.yaml index 646032d6e0ef..a2901377e5b5 100644 --- a/_vendor/github.com/moby/moby/docs/api/v1.48.yaml +++ b/_vendor/github.com/moby/moby/docs/api/v1.48.yaml @@ -10491,13 +10491,9 @@ paths: ### Image tarball format - An image tarball contains one directory per image layer (named using its long ID), each containing these files: + An image tarball contains [Content as defined in the OCI Image Layout Specification](https://github.com/opencontainers/image-spec/blob/v1.1.1/image-layout.md#content). - - `VERSION`: currently `1.0` - the file format version - - `json`: detailed layer information, similar to `docker inspect layer_id` - - `layer.tar`: A tarfile containing the filesystem changes in this layer - - The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories for storing attribute changes and deletions. + Additionally, includes the manifest.json file associated with a backwards compatible docker save format. If the tarball defines a repository, the tarball should also include a `repositories` file at the root that contains a list of repository and tag names mapped to layer IDs. @@ -10537,6 +10533,7 @@ paths: If not provided, the full multi-platform image will be saved. Example: `{"os": "linux", "architecture": "arm", "variant": "v5"}` + tags: ["Image"] /images/get: get: summary: "Export several images" @@ -10571,6 +10568,16 @@ paths: type: "array" items: type: "string" + - name: "platform" + type: "string" + in: "query" + description: | + JSON encoded OCI platform describing a platform which will be used + to select a platform-specific image to be saved if the image is + multi-platform. + If not provided, the full multi-platform image will be saved. + + Example: `{"os": "linux", "architecture": "arm", "variant": "v5"}` tags: ["Image"] /images/load: post: diff --git a/_vendor/github.com/moby/moby/docs/api/v1.49.yaml b/_vendor/github.com/moby/moby/docs/api/v1.49.yaml new file mode 100644 index 000000000000..1183aaf2b59d --- /dev/null +++ b/_vendor/github.com/moby/moby/docs/api/v1.49.yaml @@ -0,0 +1,13535 @@ +# A Swagger 2.0 (a.k.a. OpenAPI) definition of the Engine API. +# +# This is used for generating API documentation and the types used by the +# client/server. See api/README.md for more information. +# +# Some style notes: +# - This file is used by ReDoc, which allows GitHub Flavored Markdown in +# descriptions. +# - There is no maximum line length, for ease of editing and pretty diffs. +# - operationIds are in the format "NounVerb", with a singular noun. + +swagger: "2.0" +schemes: + - "http" + - "https" +produces: + - "application/json" + - "text/plain" +consumes: + - "application/json" + - "text/plain" +basePath: "/v1.49" +info: + title: "Docker Engine API" + version: "1.49" + x-logo: + url: "https://docs.docker.com/assets/images/logo-docker-main.png" + description: | + The Engine API is an HTTP API served by Docker Engine. It is the API the + Docker client uses to communicate with the Engine, so everything the Docker + client can do can be done with the API. + + Most of the client's commands map directly to API endpoints (e.g. `docker ps` + is `GET /containers/json`). The notable exception is running containers, + which consists of several API calls. + + # Errors + + The API uses standard HTTP status codes to indicate the success or failure + of the API call. The body of the response will be JSON in the following + format: + + ``` + { + "message": "page not found" + } + ``` + + # Versioning + + The API is usually changed in each release, so API calls are versioned to + ensure that clients don't break. To lock to a specific version of the API, + you prefix the URL with its version, for example, call `/v1.30/info` to use + the v1.30 version of the `/info` endpoint. If the API version specified in + the URL is not supported by the daemon, a HTTP `400 Bad Request` error message + is returned. + + If you omit the version-prefix, the current version of the API (v1.49) is used. + For example, calling `/info` is the same as calling `/v1.49/info`. Using the + API without a version-prefix is deprecated and will be removed in a future release. + + Engine releases in the near future should support this version of the API, + so your client will continue to work even if it is talking to a newer Engine. + + The API uses an open schema model, which means the server may add extra properties + to responses. Likewise, the server will ignore any extra query parameters and + request body properties. When you write clients, you need to ignore additional + properties in responses to ensure they do not break when talking to newer + daemons. + + + # Authentication + + Authentication for registries is handled client side. The client has to send + authentication details to various endpoints that need to communicate with + registries, such as `POST /images/(name)/push`. These are sent as + `X-Registry-Auth` header as a [base64url encoded](https://tools.ietf.org/html/rfc4648#section-5) + (JSON) string with the following structure: + + ``` + { + "username": "string", + "password": "string", + "email": "string", + "serveraddress": "string" + } + ``` + + The `serveraddress` is a domain/IP without a protocol. Throughout this + structure, double quotes are required. + + If you have already got an identity token from the [`/auth` endpoint](#operation/SystemAuth), + you can just pass this instead of credentials: + + ``` + { + "identitytoken": "9cbaf023786cd7..." + } + ``` + +# The tags on paths define the menu sections in the ReDoc documentation, so +# the usage of tags must make sense for that: +# - They should be singular, not plural. +# - There should not be too many tags, or the menu becomes unwieldy. For +# example, it is preferable to add a path to the "System" tag instead of +# creating a tag with a single path in it. +# - The order of tags in this list defines the order in the menu. +tags: + # Primary objects + - name: "Container" + x-displayName: "Containers" + description: | + Create and manage containers. + - name: "Image" + x-displayName: "Images" + - name: "Network" + x-displayName: "Networks" + description: | + Networks are user-defined networks that containers can be attached to. + See the [networking documentation](https://docs.docker.com/network/) + for more information. + - name: "Volume" + x-displayName: "Volumes" + description: | + Create and manage persistent storage that can be attached to containers. + - name: "Exec" + x-displayName: "Exec" + description: | + Run new commands inside running containers. Refer to the + [command-line reference](https://docs.docker.com/engine/reference/commandline/exec/) + for more information. + + To exec a command in a container, you first need to create an exec instance, + then start it. These two API endpoints are wrapped up in a single command-line + command, `docker exec`. + + # Swarm things + - name: "Swarm" + x-displayName: "Swarm" + description: | + Engines can be clustered together in a swarm. Refer to the + [swarm mode documentation](https://docs.docker.com/engine/swarm/) + for more information. + - name: "Node" + x-displayName: "Nodes" + description: | + Nodes are instances of the Engine participating in a swarm. Swarm mode + must be enabled for these endpoints to work. + - name: "Service" + x-displayName: "Services" + description: | + Services are the definitions of tasks to run on a swarm. Swarm mode must + be enabled for these endpoints to work. + - name: "Task" + x-displayName: "Tasks" + description: | + A task is a container running on a swarm. It is the atomic scheduling unit + of swarm. Swarm mode must be enabled for these endpoints to work. + - name: "Secret" + x-displayName: "Secrets" + description: | + Secrets are sensitive data that can be used by services. Swarm mode must + be enabled for these endpoints to work. + - name: "Config" + x-displayName: "Configs" + description: | + Configs are application configurations that can be used by services. Swarm + mode must be enabled for these endpoints to work. + # System things + - name: "Plugin" + x-displayName: "Plugins" + - name: "System" + x-displayName: "System" + +definitions: + Port: + type: "object" + description: "An open port on a container" + required: [PrivatePort, Type] + properties: + IP: + type: "string" + format: "ip-address" + description: "Host IP address that the container's port is mapped to" + PrivatePort: + type: "integer" + format: "uint16" + x-nullable: false + description: "Port on the container" + PublicPort: + type: "integer" + format: "uint16" + description: "Port exposed on the host" + Type: + type: "string" + x-nullable: false + enum: ["tcp", "udp", "sctp"] + example: + PrivatePort: 8080 + PublicPort: 80 + Type: "tcp" + + MountPoint: + type: "object" + description: | + MountPoint represents a mount point configuration inside the container. + This is used for reporting the mountpoints in use by a container. + properties: + Type: + description: | + The mount type: + + - `bind` a mount of a file or directory from the host into the container. + - `volume` a docker volume with the given `Name`. + - `image` a docker image + - `tmpfs` a `tmpfs`. + - `npipe` a named pipe from the host into the container. + - `cluster` a Swarm cluster volume + type: "string" + enum: + - "bind" + - "volume" + - "image" + - "tmpfs" + - "npipe" + - "cluster" + example: "volume" + Name: + description: | + Name is the name reference to the underlying data defined by `Source` + e.g., the volume name. + type: "string" + example: "myvolume" + Source: + description: | + Source location of the mount. + + For volumes, this contains the storage location of the volume (within + `/var/lib/docker/volumes/`). For bind-mounts, and `npipe`, this contains + the source (host) part of the bind-mount. For `tmpfs` mount points, this + field is empty. + type: "string" + example: "/var/lib/docker/volumes/myvolume/_data" + Destination: + description: | + Destination is the path relative to the container root (`/`) where + the `Source` is mounted inside the container. + type: "string" + example: "/usr/share/nginx/html/" + Driver: + description: | + Driver is the volume driver used to create the volume (if it is a volume). + type: "string" + example: "local" + Mode: + description: | + Mode is a comma separated list of options supplied by the user when + creating the bind/volume mount. + + The default is platform-specific (`"z"` on Linux, empty on Windows). + type: "string" + example: "z" + RW: + description: | + Whether the mount is mounted writable (read-write). + type: "boolean" + example: true + Propagation: + description: | + Propagation describes how mounts are propagated from the host into the + mount point, and vice-versa. Refer to the [Linux kernel documentation](https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt) + for details. This field is not used on Windows. + type: "string" + example: "" + + DeviceMapping: + type: "object" + description: "A device mapping between the host and container" + properties: + PathOnHost: + type: "string" + PathInContainer: + type: "string" + CgroupPermissions: + type: "string" + example: + PathOnHost: "/dev/deviceName" + PathInContainer: "/dev/deviceName" + CgroupPermissions: "mrw" + + DeviceRequest: + type: "object" + description: "A request for devices to be sent to device drivers" + properties: + Driver: + type: "string" + example: "nvidia" + Count: + type: "integer" + example: -1 + DeviceIDs: + type: "array" + items: + type: "string" + example: + - "0" + - "1" + - "GPU-fef8089b-4820-abfc-e83e-94318197576e" + Capabilities: + description: | + A list of capabilities; an OR list of AND lists of capabilities. + type: "array" + items: + type: "array" + items: + type: "string" + example: + # gpu AND nvidia AND compute + - ["gpu", "nvidia", "compute"] + Options: + description: | + Driver-specific options, specified as a key/value pairs. These options + are passed directly to the driver. + type: "object" + additionalProperties: + type: "string" + + ThrottleDevice: + type: "object" + properties: + Path: + description: "Device path" + type: "string" + Rate: + description: "Rate" + type: "integer" + format: "int64" + minimum: 0 + + Mount: + type: "object" + properties: + Target: + description: "Container path." + type: "string" + Source: + description: "Mount source (e.g. a volume name, a host path)." + type: "string" + Type: + description: | + The mount type. Available types: + + - `bind` Mounts a file or directory from the host into the container. Must exist prior to creating the container. + - `volume` Creates a volume with the given name and options (or uses a pre-existing volume with the same name and options). These are **not** removed when the container is removed. + - `image` Mounts an image. + - `tmpfs` Create a tmpfs with the given options. The mount source cannot be specified for tmpfs. + - `npipe` Mounts a named pipe from the host into the container. Must exist prior to creating the container. + - `cluster` a Swarm cluster volume + type: "string" + enum: + - "bind" + - "volume" + - "image" + - "tmpfs" + - "npipe" + - "cluster" + ReadOnly: + description: "Whether the mount should be read-only." + type: "boolean" + Consistency: + description: "The consistency requirement for the mount: `default`, `consistent`, `cached`, or `delegated`." + type: "string" + BindOptions: + description: "Optional configuration for the `bind` type." + type: "object" + properties: + Propagation: + description: "A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`." + type: "string" + enum: + - "private" + - "rprivate" + - "shared" + - "rshared" + - "slave" + - "rslave" + NonRecursive: + description: "Disable recursive bind mount." + type: "boolean" + default: false + CreateMountpoint: + description: "Create mount point on host if missing" + type: "boolean" + default: false + ReadOnlyNonRecursive: + description: | + Make the mount non-recursively read-only, but still leave the mount recursive + (unless NonRecursive is set to `true` in conjunction). + + Added in v1.44, before that version all read-only mounts were + non-recursive by default. To match the previous behaviour this + will default to `true` for clients on versions prior to v1.44. + type: "boolean" + default: false + ReadOnlyForceRecursive: + description: "Raise an error if the mount cannot be made recursively read-only." + type: "boolean" + default: false + VolumeOptions: + description: "Optional configuration for the `volume` type." + type: "object" + properties: + NoCopy: + description: "Populate volume with data from the target." + type: "boolean" + default: false + Labels: + description: "User-defined key/value metadata." + type: "object" + additionalProperties: + type: "string" + DriverConfig: + description: "Map of driver specific options" + type: "object" + properties: + Name: + description: "Name of the driver to use to create the volume." + type: "string" + Options: + description: "key/value map of driver specific options." + type: "object" + additionalProperties: + type: "string" + Subpath: + description: "Source path inside the volume. Must be relative without any back traversals." + type: "string" + example: "dir-inside-volume/subdirectory" + ImageOptions: + description: "Optional configuration for the `image` type." + type: "object" + properties: + Subpath: + description: "Source path inside the image. Must be relative without any back traversals." + type: "string" + example: "dir-inside-image/subdirectory" + TmpfsOptions: + description: "Optional configuration for the `tmpfs` type." + type: "object" + properties: + SizeBytes: + description: "The size for the tmpfs mount in bytes." + type: "integer" + format: "int64" + Mode: + description: "The permission mode for the tmpfs mount in an integer." + type: "integer" + Options: + description: | + The options to be passed to the tmpfs mount. An array of arrays. + Flag options should be provided as 1-length arrays. Other types + should be provided as as 2-length arrays, where the first item is + the key and the second the value. + type: "array" + items: + type: "array" + minItems: 1 + maxItems: 2 + items: + type: "string" + example: + [["noexec"]] + + RestartPolicy: + description: | + The behavior to apply when the container exits. The default is not to + restart. + + An ever increasing delay (double the previous delay, starting at 100ms) is + added before each restart to prevent flooding the server. + type: "object" + properties: + Name: + type: "string" + description: | + - Empty string means not to restart + - `no` Do not automatically restart + - `always` Always restart + - `unless-stopped` Restart always except when the user has manually stopped the container + - `on-failure` Restart only when the container exit code is non-zero + enum: + - "" + - "no" + - "always" + - "unless-stopped" + - "on-failure" + MaximumRetryCount: + type: "integer" + description: | + If `on-failure` is used, the number of times to retry before giving up. + + Resources: + description: "A container's resources (cgroups config, ulimits, etc)" + type: "object" + properties: + # Applicable to all platforms + CpuShares: + description: | + An integer value representing this container's relative CPU weight + versus other containers. + type: "integer" + Memory: + description: "Memory limit in bytes." + type: "integer" + format: "int64" + default: 0 + # Applicable to UNIX platforms + CgroupParent: + description: | + Path to `cgroups` under which the container's `cgroup` is created. If + the path is not absolute, the path is considered to be relative to the + `cgroups` path of the init process. Cgroups are created if they do not + already exist. + type: "string" + BlkioWeight: + description: "Block IO weight (relative weight)." + type: "integer" + minimum: 0 + maximum: 1000 + BlkioWeightDevice: + description: | + Block IO weight (relative device weight) in the form: + + ``` + [{"Path": "device_path", "Weight": weight}] + ``` + type: "array" + items: + type: "object" + properties: + Path: + type: "string" + Weight: + type: "integer" + minimum: 0 + BlkioDeviceReadBps: + description: | + Limit read rate (bytes per second) from a device, in the form: + + ``` + [{"Path": "device_path", "Rate": rate}] + ``` + type: "array" + items: + $ref: "#/definitions/ThrottleDevice" + BlkioDeviceWriteBps: + description: | + Limit write rate (bytes per second) to a device, in the form: + + ``` + [{"Path": "device_path", "Rate": rate}] + ``` + type: "array" + items: + $ref: "#/definitions/ThrottleDevice" + BlkioDeviceReadIOps: + description: | + Limit read rate (IO per second) from a device, in the form: + + ``` + [{"Path": "device_path", "Rate": rate}] + ``` + type: "array" + items: + $ref: "#/definitions/ThrottleDevice" + BlkioDeviceWriteIOps: + description: | + Limit write rate (IO per second) to a device, in the form: + + ``` + [{"Path": "device_path", "Rate": rate}] + ``` + type: "array" + items: + $ref: "#/definitions/ThrottleDevice" + CpuPeriod: + description: "The length of a CPU period in microseconds." + type: "integer" + format: "int64" + CpuQuota: + description: | + Microseconds of CPU time that the container can get in a CPU period. + type: "integer" + format: "int64" + CpuRealtimePeriod: + description: | + The length of a CPU real-time period in microseconds. Set to 0 to + allocate no time allocated to real-time tasks. + type: "integer" + format: "int64" + CpuRealtimeRuntime: + description: | + The length of a CPU real-time runtime in microseconds. Set to 0 to + allocate no time allocated to real-time tasks. + type: "integer" + format: "int64" + CpusetCpus: + description: | + CPUs in which to allow execution (e.g., `0-3`, `0,1`). + type: "string" + example: "0-3" + CpusetMems: + description: | + Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only + effective on NUMA systems. + type: "string" + Devices: + description: "A list of devices to add to the container." + type: "array" + items: + $ref: "#/definitions/DeviceMapping" + DeviceCgroupRules: + description: "a list of cgroup rules to apply to the container" + type: "array" + items: + type: "string" + example: "c 13:* rwm" + DeviceRequests: + description: | + A list of requests for devices to be sent to device drivers. + type: "array" + items: + $ref: "#/definitions/DeviceRequest" + KernelMemoryTCP: + description: | + Hard limit for kernel TCP buffer memory (in bytes). Depending on the + OCI runtime in use, this option may be ignored. It is no longer supported + by the default (runc) runtime. + + This field is omitted when empty. + type: "integer" + format: "int64" + MemoryReservation: + description: "Memory soft limit in bytes." + type: "integer" + format: "int64" + MemorySwap: + description: | + Total memory limit (memory + swap). Set as `-1` to enable unlimited + swap. + type: "integer" + format: "int64" + MemorySwappiness: + description: | + Tune a container's memory swappiness behavior. Accepts an integer + between 0 and 100. + type: "integer" + format: "int64" + minimum: 0 + maximum: 100 + NanoCpus: + description: "CPU quota in units of 10-9 CPUs." + type: "integer" + format: "int64" + OomKillDisable: + description: "Disable OOM Killer for the container." + type: "boolean" + Init: + description: | + Run an init inside the container that forwards signals and reaps + processes. This field is omitted if empty, and the default (as + configured on the daemon) is used. + type: "boolean" + x-nullable: true + PidsLimit: + description: | + Tune a container's PIDs limit. Set `0` or `-1` for unlimited, or `null` + to not change. + type: "integer" + format: "int64" + x-nullable: true + Ulimits: + description: | + A list of resource limits to set in the container. For example: + + ``` + {"Name": "nofile", "Soft": 1024, "Hard": 2048} + ``` + type: "array" + items: + type: "object" + properties: + Name: + description: "Name of ulimit" + type: "string" + Soft: + description: "Soft limit" + type: "integer" + Hard: + description: "Hard limit" + type: "integer" + # Applicable to Windows + CpuCount: + description: | + The number of usable CPUs (Windows only). + + On Windows Server containers, the processor resource controls are + mutually exclusive. The order of precedence is `CPUCount` first, then + `CPUShares`, and `CPUPercent` last. + type: "integer" + format: "int64" + CpuPercent: + description: | + The usable percentage of the available CPUs (Windows only). + + On Windows Server containers, the processor resource controls are + mutually exclusive. The order of precedence is `CPUCount` first, then + `CPUShares`, and `CPUPercent` last. + type: "integer" + format: "int64" + IOMaximumIOps: + description: "Maximum IOps for the container system drive (Windows only)" + type: "integer" + format: "int64" + IOMaximumBandwidth: + description: | + Maximum IO in bytes per second for the container system drive + (Windows only). + type: "integer" + format: "int64" + + Limit: + description: | + An object describing a limit on resources which can be requested by a task. + type: "object" + properties: + NanoCPUs: + type: "integer" + format: "int64" + example: 4000000000 + MemoryBytes: + type: "integer" + format: "int64" + example: 8272408576 + Pids: + description: | + Limits the maximum number of PIDs in the container. Set `0` for unlimited. + type: "integer" + format: "int64" + default: 0 + example: 100 + + ResourceObject: + description: | + An object describing the resources which can be advertised by a node and + requested by a task. + type: "object" + properties: + NanoCPUs: + type: "integer" + format: "int64" + example: 4000000000 + MemoryBytes: + type: "integer" + format: "int64" + example: 8272408576 + GenericResources: + $ref: "#/definitions/GenericResources" + + GenericResources: + description: | + User-defined resources can be either Integer resources (e.g, `SSD=3`) or + String resources (e.g, `GPU=UUID1`). + type: "array" + items: + type: "object" + properties: + NamedResourceSpec: + type: "object" + properties: + Kind: + type: "string" + Value: + type: "string" + DiscreteResourceSpec: + type: "object" + properties: + Kind: + type: "string" + Value: + type: "integer" + format: "int64" + example: + - DiscreteResourceSpec: + Kind: "SSD" + Value: 3 + - NamedResourceSpec: + Kind: "GPU" + Value: "UUID1" + - NamedResourceSpec: + Kind: "GPU" + Value: "UUID2" + + HealthConfig: + description: "A test to perform to check that the container is healthy." + type: "object" + properties: + Test: + description: | + The test to perform. Possible values are: + + - `[]` inherit healthcheck from image or parent image + - `["NONE"]` disable healthcheck + - `["CMD", args...]` exec arguments directly + - `["CMD-SHELL", command]` run command with system's default shell + type: "array" + items: + type: "string" + Interval: + description: | + The time to wait between checks in nanoseconds. It should be 0 or at + least 1000000 (1 ms). 0 means inherit. + type: "integer" + format: "int64" + Timeout: + description: | + The time to wait before considering the check to have hung. It should + be 0 or at least 1000000 (1 ms). 0 means inherit. + type: "integer" + format: "int64" + Retries: + description: | + The number of consecutive failures needed to consider a container as + unhealthy. 0 means inherit. + type: "integer" + StartPeriod: + description: | + Start period for the container to initialize before starting + health-retries countdown in nanoseconds. It should be 0 or at least + 1000000 (1 ms). 0 means inherit. + type: "integer" + format: "int64" + StartInterval: + description: | + The time to wait between checks in nanoseconds during the start period. + It should be 0 or at least 1000000 (1 ms). 0 means inherit. + type: "integer" + format: "int64" + + Health: + description: | + Health stores information about the container's healthcheck results. + type: "object" + x-nullable: true + properties: + Status: + description: | + Status is one of `none`, `starting`, `healthy` or `unhealthy` + + - "none" Indicates there is no healthcheck + - "starting" Starting indicates that the container is not yet ready + - "healthy" Healthy indicates that the container is running correctly + - "unhealthy" Unhealthy indicates that the container has a problem + type: "string" + enum: + - "none" + - "starting" + - "healthy" + - "unhealthy" + example: "healthy" + FailingStreak: + description: "FailingStreak is the number of consecutive failures" + type: "integer" + example: 0 + Log: + type: "array" + description: | + Log contains the last few results (oldest first) + items: + $ref: "#/definitions/HealthcheckResult" + + HealthcheckResult: + description: | + HealthcheckResult stores information about a single run of a healthcheck probe + type: "object" + x-nullable: true + properties: + Start: + description: | + Date and time at which this check started in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. + type: "string" + format: "date-time" + example: "2020-01-04T10:44:24.496525531Z" + End: + description: | + Date and time at which this check ended in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. + type: "string" + format: "dateTime" + example: "2020-01-04T10:45:21.364524523Z" + ExitCode: + description: | + ExitCode meanings: + + - `0` healthy + - `1` unhealthy + - `2` reserved (considered unhealthy) + - other values: error running probe + type: "integer" + example: 0 + Output: + description: "Output from last check" + type: "string" + + HostConfig: + description: "Container configuration that depends on the host we are running on" + allOf: + - $ref: "#/definitions/Resources" + - type: "object" + properties: + # Applicable to all platforms + Binds: + type: "array" + description: | + A list of volume bindings for this container. Each volume binding + is a string in one of these forms: + + - `host-src:container-dest[:options]` to bind-mount a host path + into the container. Both `host-src`, and `container-dest` must + be an _absolute_ path. + - `volume-name:container-dest[:options]` to bind-mount a volume + managed by a volume driver into the container. `container-dest` + must be an _absolute_ path. + + `options` is an optional, comma-delimited list of: + + - `nocopy` disables automatic copying of data from the container + path to the volume. The `nocopy` flag only applies to named volumes. + - `[ro|rw]` mounts a volume read-only or read-write, respectively. + If omitted or set to `rw`, volumes are mounted read-write. + - `[z|Z]` applies SELinux labels to allow or deny multiple containers + to read and write to the same volume. + - `z`: a _shared_ content label is applied to the content. This + label indicates that multiple containers can share the volume + content, for both reading and writing. + - `Z`: a _private unshared_ label is applied to the content. + This label indicates that only the current container can use + a private volume. Labeling systems such as SELinux require + proper labels to be placed on volume content that is mounted + into a container. Without a label, the security system can + prevent a container's processes from using the content. By + default, the labels set by the host operating system are not + modified. + - `[[r]shared|[r]slave|[r]private]` specifies mount + [propagation behavior](https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt). + This only applies to bind-mounted volumes, not internal volumes + or named volumes. Mount propagation requires the source mount + point (the location where the source directory is mounted in the + host operating system) to have the correct propagation properties. + For shared volumes, the source mount point must be set to `shared`. + For slave volumes, the mount must be set to either `shared` or + `slave`. + items: + type: "string" + ContainerIDFile: + type: "string" + description: "Path to a file where the container ID is written" + example: "" + LogConfig: + type: "object" + description: "The logging configuration for this container" + properties: + Type: + description: |- + Name of the logging driver used for the container or "none" + if logging is disabled. + type: "string" + enum: + - "local" + - "json-file" + - "syslog" + - "journald" + - "gelf" + - "fluentd" + - "awslogs" + - "splunk" + - "etwlogs" + - "none" + Config: + description: |- + Driver-specific configuration options for the logging driver. + type: "object" + additionalProperties: + type: "string" + example: + "max-file": "5" + "max-size": "10m" + NetworkMode: + type: "string" + description: | + Network mode to use for this container. Supported standard values + are: `bridge`, `host`, `none`, and `container:`. Any + other value is taken as a custom network's name to which this + container should connect to. + PortBindings: + $ref: "#/definitions/PortMap" + RestartPolicy: + $ref: "#/definitions/RestartPolicy" + AutoRemove: + type: "boolean" + description: | + Automatically remove the container when the container's process + exits. This has no effect if `RestartPolicy` is set. + VolumeDriver: + type: "string" + description: "Driver that this container uses to mount volumes." + VolumesFrom: + type: "array" + description: | + A list of volumes to inherit from another container, specified in + the form `[:]`. + items: + type: "string" + Mounts: + description: | + Specification for mounts to be added to the container. + type: "array" + items: + $ref: "#/definitions/Mount" + ConsoleSize: + type: "array" + description: | + Initial console size, as an `[height, width]` array. + x-nullable: true + minItems: 2 + maxItems: 2 + items: + type: "integer" + minimum: 0 + example: [80, 64] + Annotations: + type: "object" + description: | + Arbitrary non-identifying metadata attached to container and + provided to the runtime when the container is started. + additionalProperties: + type: "string" + + # Applicable to UNIX platforms + CapAdd: + type: "array" + description: | + A list of kernel capabilities to add to the container. Conflicts + with option 'Capabilities'. + items: + type: "string" + CapDrop: + type: "array" + description: | + A list of kernel capabilities to drop from the container. Conflicts + with option 'Capabilities'. + items: + type: "string" + CgroupnsMode: + type: "string" + enum: + - "private" + - "host" + description: | + cgroup namespace mode for the container. Possible values are: + + - `"private"`: the container runs in its own private cgroup namespace + - `"host"`: use the host system's cgroup namespace + + If not specified, the daemon default is used, which can either be `"private"` + or `"host"`, depending on daemon version, kernel support and configuration. + Dns: + type: "array" + description: "A list of DNS servers for the container to use." + items: + type: "string" + DnsOptions: + type: "array" + description: "A list of DNS options." + items: + type: "string" + DnsSearch: + type: "array" + description: "A list of DNS search domains." + items: + type: "string" + ExtraHosts: + type: "array" + description: | + A list of hostnames/IP mappings to add to the container's `/etc/hosts` + file. Specified in the form `["hostname:IP"]`. + items: + type: "string" + GroupAdd: + type: "array" + description: | + A list of additional groups that the container process will run as. + items: + type: "string" + IpcMode: + type: "string" + description: | + IPC sharing mode for the container. Possible values are: + + - `"none"`: own private IPC namespace, with /dev/shm not mounted + - `"private"`: own private IPC namespace + - `"shareable"`: own private IPC namespace, with a possibility to share it with other containers + - `"container:"`: join another (shareable) container's IPC namespace + - `"host"`: use the host system's IPC namespace + + If not specified, daemon default is used, which can either be `"private"` + or `"shareable"`, depending on daemon version and configuration. + Cgroup: + type: "string" + description: "Cgroup to use for the container." + Links: + type: "array" + description: | + A list of links for the container in the form `container_name:alias`. + items: + type: "string" + OomScoreAdj: + type: "integer" + description: | + An integer value containing the score given to the container in + order to tune OOM killer preferences. + example: 500 + PidMode: + type: "string" + description: | + Set the PID (Process) Namespace mode for the container. It can be + either: + + - `"container:"`: joins another container's PID namespace + - `"host"`: use the host's PID namespace inside the container + Privileged: + type: "boolean" + description: |- + Gives the container full access to the host. + PublishAllPorts: + type: "boolean" + description: | + Allocates an ephemeral host port for all of a container's + exposed ports. + + Ports are de-allocated when the container stops and allocated when + the container starts. The allocated port might be changed when + restarting the container. + + The port is selected from the ephemeral port range that depends on + the kernel. For example, on Linux the range is defined by + `/proc/sys/net/ipv4/ip_local_port_range`. + ReadonlyRootfs: + type: "boolean" + description: "Mount the container's root filesystem as read only." + SecurityOpt: + type: "array" + description: | + A list of string values to customize labels for MLS systems, such + as SELinux. + items: + type: "string" + StorageOpt: + type: "object" + description: | + Storage driver options for this container, in the form `{"size": "120G"}`. + additionalProperties: + type: "string" + Tmpfs: + type: "object" + description: | + A map of container directories which should be replaced by tmpfs + mounts, and their corresponding mount options. For example: + + ``` + { "/run": "rw,noexec,nosuid,size=65536k" } + ``` + additionalProperties: + type: "string" + UTSMode: + type: "string" + description: "UTS namespace to use for the container." + UsernsMode: + type: "string" + description: | + Sets the usernamespace mode for the container when usernamespace + remapping option is enabled. + ShmSize: + type: "integer" + format: "int64" + description: | + Size of `/dev/shm` in bytes. If omitted, the system uses 64MB. + minimum: 0 + Sysctls: + type: "object" + x-nullable: true + description: |- + A list of kernel parameters (sysctls) to set in the container. + + This field is omitted if not set. + additionalProperties: + type: "string" + example: + "net.ipv4.ip_forward": "1" + Runtime: + type: "string" + x-nullable: true + description: |- + Runtime to use with this container. + # Applicable to Windows + Isolation: + type: "string" + description: | + Isolation technology of the container. (Windows only) + enum: + - "default" + - "process" + - "hyperv" + - "" + MaskedPaths: + type: "array" + description: | + The list of paths to be masked inside the container (this overrides + the default set of paths). + items: + type: "string" + example: + - "/proc/asound" + - "/proc/acpi" + - "/proc/kcore" + - "/proc/keys" + - "/proc/latency_stats" + - "/proc/timer_list" + - "/proc/timer_stats" + - "/proc/sched_debug" + - "/proc/scsi" + - "/sys/firmware" + - "/sys/devices/virtual/powercap" + ReadonlyPaths: + type: "array" + description: | + The list of paths to be set as read-only inside the container + (this overrides the default set of paths). + items: + type: "string" + example: + - "/proc/bus" + - "/proc/fs" + - "/proc/irq" + - "/proc/sys" + - "/proc/sysrq-trigger" + + ContainerConfig: + description: | + Configuration for a container that is portable between hosts. + type: "object" + properties: + Hostname: + description: | + The hostname to use for the container, as a valid RFC 1123 hostname. + type: "string" + example: "439f4e91bd1d" + Domainname: + description: | + The domain name to use for the container. + type: "string" + User: + description: |- + Commands run as this user inside the container. If omitted, commands + run as the user specified in the image the container was started from. + + Can be either user-name or UID, and optional group-name or GID, + separated by a colon (`[<:group-name|GID>]`). + type: "string" + example: "123:456" + AttachStdin: + description: "Whether to attach to `stdin`." + type: "boolean" + default: false + AttachStdout: + description: "Whether to attach to `stdout`." + type: "boolean" + default: true + AttachStderr: + description: "Whether to attach to `stderr`." + type: "boolean" + default: true + ExposedPorts: + description: | + An object mapping ports to an empty object in the form: + + `{"/": {}}` + type: "object" + x-nullable: true + additionalProperties: + type: "object" + enum: + - {} + default: {} + example: { + "80/tcp": {}, + "443/tcp": {} + } + Tty: + description: | + Attach standard streams to a TTY, including `stdin` if it is not closed. + type: "boolean" + default: false + OpenStdin: + description: "Open `stdin`" + type: "boolean" + default: false + StdinOnce: + description: "Close `stdin` after one attached client disconnects" + type: "boolean" + default: false + Env: + description: | + A list of environment variables to set inside the container in the + form `["VAR=value", ...]`. A variable without `=` is removed from the + environment, rather than to have an empty value. + type: "array" + items: + type: "string" + example: + - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + Cmd: + description: | + Command to run specified as a string or an array of strings. + type: "array" + items: + type: "string" + example: ["/bin/sh"] + Healthcheck: + $ref: "#/definitions/HealthConfig" + ArgsEscaped: + description: "Command is already escaped (Windows only)" + type: "boolean" + default: false + example: false + x-nullable: true + Image: + description: | + The name (or reference) of the image to use when creating the container, + or which was used when the container was created. + type: "string" + example: "example-image:1.0" + Volumes: + description: | + An object mapping mount point paths inside the container to empty + objects. + type: "object" + additionalProperties: + type: "object" + enum: + - {} + default: {} + WorkingDir: + description: "The working directory for commands to run in." + type: "string" + example: "/public/" + Entrypoint: + description: | + The entry point for the container as a string or an array of strings. + + If the array consists of exactly one empty string (`[""]`) then the + entry point is reset to system default (i.e., the entry point used by + docker when there is no `ENTRYPOINT` instruction in the `Dockerfile`). + type: "array" + items: + type: "string" + example: [] + NetworkDisabled: + description: "Disable networking for the container." + type: "boolean" + x-nullable: true + MacAddress: + description: | + MAC address of the container. + + Deprecated: this field is deprecated in API v1.44 and up. Use EndpointSettings.MacAddress instead. + type: "string" + x-nullable: true + OnBuild: + description: | + `ONBUILD` metadata that were defined in the image's `Dockerfile`. + type: "array" + x-nullable: true + items: + type: "string" + example: [] + Labels: + description: "User-defined key/value metadata." + type: "object" + additionalProperties: + type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" + StopSignal: + description: | + Signal to stop a container as a string or unsigned integer. + type: "string" + example: "SIGTERM" + x-nullable: true + StopTimeout: + description: "Timeout to stop a container in seconds." + type: "integer" + default: 10 + x-nullable: true + Shell: + description: | + Shell for when `RUN`, `CMD`, and `ENTRYPOINT` uses a shell. + type: "array" + x-nullable: true + items: + type: "string" + example: ["/bin/sh", "-c"] + + ImageConfig: + description: | + Configuration of the image. These fields are used as defaults + when starting a container from the image. + type: "object" + properties: + Hostname: + description: | + The hostname to use for the container, as a valid RFC 1123 hostname. + +


+ + > **Deprecated**: this field is not part of the image specification and is + > always empty. It must not be used, and will be removed in API v1.48. + type: "string" + example: "" + Domainname: + description: | + The domain name to use for the container. + +


+ + > **Deprecated**: this field is not part of the image specification and is + > always empty. It must not be used, and will be removed in API v1.48. + type: "string" + example: "" + User: + description: "The user that commands are run as inside the container." + type: "string" + example: "web:web" + AttachStdin: + description: | + Whether to attach to `stdin`. + +


+ + > **Deprecated**: this field is not part of the image specification and is + > always false. It must not be used, and will be removed in API v1.48. + type: "boolean" + default: false + example: false + AttachStdout: + description: | + Whether to attach to `stdout`. + +


+ + > **Deprecated**: this field is not part of the image specification and is + > always false. It must not be used, and will be removed in API v1.48. + type: "boolean" + default: false + example: false + AttachStderr: + description: | + Whether to attach to `stderr`. + +


+ + > **Deprecated**: this field is not part of the image specification and is + > always false. It must not be used, and will be removed in API v1.48. + type: "boolean" + default: false + example: false + ExposedPorts: + description: | + An object mapping ports to an empty object in the form: + + `{"/": {}}` + type: "object" + x-nullable: true + additionalProperties: + type: "object" + enum: + - {} + default: {} + example: { + "80/tcp": {}, + "443/tcp": {} + } + Tty: + description: | + Attach standard streams to a TTY, including `stdin` if it is not closed. + +


+ + > **Deprecated**: this field is not part of the image specification and is + > always false. It must not be used, and will be removed in API v1.48. + type: "boolean" + default: false + example: false + OpenStdin: + description: | + Open `stdin` + +


+ + > **Deprecated**: this field is not part of the image specification and is + > always false. It must not be used, and will be removed in API v1.48. + type: "boolean" + default: false + example: false + StdinOnce: + description: | + Close `stdin` after one attached client disconnects. + +


+ + > **Deprecated**: this field is not part of the image specification and is + > always false. It must not be used, and will be removed in API v1.48. + type: "boolean" + default: false + example: false + Env: + description: | + A list of environment variables to set inside the container in the + form `["VAR=value", ...]`. A variable without `=` is removed from the + environment, rather than to have an empty value. + type: "array" + items: + type: "string" + example: + - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + Cmd: + description: | + Command to run specified as a string or an array of strings. + type: "array" + items: + type: "string" + example: ["/bin/sh"] + Healthcheck: + $ref: "#/definitions/HealthConfig" + ArgsEscaped: + description: "Command is already escaped (Windows only)" + type: "boolean" + default: false + example: false + x-nullable: true + Image: + description: | + The name (or reference) of the image to use when creating the container, + or which was used when the container was created. + +


+ + > **Deprecated**: this field is not part of the image specification and is + > always empty. It must not be used, and will be removed in API v1.48. + type: "string" + default: "" + example: "" + Volumes: + description: | + An object mapping mount point paths inside the container to empty + objects. + type: "object" + additionalProperties: + type: "object" + enum: + - {} + default: {} + example: + "/app/data": {} + "/app/config": {} + WorkingDir: + description: "The working directory for commands to run in." + type: "string" + example: "/public/" + Entrypoint: + description: | + The entry point for the container as a string or an array of strings. + + If the array consists of exactly one empty string (`[""]`) then the + entry point is reset to system default (i.e., the entry point used by + docker when there is no `ENTRYPOINT` instruction in the `Dockerfile`). + type: "array" + items: + type: "string" + example: [] + NetworkDisabled: + description: | + Disable networking for the container. + +


+ + > **Deprecated**: this field is not part of the image specification and is + > always omitted. It must not be used, and will be removed in API v1.48. + type: "boolean" + default: false + example: false + x-nullable: true + MacAddress: + description: | + MAC address of the container. + +


+ + > **Deprecated**: this field is not part of the image specification and is + > always omitted. It must not be used, and will be removed in API v1.48. + type: "string" + default: "" + example: "" + x-nullable: true + OnBuild: + description: | + `ONBUILD` metadata that were defined in the image's `Dockerfile`. + type: "array" + x-nullable: true + items: + type: "string" + example: [] + Labels: + description: "User-defined key/value metadata." + type: "object" + additionalProperties: + type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" + StopSignal: + description: | + Signal to stop a container as a string or unsigned integer. + type: "string" + example: "SIGTERM" + x-nullable: true + StopTimeout: + description: | + Timeout to stop a container in seconds. + +


+ + > **Deprecated**: this field is not part of the image specification and is + > always omitted. It must not be used, and will be removed in API v1.48. + type: "integer" + default: 10 + x-nullable: true + Shell: + description: | + Shell for when `RUN`, `CMD`, and `ENTRYPOINT` uses a shell. + type: "array" + x-nullable: true + items: + type: "string" + example: ["/bin/sh", "-c"] + # FIXME(thaJeztah): temporarily using a full example to remove some "omitempty" fields. Remove once the fields are removed. + example: + "Hostname": "" + "Domainname": "" + "User": "web:web" + "AttachStdin": false + "AttachStdout": false + "AttachStderr": false + "ExposedPorts": { + "80/tcp": {}, + "443/tcp": {} + } + "Tty": false + "OpenStdin": false + "StdinOnce": false + "Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"] + "Cmd": ["/bin/sh"] + "Healthcheck": { + "Test": ["string"], + "Interval": 0, + "Timeout": 0, + "Retries": 0, + "StartPeriod": 0, + "StartInterval": 0 + } + "ArgsEscaped": true + "Image": "" + "Volumes": { + "/app/data": {}, + "/app/config": {} + } + "WorkingDir": "/public/" + "Entrypoint": [] + "OnBuild": [] + "Labels": { + "com.example.some-label": "some-value", + "com.example.some-other-label": "some-other-value" + } + "StopSignal": "SIGTERM" + "Shell": ["/bin/sh", "-c"] + + NetworkingConfig: + description: | + NetworkingConfig represents the container's networking configuration for + each of its interfaces. + It is used for the networking configs specified in the `docker create` + and `docker network connect` commands. + type: "object" + properties: + EndpointsConfig: + description: | + A mapping of network name to endpoint configuration for that network. + The endpoint configuration can be left empty to connect to that + network with no particular endpoint configuration. + type: "object" + additionalProperties: + $ref: "#/definitions/EndpointSettings" + example: + # putting an example here, instead of using the example values from + # /definitions/EndpointSettings, because EndpointSettings contains + # operational data returned when inspecting a container that we don't + # accept here. + EndpointsConfig: + isolated_nw: + IPAMConfig: + IPv4Address: "172.20.30.33" + IPv6Address: "2001:db8:abcd::3033" + LinkLocalIPs: + - "169.254.34.68" + - "fe80::3468" + MacAddress: "02:42:ac:12:05:02" + Links: + - "container_1" + - "container_2" + Aliases: + - "server_x" + - "server_y" + database_nw: {} + + NetworkSettings: + description: "NetworkSettings exposes the network settings in the API" + type: "object" + properties: + Bridge: + description: | + Name of the default bridge interface when dockerd's --bridge flag is set. + type: "string" + example: "docker0" + SandboxID: + description: SandboxID uniquely represents a container's network stack. + type: "string" + example: "9d12daf2c33f5959c8bf90aa513e4f65b561738661003029ec84830cd503a0c3" + HairpinMode: + description: | + Indicates if hairpin NAT should be enabled on the virtual interface. + + Deprecated: This field is never set and will be removed in a future release. + type: "boolean" + example: false + LinkLocalIPv6Address: + description: | + IPv6 unicast address using the link-local prefix. + + Deprecated: This field is never set and will be removed in a future release. + type: "string" + example: "" + LinkLocalIPv6PrefixLen: + description: | + Prefix length of the IPv6 unicast address. + + Deprecated: This field is never set and will be removed in a future release. + type: "integer" + example: "" + Ports: + $ref: "#/definitions/PortMap" + SandboxKey: + description: SandboxKey is the full path of the netns handle + type: "string" + example: "/var/run/docker/netns/8ab54b426c38" + + SecondaryIPAddresses: + description: "Deprecated: This field is never set and will be removed in a future release." + type: "array" + items: + $ref: "#/definitions/Address" + x-nullable: true + + SecondaryIPv6Addresses: + description: "Deprecated: This field is never set and will be removed in a future release." + type: "array" + items: + $ref: "#/definitions/Address" + x-nullable: true + + # TODO properties below are part of DefaultNetworkSettings, which is + # marked as deprecated since Docker 1.9 and to be removed in Docker v17.12 + EndpointID: + description: | + EndpointID uniquely represents a service endpoint in a Sandbox. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "string" + example: "b88f5b905aabf2893f3cbc4ee42d1ea7980bbc0a92e2c8922b1e1795298afb0b" + Gateway: + description: | + Gateway address for the default "bridge" network. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "string" + example: "172.17.0.1" + GlobalIPv6Address: + description: | + Global IPv6 address for the default "bridge" network. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "string" + example: "2001:db8::5689" + GlobalIPv6PrefixLen: + description: | + Mask length of the global IPv6 address. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "integer" + example: 64 + IPAddress: + description: | + IPv4 address for the default "bridge" network. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "string" + example: "172.17.0.4" + IPPrefixLen: + description: | + Mask length of the IPv4 address. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "integer" + example: 16 + IPv6Gateway: + description: | + IPv6 gateway address for this network. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "string" + example: "2001:db8:2::100" + MacAddress: + description: | + MAC address for the container on the default "bridge" network. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "string" + example: "02:42:ac:11:00:04" + Networks: + description: | + Information about all networks that the container is connected to. + type: "object" + additionalProperties: + $ref: "#/definitions/EndpointSettings" + + Address: + description: Address represents an IPv4 or IPv6 IP address. + type: "object" + properties: + Addr: + description: IP address. + type: "string" + PrefixLen: + description: Mask length of the IP address. + type: "integer" + + PortMap: + description: | + PortMap describes the mapping of container ports to host ports, using the + container's port-number and protocol as key in the format `/`, + for example, `80/udp`. + + If a container's port is mapped for multiple protocols, separate entries + are added to the mapping table. + type: "object" + additionalProperties: + type: "array" + x-nullable: true + items: + $ref: "#/definitions/PortBinding" + example: + "443/tcp": + - HostIp: "127.0.0.1" + HostPort: "4443" + "80/tcp": + - HostIp: "0.0.0.0" + HostPort: "80" + - HostIp: "0.0.0.0" + HostPort: "8080" + "80/udp": + - HostIp: "0.0.0.0" + HostPort: "80" + "53/udp": + - HostIp: "0.0.0.0" + HostPort: "53" + "2377/tcp": null + + PortBinding: + description: | + PortBinding represents a binding between a host IP address and a host + port. + type: "object" + properties: + HostIp: + description: "Host IP address that the container's port is mapped to." + type: "string" + example: "127.0.0.1" + HostPort: + description: "Host port number that the container's port is mapped to." + type: "string" + example: "4443" + + DriverData: + description: | + Information about the storage driver used to store the container's and + image's filesystem. + type: "object" + required: [Name, Data] + properties: + Name: + description: "Name of the storage driver." + type: "string" + x-nullable: false + example: "overlay2" + Data: + description: | + Low-level storage metadata, provided as key/value pairs. + + This information is driver-specific, and depends on the storage-driver + in use, and should be used for informational purposes only. + type: "object" + x-nullable: false + additionalProperties: + type: "string" + example: { + "MergedDir": "/var/lib/docker/overlay2/ef749362d13333e65fc95c572eb525abbe0052e16e086cb64bc3b98ae9aa6d74/merged", + "UpperDir": "/var/lib/docker/overlay2/ef749362d13333e65fc95c572eb525abbe0052e16e086cb64bc3b98ae9aa6d74/diff", + "WorkDir": "/var/lib/docker/overlay2/ef749362d13333e65fc95c572eb525abbe0052e16e086cb64bc3b98ae9aa6d74/work" + } + + FilesystemChange: + description: | + Change in the container's filesystem. + type: "object" + required: [Path, Kind] + properties: + Path: + description: | + Path to file or directory that has changed. + type: "string" + x-nullable: false + Kind: + $ref: "#/definitions/ChangeType" + + ChangeType: + description: | + Kind of change + + Can be one of: + + - `0`: Modified ("C") + - `1`: Added ("A") + - `2`: Deleted ("D") + type: "integer" + format: "uint8" + enum: [0, 1, 2] + x-nullable: false + + ImageInspect: + description: | + Information about an image in the local image cache. + type: "object" + properties: + Id: + description: | + ID is the content-addressable ID of an image. + + This identifier is a content-addressable digest calculated from the + image's configuration (which includes the digests of layers used by + the image). + + Note that this digest differs from the `RepoDigests` below, which + holds digests of image manifests that reference the image. + type: "string" + x-nullable: false + example: "sha256:ec3f0931a6e6b6855d76b2d7b0be30e81860baccd891b2e243280bf1cd8ad710" + Descriptor: + description: | + Descriptor is an OCI descriptor of the image target. + In case of a multi-platform image, this descriptor points to the OCI index + or a manifest list. + + This field is only present if the daemon provides a multi-platform image store. + + WARNING: This is experimental and may change at any time without any backward + compatibility. + x-nullable: true + $ref: "#/definitions/OCIDescriptor" + Manifests: + description: | + Manifests is a list of image manifests available in this image. It + provides a more detailed view of the platform-specific image manifests or + other image-attached data like build attestations. + + Only available if the daemon provides a multi-platform image store + and the `manifests` option is set in the inspect request. + + WARNING: This is experimental and may change at any time without any backward + compatibility. + type: "array" + x-nullable: true + items: + $ref: "#/definitions/ImageManifestSummary" + RepoTags: + description: | + List of image names/tags in the local image cache that reference this + image. + + Multiple image tags can refer to the same image, and this list may be + empty if no tags reference the image, in which case the image is + "untagged", in which case it can still be referenced by its ID. + type: "array" + items: + type: "string" + example: + - "example:1.0" + - "example:latest" + - "example:stable" + - "internal.registry.example.com:5000/example:1.0" + RepoDigests: + description: | + List of content-addressable digests of locally available image manifests + that the image is referenced from. Multiple manifests can refer to the + same image. + + These digests are usually only available if the image was either pulled + from a registry, or if the image was pushed to a registry, which is when + the manifest is generated and its digest calculated. + type: "array" + items: + type: "string" + example: + - "example@sha256:afcc7f1ac1b49db317a7196c902e61c6c3c4607d63599ee1a82d702d249a0ccb" + - "internal.registry.example.com:5000/example@sha256:b69959407d21e8a062e0416bf13405bb2b71ed7a84dde4158ebafacfa06f5578" + Parent: + description: | + ID of the parent image. + + Depending on how the image was created, this field may be empty and + is only set for images that were built/created locally. This field + is empty if the image was pulled from an image registry. + type: "string" + x-nullable: false + example: "" + Comment: + description: | + Optional message that was set when committing or importing the image. + type: "string" + x-nullable: false + example: "" + Created: + description: | + Date and time at which the image was created, formatted in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. + + This information is only available if present in the image, + and omitted otherwise. + type: "string" + format: "dateTime" + x-nullable: true + example: "2022-02-04T21:20:12.497794809Z" + DockerVersion: + description: | + The version of Docker that was used to build the image. + + Depending on how the image was created, this field may be empty. + type: "string" + x-nullable: false + example: "27.0.1" + Author: + description: | + Name of the author that was specified when committing the image, or as + specified through MAINTAINER (deprecated) in the Dockerfile. + type: "string" + x-nullable: false + example: "" + Config: + $ref: "#/definitions/ImageConfig" + Architecture: + description: | + Hardware CPU architecture that the image runs on. + type: "string" + x-nullable: false + example: "arm" + Variant: + description: | + CPU architecture variant (presently ARM-only). + type: "string" + x-nullable: true + example: "v7" + Os: + description: | + Operating System the image is built to run on. + type: "string" + x-nullable: false + example: "linux" + OsVersion: + description: | + Operating System version the image is built to run on (especially + for Windows). + type: "string" + example: "" + x-nullable: true + Size: + description: | + Total size of the image including all layers it is composed of. + type: "integer" + format: "int64" + x-nullable: false + example: 1239828 + VirtualSize: + description: | + Total size of the image including all layers it is composed of. + + Deprecated: this field is omitted in API v1.44, but kept for backward compatibility. Use Size instead. + type: "integer" + format: "int64" + example: 1239828 + GraphDriver: + $ref: "#/definitions/DriverData" + RootFS: + description: | + Information about the image's RootFS, including the layer IDs. + type: "object" + required: [Type] + properties: + Type: + type: "string" + x-nullable: false + example: "layers" + Layers: + type: "array" + items: + type: "string" + example: + - "sha256:1834950e52ce4d5a88a1bbd131c537f4d0e56d10ff0dd69e66be3b7dfa9df7e6" + - "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" + Metadata: + description: | + Additional metadata of the image in the local cache. This information + is local to the daemon, and not part of the image itself. + type: "object" + properties: + LastTagTime: + description: | + Date and time at which the image was last tagged in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. + + This information is only available if the image was tagged locally, + and omitted otherwise. + type: "string" + format: "dateTime" + example: "2022-02-28T14:40:02.623929178Z" + x-nullable: true + + ImageSummary: + type: "object" + x-go-name: "Summary" + required: + - Id + - ParentId + - RepoTags + - RepoDigests + - Created + - Size + - SharedSize + - Labels + - Containers + properties: + Id: + description: | + ID is the content-addressable ID of an image. + + This identifier is a content-addressable digest calculated from the + image's configuration (which includes the digests of layers used by + the image). + + Note that this digest differs from the `RepoDigests` below, which + holds digests of image manifests that reference the image. + type: "string" + x-nullable: false + example: "sha256:ec3f0931a6e6b6855d76b2d7b0be30e81860baccd891b2e243280bf1cd8ad710" + ParentId: + description: | + ID of the parent image. + + Depending on how the image was created, this field may be empty and + is only set for images that were built/created locally. This field + is empty if the image was pulled from an image registry. + type: "string" + x-nullable: false + example: "" + RepoTags: + description: | + List of image names/tags in the local image cache that reference this + image. + + Multiple image tags can refer to the same image, and this list may be + empty if no tags reference the image, in which case the image is + "untagged", in which case it can still be referenced by its ID. + type: "array" + x-nullable: false + items: + type: "string" + example: + - "example:1.0" + - "example:latest" + - "example:stable" + - "internal.registry.example.com:5000/example:1.0" + RepoDigests: + description: | + List of content-addressable digests of locally available image manifests + that the image is referenced from. Multiple manifests can refer to the + same image. + + These digests are usually only available if the image was either pulled + from a registry, or if the image was pushed to a registry, which is when + the manifest is generated and its digest calculated. + type: "array" + x-nullable: false + items: + type: "string" + example: + - "example@sha256:afcc7f1ac1b49db317a7196c902e61c6c3c4607d63599ee1a82d702d249a0ccb" + - "internal.registry.example.com:5000/example@sha256:b69959407d21e8a062e0416bf13405bb2b71ed7a84dde4158ebafacfa06f5578" + Created: + description: | + Date and time at which the image was created as a Unix timestamp + (number of seconds since EPOCH). + type: "integer" + x-nullable: false + example: "1644009612" + Size: + description: | + Total size of the image including all layers it is composed of. + type: "integer" + format: "int64" + x-nullable: false + example: 172064416 + SharedSize: + description: | + Total size of image layers that are shared between this image and other + images. + + This size is not calculated by default. `-1` indicates that the value + has not been set / calculated. + type: "integer" + format: "int64" + x-nullable: false + example: 1239828 + VirtualSize: + description: |- + Total size of the image including all layers it is composed of. + + Deprecated: this field is omitted in API v1.44, but kept for backward compatibility. Use Size instead. + type: "integer" + format: "int64" + example: 172064416 + Labels: + description: "User-defined key/value metadata." + type: "object" + x-nullable: false + additionalProperties: + type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" + Containers: + description: | + Number of containers using this image. Includes both stopped and running + containers. + + This size is not calculated by default, and depends on which API endpoint + is used. `-1` indicates that the value has not been set / calculated. + x-nullable: false + type: "integer" + example: 2 + Manifests: + description: | + Manifests is a list of manifests available in this image. + It provides a more detailed view of the platform-specific image manifests + or other image-attached data like build attestations. + + WARNING: This is experimental and may change at any time without any backward + compatibility. + type: "array" + x-nullable: false + x-omitempty: true + items: + $ref: "#/definitions/ImageManifestSummary" + Descriptor: + description: | + Descriptor is an OCI descriptor of the image target. + In case of a multi-platform image, this descriptor points to the OCI index + or a manifest list. + + This field is only present if the daemon provides a multi-platform image store. + + WARNING: This is experimental and may change at any time without any backward + compatibility. + x-nullable: true + $ref: "#/definitions/OCIDescriptor" + + AuthConfig: + type: "object" + properties: + username: + type: "string" + password: + type: "string" + email: + type: "string" + serveraddress: + type: "string" + example: + username: "hannibal" + password: "xxxx" + serveraddress: "https://index.docker.io/v1/" + + ProcessConfig: + type: "object" + properties: + privileged: + type: "boolean" + user: + type: "string" + tty: + type: "boolean" + entrypoint: + type: "string" + arguments: + type: "array" + items: + type: "string" + + Volume: + type: "object" + required: [Name, Driver, Mountpoint, Labels, Scope, Options] + properties: + Name: + type: "string" + description: "Name of the volume." + x-nullable: false + example: "tardis" + Driver: + type: "string" + description: "Name of the volume driver used by the volume." + x-nullable: false + example: "custom" + Mountpoint: + type: "string" + description: "Mount path of the volume on the host." + x-nullable: false + example: "/var/lib/docker/volumes/tardis" + CreatedAt: + type: "string" + format: "dateTime" + description: "Date/Time the volume was created." + example: "2016-06-07T20:31:11.853781916Z" + Status: + type: "object" + description: | + Low-level details about the volume, provided by the volume driver. + Details are returned as a map with key/value pairs: + `{"key":"value","key2":"value2"}`. + + The `Status` field is optional, and is omitted if the volume driver + does not support this feature. + additionalProperties: + type: "object" + example: + hello: "world" + Labels: + type: "object" + description: "User-defined key/value metadata." + x-nullable: false + additionalProperties: + type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" + Scope: + type: "string" + description: | + The level at which the volume exists. Either `global` for cluster-wide, + or `local` for machine level. + default: "local" + x-nullable: false + enum: ["local", "global"] + example: "local" + ClusterVolume: + $ref: "#/definitions/ClusterVolume" + Options: + type: "object" + description: | + The driver specific options used when creating the volume. + additionalProperties: + type: "string" + example: + device: "tmpfs" + o: "size=100m,uid=1000" + type: "tmpfs" + UsageData: + type: "object" + x-nullable: true + x-go-name: "UsageData" + required: [Size, RefCount] + description: | + Usage details about the volume. This information is used by the + `GET /system/df` endpoint, and omitted in other endpoints. + properties: + Size: + type: "integer" + format: "int64" + default: -1 + description: | + Amount of disk space used by the volume (in bytes). This information + is only available for volumes created with the `"local"` volume + driver. For volumes created with other volume drivers, this field + is set to `-1` ("not available") + x-nullable: false + RefCount: + type: "integer" + format: "int64" + default: -1 + description: | + The number of containers referencing this volume. This field + is set to `-1` if the reference-count is not available. + x-nullable: false + + VolumeCreateOptions: + description: "Volume configuration" + type: "object" + title: "VolumeConfig" + x-go-name: "CreateOptions" + properties: + Name: + description: | + The new volume's name. If not specified, Docker generates a name. + type: "string" + x-nullable: false + example: "tardis" + Driver: + description: "Name of the volume driver to use." + type: "string" + default: "local" + x-nullable: false + example: "custom" + DriverOpts: + description: | + A mapping of driver options and values. These options are + passed directly to the driver and are driver specific. + type: "object" + additionalProperties: + type: "string" + example: + device: "tmpfs" + o: "size=100m,uid=1000" + type: "tmpfs" + Labels: + description: "User-defined key/value metadata." + type: "object" + additionalProperties: + type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" + ClusterVolumeSpec: + $ref: "#/definitions/ClusterVolumeSpec" + + VolumeListResponse: + type: "object" + title: "VolumeListResponse" + x-go-name: "ListResponse" + description: "Volume list response" + properties: + Volumes: + type: "array" + description: "List of volumes" + items: + $ref: "#/definitions/Volume" + Warnings: + type: "array" + description: | + Warnings that occurred when fetching the list of volumes. + items: + type: "string" + example: [] + + Network: + type: "object" + properties: + Name: + description: | + Name of the network. + type: "string" + example: "my_network" + Id: + description: | + ID that uniquely identifies a network on a single machine. + type: "string" + example: "7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99" + Created: + description: | + Date and time at which the network was created in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. + type: "string" + format: "dateTime" + example: "2016-10-19T04:33:30.360899459Z" + Scope: + description: | + The level at which the network exists (e.g. `swarm` for cluster-wide + or `local` for machine level) + type: "string" + example: "local" + Driver: + description: | + The name of the driver used to create the network (e.g. `bridge`, + `overlay`). + type: "string" + example: "overlay" + EnableIPv4: + description: | + Whether the network was created with IPv4 enabled. + type: "boolean" + example: true + EnableIPv6: + description: | + Whether the network was created with IPv6 enabled. + type: "boolean" + example: false + IPAM: + $ref: "#/definitions/IPAM" + Internal: + description: | + Whether the network is created to only allow internal networking + connectivity. + type: "boolean" + default: false + example: false + Attachable: + description: | + Whether a global / swarm scope network is manually attachable by regular + containers from workers in swarm mode. + type: "boolean" + default: false + example: false + Ingress: + description: | + Whether the network is providing the routing-mesh for the swarm cluster. + type: "boolean" + default: false + example: false + ConfigFrom: + $ref: "#/definitions/ConfigReference" + ConfigOnly: + description: | + Whether the network is a config-only network. Config-only networks are + placeholder networks for network configurations to be used by other + networks. Config-only networks cannot be used directly to run containers + or services. + type: "boolean" + default: false + Containers: + description: | + Contains endpoints attached to the network. + type: "object" + additionalProperties: + $ref: "#/definitions/NetworkContainer" + example: + 19a4d5d687db25203351ed79d478946f861258f018fe384f229f2efa4b23513c: + Name: "test" + EndpointID: "628cadb8bcb92de107b2a1e516cbffe463e321f548feb37697cce00ad694f21a" + MacAddress: "02:42:ac:13:00:02" + IPv4Address: "172.19.0.2/16" + IPv6Address: "" + Options: + description: | + Network-specific options uses when creating the network. + type: "object" + additionalProperties: + type: "string" + example: + com.docker.network.bridge.default_bridge: "true" + com.docker.network.bridge.enable_icc: "true" + com.docker.network.bridge.enable_ip_masquerade: "true" + com.docker.network.bridge.host_binding_ipv4: "0.0.0.0" + com.docker.network.bridge.name: "docker0" + com.docker.network.driver.mtu: "1500" + Labels: + description: "User-defined key/value metadata." + type: "object" + additionalProperties: + type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" + Peers: + description: | + List of peer nodes for an overlay network. This field is only present + for overlay networks, and omitted for other network types. + type: "array" + items: + $ref: "#/definitions/PeerInfo" + x-nullable: true + # TODO: Add Services (only present when "verbose" is set). + + ConfigReference: + description: | + The config-only network source to provide the configuration for + this network. + type: "object" + properties: + Network: + description: | + The name of the config-only network that provides the network's + configuration. The specified network must be an existing config-only + network. Only network names are allowed, not network IDs. + type: "string" + example: "config_only_network_01" + + IPAM: + type: "object" + properties: + Driver: + description: "Name of the IPAM driver to use." + type: "string" + default: "default" + example: "default" + Config: + description: | + List of IPAM configuration options, specified as a map: + + ``` + {"Subnet": , "IPRange": , "Gateway": , "AuxAddress": } + ``` + type: "array" + items: + $ref: "#/definitions/IPAMConfig" + Options: + description: "Driver-specific options, specified as a map." + type: "object" + additionalProperties: + type: "string" + example: + foo: "bar" + + IPAMConfig: + type: "object" + properties: + Subnet: + type: "string" + example: "172.20.0.0/16" + IPRange: + type: "string" + example: "172.20.10.0/24" + Gateway: + type: "string" + example: "172.20.10.11" + AuxiliaryAddresses: + type: "object" + additionalProperties: + type: "string" + + NetworkContainer: + type: "object" + properties: + Name: + type: "string" + example: "container_1" + EndpointID: + type: "string" + example: "628cadb8bcb92de107b2a1e516cbffe463e321f548feb37697cce00ad694f21a" + MacAddress: + type: "string" + example: "02:42:ac:13:00:02" + IPv4Address: + type: "string" + example: "172.19.0.2/16" + IPv6Address: + type: "string" + example: "" + + PeerInfo: + description: | + PeerInfo represents one peer of an overlay network. + type: "object" + properties: + Name: + description: + ID of the peer-node in the Swarm cluster. + type: "string" + example: "6869d7c1732b" + IP: + description: + IP-address of the peer-node in the Swarm cluster. + type: "string" + example: "10.133.77.91" + + NetworkCreateResponse: + description: "OK response to NetworkCreate operation" + type: "object" + title: "NetworkCreateResponse" + x-go-name: "CreateResponse" + required: [Id, Warning] + properties: + Id: + description: "The ID of the created network." + type: "string" + x-nullable: false + example: "b5c4fc71e8022147cd25de22b22173de4e3b170134117172eb595cb91b4e7e5d" + Warning: + description: "Warnings encountered when creating the container" + type: "string" + x-nullable: false + example: "" + + BuildInfo: + type: "object" + properties: + id: + type: "string" + stream: + type: "string" + error: + type: "string" + x-nullable: true + description: |- + errors encountered during the operation. + + + > **Deprecated**: This field is deprecated since API v1.4, and will be omitted in a future API version. Use the information in errorDetail instead. + errorDetail: + $ref: "#/definitions/ErrorDetail" + status: + type: "string" + progress: + type: "string" + x-nullable: true + description: |- + Progress is a pre-formatted presentation of progressDetail. + + + > **Deprecated**: This field is deprecated since API v1.8, and will be omitted in a future API version. Use the information in progressDetail instead. + progressDetail: + $ref: "#/definitions/ProgressDetail" + aux: + $ref: "#/definitions/ImageID" + + BuildCache: + type: "object" + description: | + BuildCache contains information about a build cache record. + properties: + ID: + type: "string" + description: | + Unique ID of the build cache record. + example: "ndlpt0hhvkqcdfkputsk4cq9c" + Parent: + description: | + ID of the parent build cache record. + + > **Deprecated**: This field is deprecated, and omitted if empty. + type: "string" + x-nullable: true + example: "" + Parents: + description: | + List of parent build cache record IDs. + type: "array" + items: + type: "string" + x-nullable: true + example: ["hw53o5aio51xtltp5xjp8v7fx"] + Type: + type: "string" + description: | + Cache record type. + example: "regular" + # see https://github.com/moby/buildkit/blob/fce4a32258dc9d9664f71a4831d5de10f0670677/client/diskusage.go#L75-L84 + enum: + - "internal" + - "frontend" + - "source.local" + - "source.git.checkout" + - "exec.cachemount" + - "regular" + Description: + type: "string" + description: | + Description of the build-step that produced the build cache. + example: "mount / from exec /bin/sh -c echo 'Binary::apt::APT::Keep-Downloaded-Packages \"true\";' > /etc/apt/apt.conf.d/keep-cache" + InUse: + type: "boolean" + description: | + Indicates if the build cache is in use. + example: false + Shared: + type: "boolean" + description: | + Indicates if the build cache is shared. + example: true + Size: + description: | + Amount of disk space used by the build cache (in bytes). + type: "integer" + example: 51 + CreatedAt: + description: | + Date and time at which the build cache was created in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. + type: "string" + format: "dateTime" + example: "2016-08-18T10:44:24.496525531Z" + LastUsedAt: + description: | + Date and time at which the build cache was last used in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. + type: "string" + format: "dateTime" + x-nullable: true + example: "2017-08-09T07:09:37.632105588Z" + UsageCount: + type: "integer" + example: 26 + + ImageID: + type: "object" + description: "Image ID or Digest" + properties: + ID: + type: "string" + example: + ID: "sha256:85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c" + + CreateImageInfo: + type: "object" + properties: + id: + type: "string" + error: + type: "string" + x-nullable: true + description: |- + errors encountered during the operation. + + + > **Deprecated**: This field is deprecated since API v1.4, and will be omitted in a future API version. Use the information in errorDetail instead. + errorDetail: + $ref: "#/definitions/ErrorDetail" + status: + type: "string" + progress: + type: "string" + x-nullable: true + description: |- + Progress is a pre-formatted presentation of progressDetail. + + + > **Deprecated**: This field is deprecated since API v1.8, and will be omitted in a future API version. Use the information in progressDetail instead. + progressDetail: + $ref: "#/definitions/ProgressDetail" + + PushImageInfo: + type: "object" + properties: + error: + type: "string" + x-nullable: true + description: |- + errors encountered during the operation. + + + > **Deprecated**: This field is deprecated since API v1.4, and will be omitted in a future API version. Use the information in errorDetail instead. + errorDetail: + $ref: "#/definitions/ErrorDetail" + status: + type: "string" + progress: + type: "string" + x-nullable: true + description: |- + Progress is a pre-formatted presentation of progressDetail. + + + > **Deprecated**: This field is deprecated since API v1.8, and will be omitted in a future API version. Use the information in progressDetail instead. + progressDetail: + $ref: "#/definitions/ProgressDetail" + + ErrorDetail: + type: "object" + properties: + code: + type: "integer" + message: + type: "string" + + ProgressDetail: + type: "object" + properties: + current: + type: "integer" + total: + type: "integer" + + ErrorResponse: + description: "Represents an error." + type: "object" + required: ["message"] + properties: + message: + description: "The error message." + type: "string" + x-nullable: false + example: + message: "Something went wrong." + + IDResponse: + description: "Response to an API call that returns just an Id" + type: "object" + x-go-name: "IDResponse" + required: ["Id"] + properties: + Id: + description: "The id of the newly created object." + type: "string" + x-nullable: false + + EndpointSettings: + description: "Configuration for a network endpoint." + type: "object" + properties: + # Configurations + IPAMConfig: + $ref: "#/definitions/EndpointIPAMConfig" + Links: + type: "array" + items: + type: "string" + example: + - "container_1" + - "container_2" + MacAddress: + description: | + MAC address for the endpoint on this network. The network driver might ignore this parameter. + type: "string" + example: "02:42:ac:11:00:04" + Aliases: + type: "array" + items: + type: "string" + example: + - "server_x" + - "server_y" + DriverOpts: + description: | + DriverOpts is a mapping of driver options and values. These options + are passed directly to the driver and are driver specific. + type: "object" + x-nullable: true + additionalProperties: + type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" + GwPriority: + description: | + This property determines which endpoint will provide the default + gateway for a container. The endpoint with the highest priority will + be used. If multiple endpoints have the same priority, endpoints are + lexicographically sorted based on their network name, and the one + that sorts first is picked. + type: "number" + example: + - 10 + + # Operational data + NetworkID: + description: | + Unique ID of the network. + type: "string" + example: "08754567f1f40222263eab4102e1c733ae697e8e354aa9cd6e18d7402835292a" + EndpointID: + description: | + Unique ID for the service endpoint in a Sandbox. + type: "string" + example: "b88f5b905aabf2893f3cbc4ee42d1ea7980bbc0a92e2c8922b1e1795298afb0b" + Gateway: + description: | + Gateway address for this network. + type: "string" + example: "172.17.0.1" + IPAddress: + description: | + IPv4 address. + type: "string" + example: "172.17.0.4" + IPPrefixLen: + description: | + Mask length of the IPv4 address. + type: "integer" + example: 16 + IPv6Gateway: + description: | + IPv6 gateway address. + type: "string" + example: "2001:db8:2::100" + GlobalIPv6Address: + description: | + Global IPv6 address. + type: "string" + example: "2001:db8::5689" + GlobalIPv6PrefixLen: + description: | + Mask length of the global IPv6 address. + type: "integer" + format: "int64" + example: 64 + DNSNames: + description: | + List of all DNS names an endpoint has on a specific network. This + list is based on the container name, network aliases, container short + ID, and hostname. + + These DNS names are non-fully qualified but can contain several dots. + You can get fully qualified DNS names by appending `.`. + For instance, if container name is `my.ctr` and the network is named + `testnet`, `DNSNames` will contain `my.ctr` and the FQDN will be + `my.ctr.testnet`. + type: array + items: + type: string + example: ["foobar", "server_x", "server_y", "my.ctr"] + + EndpointIPAMConfig: + description: | + EndpointIPAMConfig represents an endpoint's IPAM configuration. + type: "object" + x-nullable: true + properties: + IPv4Address: + type: "string" + example: "172.20.30.33" + IPv6Address: + type: "string" + example: "2001:db8:abcd::3033" + LinkLocalIPs: + type: "array" + items: + type: "string" + example: + - "169.254.34.68" + - "fe80::3468" + + PluginMount: + type: "object" + x-nullable: false + required: [Name, Description, Settable, Source, Destination, Type, Options] + properties: + Name: + type: "string" + x-nullable: false + example: "some-mount" + Description: + type: "string" + x-nullable: false + example: "This is a mount that's used by the plugin." + Settable: + type: "array" + items: + type: "string" + Source: + type: "string" + example: "/var/lib/docker/plugins/" + Destination: + type: "string" + x-nullable: false + example: "/mnt/state" + Type: + type: "string" + x-nullable: false + example: "bind" + Options: + type: "array" + items: + type: "string" + example: + - "rbind" + - "rw" + + PluginDevice: + type: "object" + required: [Name, Description, Settable, Path] + x-nullable: false + properties: + Name: + type: "string" + x-nullable: false + Description: + type: "string" + x-nullable: false + Settable: + type: "array" + items: + type: "string" + Path: + type: "string" + example: "/dev/fuse" + + PluginEnv: + type: "object" + x-nullable: false + required: [Name, Description, Settable, Value] + properties: + Name: + x-nullable: false + type: "string" + Description: + x-nullable: false + type: "string" + Settable: + type: "array" + items: + type: "string" + Value: + type: "string" + + PluginInterfaceType: + type: "object" + x-nullable: false + required: [Prefix, Capability, Version] + properties: + Prefix: + type: "string" + x-nullable: false + Capability: + type: "string" + x-nullable: false + Version: + type: "string" + x-nullable: false + + PluginPrivilege: + description: | + Describes a permission the user has to accept upon installing + the plugin. + type: "object" + x-go-name: "PluginPrivilege" + properties: + Name: + type: "string" + example: "network" + Description: + type: "string" + Value: + type: "array" + items: + type: "string" + example: + - "host" + + Plugin: + description: "A plugin for the Engine API" + type: "object" + required: [Settings, Enabled, Config, Name] + properties: + Id: + type: "string" + example: "5724e2c8652da337ab2eedd19fc6fc0ec908e4bd907c7421bf6a8dfc70c4c078" + Name: + type: "string" + x-nullable: false + example: "tiborvass/sample-volume-plugin" + Enabled: + description: + True if the plugin is running. False if the plugin is not running, + only installed. + type: "boolean" + x-nullable: false + example: true + Settings: + description: "Settings that can be modified by users." + type: "object" + x-nullable: false + required: [Args, Devices, Env, Mounts] + properties: + Mounts: + type: "array" + items: + $ref: "#/definitions/PluginMount" + Env: + type: "array" + items: + type: "string" + example: + - "DEBUG=0" + Args: + type: "array" + items: + type: "string" + Devices: + type: "array" + items: + $ref: "#/definitions/PluginDevice" + PluginReference: + description: "plugin remote reference used to push/pull the plugin" + type: "string" + x-nullable: false + example: "localhost:5000/tiborvass/sample-volume-plugin:latest" + Config: + description: "The config of a plugin." + type: "object" + x-nullable: false + required: + - Description + - Documentation + - Interface + - Entrypoint + - WorkDir + - Network + - Linux + - PidHost + - PropagatedMount + - IpcHost + - Mounts + - Env + - Args + properties: + DockerVersion: + description: "Docker Version used to create the plugin" + type: "string" + x-nullable: false + example: "17.06.0-ce" + Description: + type: "string" + x-nullable: false + example: "A sample volume plugin for Docker" + Documentation: + type: "string" + x-nullable: false + example: "https://docs.docker.com/engine/extend/plugins/" + Interface: + description: "The interface between Docker and the plugin" + x-nullable: false + type: "object" + required: [Types, Socket] + properties: + Types: + type: "array" + items: + $ref: "#/definitions/PluginInterfaceType" + example: + - "docker.volumedriver/1.0" + Socket: + type: "string" + x-nullable: false + example: "plugins.sock" + ProtocolScheme: + type: "string" + example: "some.protocol/v1.0" + description: "Protocol to use for clients connecting to the plugin." + enum: + - "" + - "moby.plugins.http/v1" + Entrypoint: + type: "array" + items: + type: "string" + example: + - "/usr/bin/sample-volume-plugin" + - "/data" + WorkDir: + type: "string" + x-nullable: false + example: "/bin/" + User: + type: "object" + x-nullable: false + properties: + UID: + type: "integer" + format: "uint32" + example: 1000 + GID: + type: "integer" + format: "uint32" + example: 1000 + Network: + type: "object" + x-nullable: false + required: [Type] + properties: + Type: + x-nullable: false + type: "string" + example: "host" + Linux: + type: "object" + x-nullable: false + required: [Capabilities, AllowAllDevices, Devices] + properties: + Capabilities: + type: "array" + items: + type: "string" + example: + - "CAP_SYS_ADMIN" + - "CAP_SYSLOG" + AllowAllDevices: + type: "boolean" + x-nullable: false + example: false + Devices: + type: "array" + items: + $ref: "#/definitions/PluginDevice" + PropagatedMount: + type: "string" + x-nullable: false + example: "/mnt/volumes" + IpcHost: + type: "boolean" + x-nullable: false + example: false + PidHost: + type: "boolean" + x-nullable: false + example: false + Mounts: + type: "array" + items: + $ref: "#/definitions/PluginMount" + Env: + type: "array" + items: + $ref: "#/definitions/PluginEnv" + example: + - Name: "DEBUG" + Description: "If set, prints debug messages" + Settable: null + Value: "0" + Args: + type: "object" + x-nullable: false + required: [Name, Description, Settable, Value] + properties: + Name: + x-nullable: false + type: "string" + example: "args" + Description: + x-nullable: false + type: "string" + example: "command line arguments" + Settable: + type: "array" + items: + type: "string" + Value: + type: "array" + items: + type: "string" + rootfs: + type: "object" + properties: + type: + type: "string" + example: "layers" + diff_ids: + type: "array" + items: + type: "string" + example: + - "sha256:675532206fbf3030b8458f88d6e26d4eb1577688a25efec97154c94e8b6b4887" + - "sha256:e216a057b1cb1efc11f8a268f37ef62083e70b1b38323ba252e25ac88904a7e8" + + ObjectVersion: + description: | + The version number of the object such as node, service, etc. This is needed + to avoid conflicting writes. The client must send the version number along + with the modified specification when updating these objects. + + This approach ensures safe concurrency and determinism in that the change + on the object may not be applied if the version number has changed from the + last read. In other words, if two update requests specify the same base + version, only one of the requests can succeed. As a result, two separate + update requests that happen at the same time will not unintentionally + overwrite each other. + type: "object" + properties: + Index: + type: "integer" + format: "uint64" + example: 373531 + + NodeSpec: + type: "object" + properties: + Name: + description: "Name for the node." + type: "string" + example: "my-node" + Labels: + description: "User-defined key/value metadata." + type: "object" + additionalProperties: + type: "string" + Role: + description: "Role of the node." + type: "string" + enum: + - "worker" + - "manager" + example: "manager" + Availability: + description: "Availability of the node." + type: "string" + enum: + - "active" + - "pause" + - "drain" + example: "active" + example: + Availability: "active" + Name: "node-name" + Role: "manager" + Labels: + foo: "bar" + + Node: + type: "object" + properties: + ID: + type: "string" + example: "24ifsmvkjbyhk" + Version: + $ref: "#/definitions/ObjectVersion" + CreatedAt: + description: | + Date and time at which the node was added to the swarm in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. + type: "string" + format: "dateTime" + example: "2016-08-18T10:44:24.496525531Z" + UpdatedAt: + description: | + Date and time at which the node was last updated in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. + type: "string" + format: "dateTime" + example: "2017-08-09T07:09:37.632105588Z" + Spec: + $ref: "#/definitions/NodeSpec" + Description: + $ref: "#/definitions/NodeDescription" + Status: + $ref: "#/definitions/NodeStatus" + ManagerStatus: + $ref: "#/definitions/ManagerStatus" + + NodeDescription: + description: | + NodeDescription encapsulates the properties of the Node as reported by the + agent. + type: "object" + properties: + Hostname: + type: "string" + example: "bf3067039e47" + Platform: + $ref: "#/definitions/Platform" + Resources: + $ref: "#/definitions/ResourceObject" + Engine: + $ref: "#/definitions/EngineDescription" + TLSInfo: + $ref: "#/definitions/TLSInfo" + + Platform: + description: | + Platform represents the platform (Arch/OS). + type: "object" + properties: + Architecture: + description: | + Architecture represents the hardware architecture (for example, + `x86_64`). + type: "string" + example: "x86_64" + OS: + description: | + OS represents the Operating System (for example, `linux` or `windows`). + type: "string" + example: "linux" + + EngineDescription: + description: "EngineDescription provides information about an engine." + type: "object" + properties: + EngineVersion: + type: "string" + example: "17.06.0" + Labels: + type: "object" + additionalProperties: + type: "string" + example: + foo: "bar" + Plugins: + type: "array" + items: + type: "object" + properties: + Type: + type: "string" + Name: + type: "string" + example: + - Type: "Log" + Name: "awslogs" + - Type: "Log" + Name: "fluentd" + - Type: "Log" + Name: "gcplogs" + - Type: "Log" + Name: "gelf" + - Type: "Log" + Name: "journald" + - Type: "Log" + Name: "json-file" + - Type: "Log" + Name: "splunk" + - Type: "Log" + Name: "syslog" + - Type: "Network" + Name: "bridge" + - Type: "Network" + Name: "host" + - Type: "Network" + Name: "ipvlan" + - Type: "Network" + Name: "macvlan" + - Type: "Network" + Name: "null" + - Type: "Network" + Name: "overlay" + - Type: "Volume" + Name: "local" + - Type: "Volume" + Name: "localhost:5000/vieux/sshfs:latest" + - Type: "Volume" + Name: "vieux/sshfs:latest" + + TLSInfo: + description: | + Information about the issuer of leaf TLS certificates and the trusted root + CA certificate. + type: "object" + properties: + TrustRoot: + description: | + The root CA certificate(s) that are used to validate leaf TLS + certificates. + type: "string" + CertIssuerSubject: + description: + The base64-url-safe-encoded raw subject bytes of the issuer. + type: "string" + CertIssuerPublicKey: + description: | + The base64-url-safe-encoded raw public key bytes of the issuer. + type: "string" + example: + TrustRoot: | + -----BEGIN CERTIFICATE----- + MIIBajCCARCgAwIBAgIUbYqrLSOSQHoxD8CwG6Bi2PJi9c8wCgYIKoZIzj0EAwIw + EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMTcwNDI0MjE0MzAwWhcNMzcwNDE5MjE0 + MzAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH + A0IABJk/VyMPYdaqDXJb/VXh5n/1Yuv7iNrxV3Qb3l06XD46seovcDWs3IZNV1lf + 3Skyr0ofcchipoiHkXBODojJydSjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB + Af8EBTADAQH/MB0GA1UdDgQWBBRUXxuRcnFjDfR/RIAUQab8ZV/n4jAKBggqhkjO + PQQDAgNIADBFAiAy+JTe6Uc3KyLCMiqGl2GyWGQqQDEcO3/YG36x7om65AIhAJvz + pxv6zFeVEkAEEkqIYi0omA9+CjanB/6Bz4n1uw8H + -----END CERTIFICATE----- + CertIssuerSubject: "MBMxETAPBgNVBAMTCHN3YXJtLWNh" + CertIssuerPublicKey: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmT9XIw9h1qoNclv9VeHmf/Vi6/uI2vFXdBveXTpcPjqx6i9wNazchk1XWV/dKTKvSh9xyGKmiIeRcE4OiMnJ1A==" + + NodeStatus: + description: | + NodeStatus represents the status of a node. + + It provides the current status of the node, as seen by the manager. + type: "object" + properties: + State: + $ref: "#/definitions/NodeState" + Message: + type: "string" + example: "" + Addr: + description: "IP address of the node." + type: "string" + example: "172.17.0.2" + + NodeState: + description: "NodeState represents the state of a node." + type: "string" + enum: + - "unknown" + - "down" + - "ready" + - "disconnected" + example: "ready" + + ManagerStatus: + description: | + ManagerStatus represents the status of a manager. + + It provides the current status of a node's manager component, if the node + is a manager. + x-nullable: true + type: "object" + properties: + Leader: + type: "boolean" + default: false + example: true + Reachability: + $ref: "#/definitions/Reachability" + Addr: + description: | + The IP address and port at which the manager is reachable. + type: "string" + example: "10.0.0.46:2377" + + Reachability: + description: "Reachability represents the reachability of a node." + type: "string" + enum: + - "unknown" + - "unreachable" + - "reachable" + example: "reachable" + + SwarmSpec: + description: "User modifiable swarm configuration." + type: "object" + properties: + Name: + description: "Name of the swarm." + type: "string" + example: "default" + Labels: + description: "User-defined key/value metadata." + type: "object" + additionalProperties: + type: "string" + example: + com.example.corp.type: "production" + com.example.corp.department: "engineering" + Orchestration: + description: "Orchestration configuration." + type: "object" + x-nullable: true + properties: + TaskHistoryRetentionLimit: + description: | + The number of historic tasks to keep per instance or node. If + negative, never remove completed or failed tasks. + type: "integer" + format: "int64" + example: 10 + Raft: + description: "Raft configuration." + type: "object" + properties: + SnapshotInterval: + description: "The number of log entries between snapshots." + type: "integer" + format: "uint64" + example: 10000 + KeepOldSnapshots: + description: | + The number of snapshots to keep beyond the current snapshot. + type: "integer" + format: "uint64" + LogEntriesForSlowFollowers: + description: | + The number of log entries to keep around to sync up slow followers + after a snapshot is created. + type: "integer" + format: "uint64" + example: 500 + ElectionTick: + description: | + The number of ticks that a follower will wait for a message from + the leader before becoming a candidate and starting an election. + `ElectionTick` must be greater than `HeartbeatTick`. + + A tick currently defaults to one second, so these translate + directly to seconds currently, but this is NOT guaranteed. + type: "integer" + example: 3 + HeartbeatTick: + description: | + The number of ticks between heartbeats. Every HeartbeatTick ticks, + the leader will send a heartbeat to the followers. + + A tick currently defaults to one second, so these translate + directly to seconds currently, but this is NOT guaranteed. + type: "integer" + example: 1 + Dispatcher: + description: "Dispatcher configuration." + type: "object" + x-nullable: true + properties: + HeartbeatPeriod: + description: | + The delay for an agent to send a heartbeat to the dispatcher. + type: "integer" + format: "int64" + example: 5000000000 + CAConfig: + description: "CA configuration." + type: "object" + x-nullable: true + properties: + NodeCertExpiry: + description: "The duration node certificates are issued for." + type: "integer" + format: "int64" + example: 7776000000000000 + ExternalCAs: + description: | + Configuration for forwarding signing requests to an external + certificate authority. + type: "array" + items: + type: "object" + properties: + Protocol: + description: | + Protocol for communication with the external CA (currently + only `cfssl` is supported). + type: "string" + enum: + - "cfssl" + default: "cfssl" + URL: + description: | + URL where certificate signing requests should be sent. + type: "string" + Options: + description: | + An object with key/value pairs that are interpreted as + protocol-specific options for the external CA driver. + type: "object" + additionalProperties: + type: "string" + CACert: + description: | + The root CA certificate (in PEM format) this external CA uses + to issue TLS certificates (assumed to be to the current swarm + root CA certificate if not provided). + type: "string" + SigningCACert: + description: | + The desired signing CA certificate for all swarm node TLS leaf + certificates, in PEM format. + type: "string" + SigningCAKey: + description: | + The desired signing CA key for all swarm node TLS leaf certificates, + in PEM format. + type: "string" + ForceRotate: + description: | + An integer whose purpose is to force swarm to generate a new + signing CA certificate and key, if none have been specified in + `SigningCACert` and `SigningCAKey` + format: "uint64" + type: "integer" + EncryptionConfig: + description: "Parameters related to encryption-at-rest." + type: "object" + properties: + AutoLockManagers: + description: | + If set, generate a key and use it to lock data stored on the + managers. + type: "boolean" + example: false + TaskDefaults: + description: "Defaults for creating tasks in this cluster." + type: "object" + properties: + LogDriver: + description: | + The log driver to use for tasks created in the orchestrator if + unspecified by a service. + + Updating this value only affects new tasks. Existing tasks continue + to use their previously configured log driver until recreated. + type: "object" + properties: + Name: + description: | + The log driver to use as a default for new tasks. + type: "string" + example: "json-file" + Options: + description: | + Driver-specific options for the selected log driver, specified + as key/value pairs. + type: "object" + additionalProperties: + type: "string" + example: + "max-file": "10" + "max-size": "100m" + + # The Swarm information for `GET /info`. It is the same as `GET /swarm`, but + # without `JoinTokens`. + ClusterInfo: + description: | + ClusterInfo represents information about the swarm as is returned by the + "/info" endpoint. Join-tokens are not included. + x-nullable: true + type: "object" + properties: + ID: + description: "The ID of the swarm." + type: "string" + example: "abajmipo7b4xz5ip2nrla6b11" + Version: + $ref: "#/definitions/ObjectVersion" + CreatedAt: + description: | + Date and time at which the swarm was initialised in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. + type: "string" + format: "dateTime" + example: "2016-08-18T10:44:24.496525531Z" + UpdatedAt: + description: | + Date and time at which the swarm was last updated in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. + type: "string" + format: "dateTime" + example: "2017-08-09T07:09:37.632105588Z" + Spec: + $ref: "#/definitions/SwarmSpec" + TLSInfo: + $ref: "#/definitions/TLSInfo" + RootRotationInProgress: + description: | + Whether there is currently a root CA rotation in progress for the swarm + type: "boolean" + example: false + DataPathPort: + description: | + DataPathPort specifies the data path port number for data traffic. + Acceptable port range is 1024 to 49151. + If no port is set or is set to 0, the default port (4789) is used. + type: "integer" + format: "uint32" + default: 4789 + example: 4789 + DefaultAddrPool: + description: | + Default Address Pool specifies default subnet pools for global scope + networks. + type: "array" + items: + type: "string" + format: "CIDR" + example: ["10.10.0.0/16", "20.20.0.0/16"] + SubnetSize: + description: | + SubnetSize specifies the subnet size of the networks created from the + default subnet pool. + type: "integer" + format: "uint32" + maximum: 29 + default: 24 + example: 24 + + JoinTokens: + description: | + JoinTokens contains the tokens workers and managers need to join the swarm. + type: "object" + properties: + Worker: + description: | + The token workers can use to join the swarm. + type: "string" + example: "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx" + Manager: + description: | + The token managers can use to join the swarm. + type: "string" + example: "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2" + + Swarm: + type: "object" + allOf: + - $ref: "#/definitions/ClusterInfo" + - type: "object" + properties: + JoinTokens: + $ref: "#/definitions/JoinTokens" + + TaskSpec: + description: "User modifiable task configuration." + type: "object" + properties: + PluginSpec: + type: "object" + description: | + Plugin spec for the service. *(Experimental release only.)* + +


+ + > **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are + > mutually exclusive. PluginSpec is only used when the Runtime field + > is set to `plugin`. NetworkAttachmentSpec is used when the Runtime + > field is set to `attachment`. + properties: + Name: + description: "The name or 'alias' to use for the plugin." + type: "string" + Remote: + description: "The plugin image reference to use." + type: "string" + Disabled: + description: "Disable the plugin once scheduled." + type: "boolean" + PluginPrivilege: + type: "array" + items: + $ref: "#/definitions/PluginPrivilege" + ContainerSpec: + type: "object" + description: | + Container spec for the service. + +


+ + > **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are + > mutually exclusive. PluginSpec is only used when the Runtime field + > is set to `plugin`. NetworkAttachmentSpec is used when the Runtime + > field is set to `attachment`. + properties: + Image: + description: "The image name to use for the container" + type: "string" + Labels: + description: "User-defined key/value data." + type: "object" + additionalProperties: + type: "string" + Command: + description: "The command to be run in the image." + type: "array" + items: + type: "string" + Args: + description: "Arguments to the command." + type: "array" + items: + type: "string" + Hostname: + description: | + The hostname to use for the container, as a valid + [RFC 1123](https://tools.ietf.org/html/rfc1123) hostname. + type: "string" + Env: + description: | + A list of environment variables in the form `VAR=value`. + type: "array" + items: + type: "string" + Dir: + description: "The working directory for commands to run in." + type: "string" + User: + description: "The user inside the container." + type: "string" + Groups: + type: "array" + description: | + A list of additional groups that the container process will run as. + items: + type: "string" + Privileges: + type: "object" + description: "Security options for the container" + properties: + CredentialSpec: + type: "object" + description: "CredentialSpec for managed service account (Windows only)" + properties: + Config: + type: "string" + example: "0bt9dmxjvjiqermk6xrop3ekq" + description: | + Load credential spec from a Swarm Config with the given ID. + The specified config must also be present in the Configs + field with the Runtime property set. + +


+ + + > **Note**: `CredentialSpec.File`, `CredentialSpec.Registry`, + > and `CredentialSpec.Config` are mutually exclusive. + File: + type: "string" + example: "spec.json" + description: | + Load credential spec from this file. The file is read by + the daemon, and must be present in the `CredentialSpecs` + subdirectory in the docker data directory, which defaults + to `C:\ProgramData\Docker\` on Windows. + + For example, specifying `spec.json` loads + `C:\ProgramData\Docker\CredentialSpecs\spec.json`. + +


+ + > **Note**: `CredentialSpec.File`, `CredentialSpec.Registry`, + > and `CredentialSpec.Config` are mutually exclusive. + Registry: + type: "string" + description: | + Load credential spec from this value in the Windows + registry. The specified registry value must be located in: + + `HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs` + +


+ + + > **Note**: `CredentialSpec.File`, `CredentialSpec.Registry`, + > and `CredentialSpec.Config` are mutually exclusive. + SELinuxContext: + type: "object" + description: "SELinux labels of the container" + properties: + Disable: + type: "boolean" + description: "Disable SELinux" + User: + type: "string" + description: "SELinux user label" + Role: + type: "string" + description: "SELinux role label" + Type: + type: "string" + description: "SELinux type label" + Level: + type: "string" + description: "SELinux level label" + Seccomp: + type: "object" + description: "Options for configuring seccomp on the container" + properties: + Mode: + type: "string" + enum: + - "default" + - "unconfined" + - "custom" + Profile: + description: "The custom seccomp profile as a json object" + type: "string" + AppArmor: + type: "object" + description: "Options for configuring AppArmor on the container" + properties: + Mode: + type: "string" + enum: + - "default" + - "disabled" + NoNewPrivileges: + type: "boolean" + description: "Configuration of the no_new_privs bit in the container" + + TTY: + description: "Whether a pseudo-TTY should be allocated." + type: "boolean" + OpenStdin: + description: "Open `stdin`" + type: "boolean" + ReadOnly: + description: "Mount the container's root filesystem as read only." + type: "boolean" + Mounts: + description: | + Specification for mounts to be added to containers created as part + of the service. + type: "array" + items: + $ref: "#/definitions/Mount" + StopSignal: + description: "Signal to stop the container." + type: "string" + StopGracePeriod: + description: | + Amount of time to wait for the container to terminate before + forcefully killing it. + type: "integer" + format: "int64" + HealthCheck: + $ref: "#/definitions/HealthConfig" + Hosts: + type: "array" + description: | + A list of hostname/IP mappings to add to the container's `hosts` + file. The format of extra hosts is specified in the + [hosts(5)](http://man7.org/linux/man-pages/man5/hosts.5.html) + man page: + + IP_address canonical_hostname [aliases...] + items: + type: "string" + DNSConfig: + description: | + Specification for DNS related configurations in resolver configuration + file (`resolv.conf`). + type: "object" + properties: + Nameservers: + description: "The IP addresses of the name servers." + type: "array" + items: + type: "string" + Search: + description: "A search list for host-name lookup." + type: "array" + items: + type: "string" + Options: + description: | + A list of internal resolver variables to be modified (e.g., + `debug`, `ndots:3`, etc.). + type: "array" + items: + type: "string" + Secrets: + description: | + Secrets contains references to zero or more secrets that will be + exposed to the service. + type: "array" + items: + type: "object" + properties: + File: + description: | + File represents a specific target that is backed by a file. + type: "object" + properties: + Name: + description: | + Name represents the final filename in the filesystem. + type: "string" + UID: + description: "UID represents the file UID." + type: "string" + GID: + description: "GID represents the file GID." + type: "string" + Mode: + description: "Mode represents the FileMode of the file." + type: "integer" + format: "uint32" + SecretID: + description: | + SecretID represents the ID of the specific secret that we're + referencing. + type: "string" + SecretName: + description: | + SecretName is the name of the secret that this references, + but this is just provided for lookup/display purposes. The + secret in the reference will be identified by its ID. + type: "string" + OomScoreAdj: + type: "integer" + format: "int64" + description: | + An integer value containing the score given to the container in + order to tune OOM killer preferences. + example: 0 + Configs: + description: | + Configs contains references to zero or more configs that will be + exposed to the service. + type: "array" + items: + type: "object" + properties: + File: + description: | + File represents a specific target that is backed by a file. + +


+ + > **Note**: `Configs.File` and `Configs.Runtime` are mutually exclusive + type: "object" + properties: + Name: + description: | + Name represents the final filename in the filesystem. + type: "string" + UID: + description: "UID represents the file UID." + type: "string" + GID: + description: "GID represents the file GID." + type: "string" + Mode: + description: "Mode represents the FileMode of the file." + type: "integer" + format: "uint32" + Runtime: + description: | + Runtime represents a target that is not mounted into the + container but is used by the task + +


+ + > **Note**: `Configs.File` and `Configs.Runtime` are mutually + > exclusive + type: "object" + ConfigID: + description: | + ConfigID represents the ID of the specific config that we're + referencing. + type: "string" + ConfigName: + description: | + ConfigName is the name of the config that this references, + but this is just provided for lookup/display purposes. The + config in the reference will be identified by its ID. + type: "string" + Isolation: + type: "string" + description: | + Isolation technology of the containers running the service. + (Windows only) + enum: + - "default" + - "process" + - "hyperv" + - "" + Init: + description: | + Run an init inside the container that forwards signals and reaps + processes. This field is omitted if empty, and the default (as + configured on the daemon) is used. + type: "boolean" + x-nullable: true + Sysctls: + description: | + Set kernel namedspaced parameters (sysctls) in the container. + The Sysctls option on services accepts the same sysctls as the + are supported on containers. Note that while the same sysctls are + supported, no guarantees or checks are made about their + suitability for a clustered environment, and it's up to the user + to determine whether a given sysctl will work properly in a + Service. + type: "object" + additionalProperties: + type: "string" + # This option is not used by Windows containers + CapabilityAdd: + type: "array" + description: | + A list of kernel capabilities to add to the default set + for the container. + items: + type: "string" + example: + - "CAP_NET_RAW" + - "CAP_SYS_ADMIN" + - "CAP_SYS_CHROOT" + - "CAP_SYSLOG" + CapabilityDrop: + type: "array" + description: | + A list of kernel capabilities to drop from the default set + for the container. + items: + type: "string" + example: + - "CAP_NET_RAW" + Ulimits: + description: | + A list of resource limits to set in the container. For example: `{"Name": "nofile", "Soft": 1024, "Hard": 2048}`" + type: "array" + items: + type: "object" + properties: + Name: + description: "Name of ulimit" + type: "string" + Soft: + description: "Soft limit" + type: "integer" + Hard: + description: "Hard limit" + type: "integer" + NetworkAttachmentSpec: + description: | + Read-only spec type for non-swarm containers attached to swarm overlay + networks. + +


+ + > **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are + > mutually exclusive. PluginSpec is only used when the Runtime field + > is set to `plugin`. NetworkAttachmentSpec is used when the Runtime + > field is set to `attachment`. + type: "object" + properties: + ContainerID: + description: "ID of the container represented by this task" + type: "string" + Resources: + description: | + Resource requirements which apply to each individual container created + as part of the service. + type: "object" + properties: + Limits: + description: "Define resources limits." + $ref: "#/definitions/Limit" + Reservations: + description: "Define resources reservation." + $ref: "#/definitions/ResourceObject" + RestartPolicy: + description: | + Specification for the restart policy which applies to containers + created as part of this service. + type: "object" + properties: + Condition: + description: "Condition for restart." + type: "string" + enum: + - "none" + - "on-failure" + - "any" + Delay: + description: "Delay between restart attempts." + type: "integer" + format: "int64" + MaxAttempts: + description: | + Maximum attempts to restart a given container before giving up + (default value is 0, which is ignored). + type: "integer" + format: "int64" + default: 0 + Window: + description: | + Windows is the time window used to evaluate the restart policy + (default value is 0, which is unbounded). + type: "integer" + format: "int64" + default: 0 + Placement: + type: "object" + properties: + Constraints: + description: | + An array of constraint expressions to limit the set of nodes where + a task can be scheduled. Constraint expressions can either use a + _match_ (`==`) or _exclude_ (`!=`) rule. Multiple constraints find + nodes that satisfy every expression (AND match). Constraints can + match node or Docker Engine labels as follows: + + node attribute | matches | example + ---------------------|--------------------------------|----------------------------------------------- + `node.id` | Node ID | `node.id==2ivku8v2gvtg4` + `node.hostname` | Node hostname | `node.hostname!=node-2` + `node.role` | Node role (`manager`/`worker`) | `node.role==manager` + `node.platform.os` | Node operating system | `node.platform.os==windows` + `node.platform.arch` | Node architecture | `node.platform.arch==x86_64` + `node.labels` | User-defined node labels | `node.labels.security==high` + `engine.labels` | Docker Engine's labels | `engine.labels.operatingsystem==ubuntu-24.04` + + `engine.labels` apply to Docker Engine labels like operating system, + drivers, etc. Swarm administrators add `node.labels` for operational + purposes by using the [`node update endpoint`](#operation/NodeUpdate). + + type: "array" + items: + type: "string" + example: + - "node.hostname!=node3.corp.example.com" + - "node.role!=manager" + - "node.labels.type==production" + - "node.platform.os==linux" + - "node.platform.arch==x86_64" + Preferences: + description: | + Preferences provide a way to make the scheduler aware of factors + such as topology. They are provided in order from highest to + lowest precedence. + type: "array" + items: + type: "object" + properties: + Spread: + type: "object" + properties: + SpreadDescriptor: + description: | + label descriptor, such as `engine.labels.az`. + type: "string" + example: + - Spread: + SpreadDescriptor: "node.labels.datacenter" + - Spread: + SpreadDescriptor: "node.labels.rack" + MaxReplicas: + description: | + Maximum number of replicas for per node (default value is 0, which + is unlimited) + type: "integer" + format: "int64" + default: 0 + Platforms: + description: | + Platforms stores all the platforms that the service's image can + run on. This field is used in the platform filter for scheduling. + If empty, then the platform filter is off, meaning there are no + scheduling restrictions. + type: "array" + items: + $ref: "#/definitions/Platform" + ForceUpdate: + description: | + A counter that triggers an update even if no relevant parameters have + been changed. + type: "integer" + Runtime: + description: | + Runtime is the type of runtime specified for the task executor. + type: "string" + Networks: + description: "Specifies which networks the service should attach to." + type: "array" + items: + $ref: "#/definitions/NetworkAttachmentConfig" + LogDriver: + description: | + Specifies the log driver to use for tasks created from this spec. If + not present, the default one for the swarm will be used, finally + falling back to the engine default if not specified. + type: "object" + properties: + Name: + type: "string" + Options: + type: "object" + additionalProperties: + type: "string" + + TaskState: + type: "string" + enum: + - "new" + - "allocated" + - "pending" + - "assigned" + - "accepted" + - "preparing" + - "ready" + - "starting" + - "running" + - "complete" + - "shutdown" + - "failed" + - "rejected" + - "remove" + - "orphaned" + + ContainerStatus: + type: "object" + description: "represents the status of a container." + properties: + ContainerID: + type: "string" + PID: + type: "integer" + ExitCode: + type: "integer" + + PortStatus: + type: "object" + description: "represents the port status of a task's host ports whose service has published host ports" + properties: + Ports: + type: "array" + items: + $ref: "#/definitions/EndpointPortConfig" + + TaskStatus: + type: "object" + description: "represents the status of a task." + properties: + Timestamp: + type: "string" + format: "dateTime" + State: + $ref: "#/definitions/TaskState" + Message: + type: "string" + Err: + type: "string" + ContainerStatus: + $ref: "#/definitions/ContainerStatus" + PortStatus: + $ref: "#/definitions/PortStatus" + + Task: + type: "object" + properties: + ID: + description: "The ID of the task." + type: "string" + Version: + $ref: "#/definitions/ObjectVersion" + CreatedAt: + type: "string" + format: "dateTime" + UpdatedAt: + type: "string" + format: "dateTime" + Name: + description: "Name of the task." + type: "string" + Labels: + description: "User-defined key/value metadata." + type: "object" + additionalProperties: + type: "string" + Spec: + $ref: "#/definitions/TaskSpec" + ServiceID: + description: "The ID of the service this task is part of." + type: "string" + Slot: + type: "integer" + NodeID: + description: "The ID of the node that this task is on." + type: "string" + AssignedGenericResources: + $ref: "#/definitions/GenericResources" + Status: + $ref: "#/definitions/TaskStatus" + DesiredState: + $ref: "#/definitions/TaskState" + JobIteration: + description: | + If the Service this Task belongs to is a job-mode service, contains + the JobIteration of the Service this Task was created for. Absent if + the Task was created for a Replicated or Global Service. + $ref: "#/definitions/ObjectVersion" + example: + ID: "0kzzo1i0y4jz6027t0k7aezc7" + Version: + Index: 71 + CreatedAt: "2016-06-07T21:07:31.171892745Z" + UpdatedAt: "2016-06-07T21:07:31.376370513Z" + Spec: + ContainerSpec: + Image: "redis" + Resources: + Limits: {} + Reservations: {} + RestartPolicy: + Condition: "any" + MaxAttempts: 0 + Placement: {} + ServiceID: "9mnpnzenvg8p8tdbtq4wvbkcz" + Slot: 1 + NodeID: "60gvrl6tm78dmak4yl7srz94v" + Status: + Timestamp: "2016-06-07T21:07:31.290032978Z" + State: "running" + Message: "started" + ContainerStatus: + ContainerID: "e5d62702a1b48d01c3e02ca1e0212a250801fa8d67caca0b6f35919ebc12f035" + PID: 677 + DesiredState: "running" + NetworksAttachments: + - Network: + ID: "4qvuz4ko70xaltuqbt8956gd1" + Version: + Index: 18 + CreatedAt: "2016-06-07T20:31:11.912919752Z" + UpdatedAt: "2016-06-07T21:07:29.955277358Z" + Spec: + Name: "ingress" + Labels: + com.docker.swarm.internal: "true" + DriverConfiguration: {} + IPAMOptions: + Driver: {} + Configs: + - Subnet: "10.255.0.0/16" + Gateway: "10.255.0.1" + DriverState: + Name: "overlay" + Options: + com.docker.network.driver.overlay.vxlanid_list: "256" + IPAMOptions: + Driver: + Name: "default" + Configs: + - Subnet: "10.255.0.0/16" + Gateway: "10.255.0.1" + Addresses: + - "10.255.0.10/16" + AssignedGenericResources: + - DiscreteResourceSpec: + Kind: "SSD" + Value: 3 + - NamedResourceSpec: + Kind: "GPU" + Value: "UUID1" + - NamedResourceSpec: + Kind: "GPU" + Value: "UUID2" + + ServiceSpec: + description: "User modifiable configuration for a service." + type: object + properties: + Name: + description: "Name of the service." + type: "string" + Labels: + description: "User-defined key/value metadata." + type: "object" + additionalProperties: + type: "string" + TaskTemplate: + $ref: "#/definitions/TaskSpec" + Mode: + description: "Scheduling mode for the service." + type: "object" + properties: + Replicated: + type: "object" + properties: + Replicas: + type: "integer" + format: "int64" + Global: + type: "object" + ReplicatedJob: + description: | + The mode used for services with a finite number of tasks that run + to a completed state. + type: "object" + properties: + MaxConcurrent: + description: | + The maximum number of replicas to run simultaneously. + type: "integer" + format: "int64" + default: 1 + TotalCompletions: + description: | + The total number of replicas desired to reach the Completed + state. If unset, will default to the value of `MaxConcurrent` + type: "integer" + format: "int64" + GlobalJob: + description: | + The mode used for services which run a task to the completed state + on each valid node. + type: "object" + UpdateConfig: + description: "Specification for the update strategy of the service." + type: "object" + properties: + Parallelism: + description: | + Maximum number of tasks to be updated in one iteration (0 means + unlimited parallelism). + type: "integer" + format: "int64" + Delay: + description: "Amount of time between updates, in nanoseconds." + type: "integer" + format: "int64" + FailureAction: + description: | + Action to take if an updated task fails to run, or stops running + during the update. + type: "string" + enum: + - "continue" + - "pause" + - "rollback" + Monitor: + description: | + Amount of time to monitor each updated task for failures, in + nanoseconds. + type: "integer" + format: "int64" + MaxFailureRatio: + description: | + The fraction of tasks that may fail during an update before the + failure action is invoked, specified as a floating point number + between 0 and 1. + type: "number" + default: 0 + Order: + description: | + The order of operations when rolling out an updated task. Either + the old task is shut down before the new task is started, or the + new task is started before the old task is shut down. + type: "string" + enum: + - "stop-first" + - "start-first" + RollbackConfig: + description: "Specification for the rollback strategy of the service." + type: "object" + properties: + Parallelism: + description: | + Maximum number of tasks to be rolled back in one iteration (0 means + unlimited parallelism). + type: "integer" + format: "int64" + Delay: + description: | + Amount of time between rollback iterations, in nanoseconds. + type: "integer" + format: "int64" + FailureAction: + description: | + Action to take if an rolled back task fails to run, or stops + running during the rollback. + type: "string" + enum: + - "continue" + - "pause" + Monitor: + description: | + Amount of time to monitor each rolled back task for failures, in + nanoseconds. + type: "integer" + format: "int64" + MaxFailureRatio: + description: | + The fraction of tasks that may fail during a rollback before the + failure action is invoked, specified as a floating point number + between 0 and 1. + type: "number" + default: 0 + Order: + description: | + The order of operations when rolling back a task. Either the old + task is shut down before the new task is started, or the new task + is started before the old task is shut down. + type: "string" + enum: + - "stop-first" + - "start-first" + Networks: + description: | + Specifies which networks the service should attach to. + + Deprecated: This field is deprecated since v1.44. The Networks field in TaskSpec should be used instead. + type: "array" + items: + $ref: "#/definitions/NetworkAttachmentConfig" + + EndpointSpec: + $ref: "#/definitions/EndpointSpec" + + EndpointPortConfig: + type: "object" + properties: + Name: + type: "string" + Protocol: + type: "string" + enum: + - "tcp" + - "udp" + - "sctp" + TargetPort: + description: "The port inside the container." + type: "integer" + PublishedPort: + description: "The port on the swarm hosts." + type: "integer" + PublishMode: + description: | + The mode in which port is published. + +


+ + - "ingress" makes the target port accessible on every node, + regardless of whether there is a task for the service running on + that node or not. + - "host" bypasses the routing mesh and publish the port directly on + the swarm node where that service is running. + + type: "string" + enum: + - "ingress" + - "host" + default: "ingress" + example: "ingress" + + EndpointSpec: + description: "Properties that can be configured to access and load balance a service." + type: "object" + properties: + Mode: + description: | + The mode of resolution to use for internal load balancing between tasks. + type: "string" + enum: + - "vip" + - "dnsrr" + default: "vip" + Ports: + description: | + List of exposed ports that this service is accessible on from the + outside. Ports can only be provided if `vip` resolution mode is used. + type: "array" + items: + $ref: "#/definitions/EndpointPortConfig" + + Service: + type: "object" + properties: + ID: + type: "string" + Version: + $ref: "#/definitions/ObjectVersion" + CreatedAt: + type: "string" + format: "dateTime" + UpdatedAt: + type: "string" + format: "dateTime" + Spec: + $ref: "#/definitions/ServiceSpec" + Endpoint: + type: "object" + properties: + Spec: + $ref: "#/definitions/EndpointSpec" + Ports: + type: "array" + items: + $ref: "#/definitions/EndpointPortConfig" + VirtualIPs: + type: "array" + items: + type: "object" + properties: + NetworkID: + type: "string" + Addr: + type: "string" + UpdateStatus: + description: "The status of a service update." + type: "object" + properties: + State: + type: "string" + enum: + - "updating" + - "paused" + - "completed" + StartedAt: + type: "string" + format: "dateTime" + CompletedAt: + type: "string" + format: "dateTime" + Message: + type: "string" + ServiceStatus: + description: | + The status of the service's tasks. Provided only when requested as + part of a ServiceList operation. + type: "object" + properties: + RunningTasks: + description: | + The number of tasks for the service currently in the Running state. + type: "integer" + format: "uint64" + example: 7 + DesiredTasks: + description: | + The number of tasks for the service desired to be running. + For replicated services, this is the replica count from the + service spec. For global services, this is computed by taking + count of all tasks for the service with a Desired State other + than Shutdown. + type: "integer" + format: "uint64" + example: 10 + CompletedTasks: + description: | + The number of tasks for a job that are in the Completed state. + This field must be cross-referenced with the service type, as the + value of 0 may mean the service is not in a job mode, or it may + mean the job-mode service has no tasks yet Completed. + type: "integer" + format: "uint64" + JobStatus: + description: | + The status of the service when it is in one of ReplicatedJob or + GlobalJob modes. Absent on Replicated and Global mode services. The + JobIteration is an ObjectVersion, but unlike the Service's version, + does not need to be sent with an update request. + type: "object" + properties: + JobIteration: + description: | + JobIteration is a value increased each time a Job is executed, + successfully or otherwise. "Executed", in this case, means the + job as a whole has been started, not that an individual Task has + been launched. A job is "Executed" when its ServiceSpec is + updated. JobIteration can be used to disambiguate Tasks belonging + to different executions of a job. Though JobIteration will + increase with each subsequent execution, it may not necessarily + increase by 1, and so JobIteration should not be used to + $ref: "#/definitions/ObjectVersion" + LastExecution: + description: | + The last time, as observed by the server, that this job was + started. + type: "string" + format: "dateTime" + example: + ID: "9mnpnzenvg8p8tdbtq4wvbkcz" + Version: + Index: 19 + CreatedAt: "2016-06-07T21:05:51.880065305Z" + UpdatedAt: "2016-06-07T21:07:29.962229872Z" + Spec: + Name: "hopeful_cori" + TaskTemplate: + ContainerSpec: + Image: "redis" + Resources: + Limits: {} + Reservations: {} + RestartPolicy: + Condition: "any" + MaxAttempts: 0 + Placement: {} + ForceUpdate: 0 + Mode: + Replicated: + Replicas: 1 + UpdateConfig: + Parallelism: 1 + Delay: 1000000000 + FailureAction: "pause" + Monitor: 15000000000 + MaxFailureRatio: 0.15 + RollbackConfig: + Parallelism: 1 + Delay: 1000000000 + FailureAction: "pause" + Monitor: 15000000000 + MaxFailureRatio: 0.15 + EndpointSpec: + Mode: "vip" + Ports: + - + Protocol: "tcp" + TargetPort: 6379 + PublishedPort: 30001 + Endpoint: + Spec: + Mode: "vip" + Ports: + - + Protocol: "tcp" + TargetPort: 6379 + PublishedPort: 30001 + Ports: + - + Protocol: "tcp" + TargetPort: 6379 + PublishedPort: 30001 + VirtualIPs: + - + NetworkID: "4qvuz4ko70xaltuqbt8956gd1" + Addr: "10.255.0.2/16" + - + NetworkID: "4qvuz4ko70xaltuqbt8956gd1" + Addr: "10.255.0.3/16" + + ImageDeleteResponseItem: + type: "object" + x-go-name: "DeleteResponse" + properties: + Untagged: + description: "The image ID of an image that was untagged" + type: "string" + Deleted: + description: "The image ID of an image that was deleted" + type: "string" + + ServiceCreateResponse: + type: "object" + description: | + contains the information returned to a client on the + creation of a new service. + properties: + ID: + description: "The ID of the created service." + type: "string" + x-nullable: false + example: "ak7w3gjqoa3kuz8xcpnyy0pvl" + Warnings: + description: | + Optional warning message. + + FIXME(thaJeztah): this should have "omitempty" in the generated type. + type: "array" + x-nullable: true + items: + type: "string" + example: + - "unable to pin image doesnotexist:latest to digest: image library/doesnotexist:latest not found" + + ServiceUpdateResponse: + type: "object" + properties: + Warnings: + description: "Optional warning messages" + type: "array" + items: + type: "string" + example: + Warnings: + - "unable to pin image doesnotexist:latest to digest: image library/doesnotexist:latest not found" + + ContainerInspectResponse: + type: "object" + title: "ContainerInspectResponse" + x-go-name: "InspectResponse" + properties: + Id: + description: |- + The ID of this container as a 128-bit (64-character) hexadecimal string (32 bytes). + type: "string" + x-go-name: "ID" + minLength: 64 + maxLength: 64 + pattern: "^[0-9a-fA-F]{64}$" + example: "aa86eacfb3b3ed4cd362c1e88fc89a53908ad05fb3a4103bca3f9b28292d14bf" + Created: + description: |- + Date and time at which the container was created, formatted in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. + type: "string" + format: "dateTime" + x-nullable: true + example: "2025-02-17T17:43:39.64001363Z" + Path: + description: |- + The path to the command being run + type: "string" + example: "/bin/sh" + Args: + description: "The arguments to the command being run" + type: "array" + items: + type: "string" + example: + - "-c" + - "exit 9" + State: + $ref: "#/definitions/ContainerState" + Image: + description: |- + The ID (digest) of the image that this container was created from. + type: "string" + example: "sha256:72297848456d5d37d1262630108ab308d3e9ec7ed1c3286a32fe09856619a782" + ResolvConfPath: + description: |- + Location of the `/etc/resolv.conf` generated for the container on the + host. + + This file is managed through the docker daemon, and should not be + accessed or modified by other tools. + type: "string" + example: "/var/lib/docker/containers/aa86eacfb3b3ed4cd362c1e88fc89a53908ad05fb3a4103bca3f9b28292d14bf/resolv.conf" + HostnamePath: + description: |- + Location of the `/etc/hostname` generated for the container on the + host. + + This file is managed through the docker daemon, and should not be + accessed or modified by other tools. + type: "string" + example: "/var/lib/docker/containers/aa86eacfb3b3ed4cd362c1e88fc89a53908ad05fb3a4103bca3f9b28292d14bf/hostname" + HostsPath: + description: |- + Location of the `/etc/hosts` generated for the container on the + host. + + This file is managed through the docker daemon, and should not be + accessed or modified by other tools. + type: "string" + example: "/var/lib/docker/containers/aa86eacfb3b3ed4cd362c1e88fc89a53908ad05fb3a4103bca3f9b28292d14bf/hosts" + LogPath: + description: |- + Location of the file used to buffer the container's logs. Depending on + the logging-driver used for the container, this field may be omitted. + + This file is managed through the docker daemon, and should not be + accessed or modified by other tools. + type: "string" + x-nullable: true + example: "/var/lib/docker/containers/5b7c7e2b992aa426584ce6c47452756066be0e503a08b4516a433a54d2f69e59/5b7c7e2b992aa426584ce6c47452756066be0e503a08b4516a433a54d2f69e59-json.log" + Name: + description: |- + The name associated with this container. + + For historic reasons, the name may be prefixed with a forward-slash (`/`). + type: "string" + example: "/funny_chatelet" + RestartCount: + description: |- + Number of times the container was restarted since it was created, + or since daemon was started. + type: "integer" + example: 0 + Driver: + description: |- + The storage-driver used for the container's filesystem (graph-driver + or snapshotter). + type: "string" + example: "overlayfs" + Platform: + description: |- + The platform (operating system) for which the container was created. + + This field was introduced for the experimental "LCOW" (Linux Containers + On Windows) features, which has been removed. In most cases, this field + is equal to the host's operating system (`linux` or `windows`). + type: "string" + example: "linux" + ImageManifestDescriptor: + $ref: "#/definitions/OCIDescriptor" + description: |- + OCI descriptor of the platform-specific manifest of the image + the container was created from. + + Note: Only available if the daemon provides a multi-platform + image store. + MountLabel: + description: |- + SELinux mount label set for the container. + type: "string" + example: "" + ProcessLabel: + description: |- + SELinux process label set for the container. + type: "string" + example: "" + AppArmorProfile: + description: |- + The AppArmor profile set for the container. + type: "string" + example: "" + ExecIDs: + description: |- + IDs of exec instances that are running in the container. + type: "array" + items: + type: "string" + x-nullable: true + example: + - "b35395de42bc8abd327f9dd65d913b9ba28c74d2f0734eeeae84fa1c616a0fca" + - "3fc1232e5cd20c8de182ed81178503dc6437f4e7ef12b52cc5e8de020652f1c4" + HostConfig: + $ref: "#/definitions/HostConfig" + GraphDriver: + $ref: "#/definitions/DriverData" + SizeRw: + description: |- + The size of files that have been created or changed by this container. + + This field is omitted by default, and only set when size is requested + in the API request. + type: "integer" + format: "int64" + x-nullable: true + example: "122880" + SizeRootFs: + description: |- + The total size of all files in the read-only layers from the image + that the container uses. These layers can be shared between containers. + + This field is omitted by default, and only set when size is requested + in the API request. + type: "integer" + format: "int64" + x-nullable: true + example: "1653948416" + Mounts: + description: |- + List of mounts used by the container. + type: "array" + items: + $ref: "#/definitions/MountPoint" + Config: + $ref: "#/definitions/ContainerConfig" + NetworkSettings: + $ref: "#/definitions/NetworkSettings" + + ContainerSummary: + type: "object" + properties: + Id: + description: |- + The ID of this container as a 128-bit (64-character) hexadecimal string (32 bytes). + type: "string" + x-go-name: "ID" + minLength: 64 + maxLength: 64 + pattern: "^[0-9a-fA-F]{64}$" + example: "aa86eacfb3b3ed4cd362c1e88fc89a53908ad05fb3a4103bca3f9b28292d14bf" + Names: + description: |- + The names associated with this container. Most containers have a single + name, but when using legacy "links", the container can have multiple + names. + + For historic reasons, names are prefixed with a forward-slash (`/`). + type: "array" + items: + type: "string" + example: + - "/funny_chatelet" + Image: + description: |- + The name or ID of the image used to create the container. + + This field shows the image reference as was specified when creating the container, + which can be in its canonical form (e.g., `docker.io/library/ubuntu:latest` + or `docker.io/library/ubuntu@sha256:72297848456d5d37d1262630108ab308d3e9ec7ed1c3286a32fe09856619a782`), + short form (e.g., `ubuntu:latest`)), or the ID(-prefix) of the image (e.g., `72297848456d`). + + The content of this field can be updated at runtime if the image used to + create the container is untagged, in which case the field is updated to + contain the the image ID (digest) it was resolved to in its canonical, + non-truncated form (e.g., `sha256:72297848456d5d37d1262630108ab308d3e9ec7ed1c3286a32fe09856619a782`). + type: "string" + example: "docker.io/library/ubuntu:latest" + ImageID: + description: |- + The ID (digest) of the image that this container was created from. + type: "string" + example: "sha256:72297848456d5d37d1262630108ab308d3e9ec7ed1c3286a32fe09856619a782" + ImageManifestDescriptor: + $ref: "#/definitions/OCIDescriptor" + x-nullable: true + description: | + OCI descriptor of the platform-specific manifest of the image + the container was created from. + + Note: Only available if the daemon provides a multi-platform + image store. + + This field is not populated in the `GET /system/df` endpoint. + Command: + description: "Command to run when starting the container" + type: "string" + example: "/bin/bash" + Created: + description: |- + Date and time at which the container was created as a Unix timestamp + (number of seconds since EPOCH). + type: "integer" + format: "int64" + example: "1739811096" + Ports: + description: |- + Port-mappings for the container. + type: "array" + items: + $ref: "#/definitions/Port" + SizeRw: + description: |- + The size of files that have been created or changed by this container. + + This field is omitted by default, and only set when size is requested + in the API request. + type: "integer" + format: "int64" + x-nullable: true + example: "122880" + SizeRootFs: + description: |- + The total size of all files in the read-only layers from the image + that the container uses. These layers can be shared between containers. + + This field is omitted by default, and only set when size is requested + in the API request. + type: "integer" + format: "int64" + x-nullable: true + example: "1653948416" + Labels: + description: "User-defined key/value metadata." + type: "object" + additionalProperties: + type: "string" + example: + com.example.vendor: "Acme" + com.example.license: "GPL" + com.example.version: "1.0" + State: + description: | + The state of this container. + type: "string" + enum: + - "created" + - "running" + - "paused" + - "restarting" + - "exited" + - "removing" + - "dead" + example: "running" + Status: + description: |- + Additional human-readable status of this container (e.g. `Exit 0`) + type: "string" + example: "Up 4 days" + HostConfig: + type: "object" + description: |- + Summary of host-specific runtime information of the container. This + is a reduced set of information in the container's "HostConfig" as + available in the container "inspect" response. + properties: + NetworkMode: + description: |- + Networking mode (`host`, `none`, `container:`) or name of the + primary network the container is using. + + This field is primarily for backward compatibility. The container + can be connected to multiple networks for which information can be + found in the `NetworkSettings.Networks` field, which enumerates + settings per network. + type: "string" + example: "mynetwork" + Annotations: + description: |- + Arbitrary key-value metadata attached to the container. + type: "object" + x-nullable: true + additionalProperties: + type: "string" + example: + io.kubernetes.docker.type: "container" + io.kubernetes.sandbox.id: "3befe639bed0fd6afdd65fd1fa84506756f59360ec4adc270b0fdac9be22b4d3" + NetworkSettings: + description: |- + Summary of the container's network settings + type: "object" + properties: + Networks: + type: "object" + description: |- + Summary of network-settings for each network the container is + attached to. + additionalProperties: + $ref: "#/definitions/EndpointSettings" + Mounts: + type: "array" + description: |- + List of mounts used by the container. + items: + $ref: "#/definitions/MountPoint" + + Driver: + description: "Driver represents a driver (network, logging, secrets)." + type: "object" + required: [Name] + properties: + Name: + description: "Name of the driver." + type: "string" + x-nullable: false + example: "some-driver" + Options: + description: "Key/value map of driver-specific options." + type: "object" + x-nullable: false + additionalProperties: + type: "string" + example: + OptionA: "value for driver-specific option A" + OptionB: "value for driver-specific option B" + + SecretSpec: + type: "object" + properties: + Name: + description: "User-defined name of the secret." + type: "string" + Labels: + description: "User-defined key/value metadata." + type: "object" + additionalProperties: + type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" + Data: + description: | + Data is the data to store as a secret, formatted as a Base64-url-safe-encoded + ([RFC 4648](https://tools.ietf.org/html/rfc4648#section-5)) string. + It must be empty if the Driver field is set, in which case the data is + loaded from an external secret store. The maximum allowed size is 500KB, + as defined in [MaxSecretSize](https://pkg.go.dev/github.com/moby/swarmkit/v2@v2.0.0-20250103191802-8c1959736554/api/validation#MaxSecretSize). + + This field is only used to _create_ a secret, and is not returned by + other endpoints. + type: "string" + example: "" + Driver: + description: | + Name of the secrets driver used to fetch the secret's value from an + external secret store. + $ref: "#/definitions/Driver" + Templating: + description: | + Templating driver, if applicable + + Templating controls whether and how to evaluate the config payload as + a template. If no driver is set, no templating is used. + $ref: "#/definitions/Driver" + + Secret: + type: "object" + properties: + ID: + type: "string" + example: "blt1owaxmitz71s9v5zh81zun" + Version: + $ref: "#/definitions/ObjectVersion" + CreatedAt: + type: "string" + format: "dateTime" + example: "2017-07-20T13:55:28.678958722Z" + UpdatedAt: + type: "string" + format: "dateTime" + example: "2017-07-20T13:55:28.678958722Z" + Spec: + $ref: "#/definitions/SecretSpec" + + ConfigSpec: + type: "object" + properties: + Name: + description: "User-defined name of the config." + type: "string" + Labels: + description: "User-defined key/value metadata." + type: "object" + additionalProperties: + type: "string" + Data: + description: | + Data is the data to store as a config, formatted as a Base64-url-safe-encoded + ([RFC 4648](https://tools.ietf.org/html/rfc4648#section-5)) string. + The maximum allowed size is 1000KB, as defined in [MaxConfigSize](https://pkg.go.dev/github.com/moby/swarmkit/v2@v2.0.0-20250103191802-8c1959736554/manager/controlapi#MaxConfigSize). + type: "string" + Templating: + description: | + Templating driver, if applicable + + Templating controls whether and how to evaluate the config payload as + a template. If no driver is set, no templating is used. + $ref: "#/definitions/Driver" + + Config: + type: "object" + properties: + ID: + type: "string" + Version: + $ref: "#/definitions/ObjectVersion" + CreatedAt: + type: "string" + format: "dateTime" + UpdatedAt: + type: "string" + format: "dateTime" + Spec: + $ref: "#/definitions/ConfigSpec" + + ContainerState: + description: | + ContainerState stores container's running state. It's part of ContainerJSONBase + and will be returned by the "inspect" command. + type: "object" + x-nullable: true + properties: + Status: + description: | + String representation of the container state. Can be one of "created", + "running", "paused", "restarting", "removing", "exited", or "dead". + type: "string" + enum: ["created", "running", "paused", "restarting", "removing", "exited", "dead"] + example: "running" + Running: + description: | + Whether this container is running. + + Note that a running container can be _paused_. The `Running` and `Paused` + booleans are not mutually exclusive: + + When pausing a container (on Linux), the freezer cgroup is used to suspend + all processes in the container. Freezing the process requires the process to + be running. As a result, paused containers are both `Running` _and_ `Paused`. + + Use the `Status` field instead to determine if a container's state is "running". + type: "boolean" + example: true + Paused: + description: "Whether this container is paused." + type: "boolean" + example: false + Restarting: + description: "Whether this container is restarting." + type: "boolean" + example: false + OOMKilled: + description: | + Whether a process within this container has been killed because it ran + out of memory since the container was last started. + type: "boolean" + example: false + Dead: + type: "boolean" + example: false + Pid: + description: "The process ID of this container" + type: "integer" + example: 1234 + ExitCode: + description: "The last exit code of this container" + type: "integer" + example: 0 + Error: + type: "string" + StartedAt: + description: "The time when this container was last started." + type: "string" + example: "2020-01-06T09:06:59.461876391Z" + FinishedAt: + description: "The time when this container last exited." + type: "string" + example: "2020-01-06T09:07:59.461876391Z" + Health: + $ref: "#/definitions/Health" + + ContainerCreateResponse: + description: "OK response to ContainerCreate operation" + type: "object" + title: "ContainerCreateResponse" + x-go-name: "CreateResponse" + required: [Id, Warnings] + properties: + Id: + description: "The ID of the created container" + type: "string" + x-nullable: false + example: "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743" + Warnings: + description: "Warnings encountered when creating the container" + type: "array" + x-nullable: false + items: + type: "string" + example: [] + + ContainerUpdateResponse: + type: "object" + title: "ContainerUpdateResponse" + x-go-name: "UpdateResponse" + description: |- + Response for a successful container-update. + properties: + Warnings: + type: "array" + description: |- + Warnings encountered when updating the container. + items: + type: "string" + example: ["Published ports are discarded when using host network mode"] + + ContainerStatsResponse: + description: | + Statistics sample for a container. + type: "object" + x-go-name: "StatsResponse" + title: "ContainerStatsResponse" + properties: + name: + description: "Name of the container" + type: "string" + x-nullable: true + example: "boring_wozniak" + id: + description: "ID of the container" + type: "string" + x-nullable: true + example: "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743" + read: + description: | + Date and time at which this sample was collected. + The value is formatted as [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) + with nano-seconds. + type: "string" + format: "date-time" + example: "2025-01-16T13:55:22.165243637Z" + preread: + description: | + Date and time at which this first sample was collected. This field + is not propagated if the "one-shot" option is set. If the "one-shot" + option is set, this field may be omitted, empty, or set to a default + date (`0001-01-01T00:00:00Z`). + + The value is formatted as [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) + with nano-seconds. + type: "string" + format: "date-time" + example: "2025-01-16T13:55:21.160452595Z" + pids_stats: + $ref: "#/definitions/ContainerPidsStats" + blkio_stats: + $ref: "#/definitions/ContainerBlkioStats" + num_procs: + description: | + The number of processors on the system. + + This field is Windows-specific and always zero for Linux containers. + type: "integer" + format: "uint32" + example: 16 + storage_stats: + $ref: "#/definitions/ContainerStorageStats" + cpu_stats: + $ref: "#/definitions/ContainerCPUStats" + precpu_stats: + $ref: "#/definitions/ContainerCPUStats" + memory_stats: + $ref: "#/definitions/ContainerMemoryStats" + networks: + description: | + Network statistics for the container per interface. + + This field is omitted if the container has no networking enabled. + x-nullable: true + additionalProperties: + $ref: "#/definitions/ContainerNetworkStats" + example: + eth0: + rx_bytes: 5338 + rx_dropped: 0 + rx_errors: 0 + rx_packets: 36 + tx_bytes: 648 + tx_dropped: 0 + tx_errors: 0 + tx_packets: 8 + eth5: + rx_bytes: 4641 + rx_dropped: 0 + rx_errors: 0 + rx_packets: 26 + tx_bytes: 690 + tx_dropped: 0 + tx_errors: 0 + tx_packets: 9 + + ContainerBlkioStats: + description: | + BlkioStats stores all IO service stats for data read and write. + + This type is Linux-specific and holds many fields that are specific to cgroups v1. + On a cgroup v2 host, all fields other than `io_service_bytes_recursive` + are omitted or `null`. + + This type is only populated on Linux and omitted for Windows containers. + type: "object" + x-go-name: "BlkioStats" + x-nullable: true + properties: + io_service_bytes_recursive: + type: "array" + items: + $ref: "#/definitions/ContainerBlkioStatEntry" + io_serviced_recursive: + description: | + This field is only available when using Linux containers with + cgroups v1. It is omitted or `null` when using cgroups v2. + x-nullable: true + type: "array" + items: + $ref: "#/definitions/ContainerBlkioStatEntry" + io_queue_recursive: + description: | + This field is only available when using Linux containers with + cgroups v1. It is omitted or `null` when using cgroups v2. + x-nullable: true + type: "array" + items: + $ref: "#/definitions/ContainerBlkioStatEntry" + io_service_time_recursive: + description: | + This field is only available when using Linux containers with + cgroups v1. It is omitted or `null` when using cgroups v2. + x-nullable: true + type: "array" + items: + $ref: "#/definitions/ContainerBlkioStatEntry" + io_wait_time_recursive: + description: | + This field is only available when using Linux containers with + cgroups v1. It is omitted or `null` when using cgroups v2. + x-nullable: true + type: "array" + items: + $ref: "#/definitions/ContainerBlkioStatEntry" + io_merged_recursive: + description: | + This field is only available when using Linux containers with + cgroups v1. It is omitted or `null` when using cgroups v2. + x-nullable: true + type: "array" + items: + $ref: "#/definitions/ContainerBlkioStatEntry" + io_time_recursive: + description: | + This field is only available when using Linux containers with + cgroups v1. It is omitted or `null` when using cgroups v2. + x-nullable: true + type: "array" + items: + $ref: "#/definitions/ContainerBlkioStatEntry" + sectors_recursive: + description: | + This field is only available when using Linux containers with + cgroups v1. It is omitted or `null` when using cgroups v2. + x-nullable: true + type: "array" + items: + $ref: "#/definitions/ContainerBlkioStatEntry" + example: + io_service_bytes_recursive: [ + {"major": 254, "minor": 0, "op": "read", "value": 7593984}, + {"major": 254, "minor": 0, "op": "write", "value": 100} + ] + io_serviced_recursive: null + io_queue_recursive: null + io_service_time_recursive: null + io_wait_time_recursive: null + io_merged_recursive: null + io_time_recursive: null + sectors_recursive: null + + ContainerBlkioStatEntry: + description: | + Blkio stats entry. + + This type is Linux-specific and omitted for Windows containers. + type: "object" + x-go-name: "BlkioStatEntry" + x-nullable: true + properties: + major: + type: "integer" + format: "uint64" + example: 254 + minor: + type: "integer" + format: "uint64" + example: 0 + op: + type: "string" + example: "read" + value: + type: "integer" + format: "uint64" + example: 7593984 + + ContainerCPUStats: + description: | + CPU related info of the container + type: "object" + x-go-name: "CPUStats" + x-nullable: true + properties: + cpu_usage: + $ref: "#/definitions/ContainerCPUUsage" + system_cpu_usage: + description: | + System Usage. + + This field is Linux-specific and omitted for Windows containers. + type: "integer" + format: "uint64" + x-nullable: true + example: 5 + online_cpus: + description: | + Number of online CPUs. + + This field is Linux-specific and omitted for Windows containers. + type: "integer" + format: "uint32" + x-nullable: true + example: 5 + throttling_data: + $ref: "#/definitions/ContainerThrottlingData" + + ContainerCPUUsage: + description: | + All CPU stats aggregated since container inception. + type: "object" + x-go-name: "CPUUsage" + x-nullable: true + properties: + total_usage: + description: | + Total CPU time consumed in nanoseconds (Linux) or 100's of nanoseconds (Windows). + type: "integer" + format: "uint64" + example: 29912000 + percpu_usage: + description: | + Total CPU time (in nanoseconds) consumed per core (Linux). + + This field is Linux-specific when using cgroups v1. It is omitted + when using cgroups v2 and Windows containers. + type: "array" + x-nullable: true + items: + type: "integer" + format: "uint64" + example: 29912000 + + usage_in_kernelmode: + description: | + Time (in nanoseconds) spent by tasks of the cgroup in kernel mode (Linux), + or time spent (in 100's of nanoseconds) by all container processes in + kernel mode (Windows). + + Not populated for Windows containers using Hyper-V isolation. + type: "integer" + format: "uint64" + example: 21994000 + usage_in_usermode: + description: | + Time (in nanoseconds) spent by tasks of the cgroup in user mode (Linux), + or time spent (in 100's of nanoseconds) by all container processes in + kernel mode (Windows). + + Not populated for Windows containers using Hyper-V isolation. + type: "integer" + format: "uint64" + example: 7918000 + + ContainerPidsStats: + description: | + PidsStats contains Linux-specific stats of a container's process-IDs (PIDs). + + This type is Linux-specific and omitted for Windows containers. + type: "object" + x-go-name: "PidsStats" + x-nullable: true + properties: + current: + description: | + Current is the number of PIDs in the cgroup. + type: "integer" + format: "uint64" + x-nullable: true + example: 5 + limit: + description: | + Limit is the hard limit on the number of pids in the cgroup. + A "Limit" of 0 means that there is no limit. + type: "integer" + format: "uint64" + x-nullable: true + example: 18446744073709551615 + + ContainerThrottlingData: + description: | + CPU throttling stats of the container. + + This type is Linux-specific and omitted for Windows containers. + type: "object" + x-go-name: "ThrottlingData" + x-nullable: true + properties: + periods: + description: | + Number of periods with throttling active. + type: "integer" + format: "uint64" + example: 0 + throttled_periods: + description: | + Number of periods when the container hit its throttling limit. + type: "integer" + format: "uint64" + example: 0 + throttled_time: + description: | + Aggregated time (in nanoseconds) the container was throttled for. + type: "integer" + format: "uint64" + example: 0 + + ContainerMemoryStats: + description: | + Aggregates all memory stats since container inception on Linux. + Windows returns stats for commit and private working set only. + type: "object" + x-go-name: "MemoryStats" + properties: + usage: + description: | + Current `res_counter` usage for memory. + + This field is Linux-specific and omitted for Windows containers. + type: "integer" + format: "uint64" + x-nullable: true + example: 0 + max_usage: + description: | + Maximum usage ever recorded. + + This field is Linux-specific and only supported on cgroups v1. + It is omitted when using cgroups v2 and for Windows containers. + type: "integer" + format: "uint64" + x-nullable: true + example: 0 + stats: + description: | + All the stats exported via memory.stat. when using cgroups v2. + + This field is Linux-specific and omitted for Windows containers. + type: "object" + additionalProperties: + type: "integer" + format: "uint64" + x-nullable: true + example: + { + "active_anon": 1572864, + "active_file": 5115904, + "anon": 1572864, + "anon_thp": 0, + "file": 7626752, + "file_dirty": 0, + "file_mapped": 2723840, + "file_writeback": 0, + "inactive_anon": 0, + "inactive_file": 2510848, + "kernel_stack": 16384, + "pgactivate": 0, + "pgdeactivate": 0, + "pgfault": 2042, + "pglazyfree": 0, + "pglazyfreed": 0, + "pgmajfault": 45, + "pgrefill": 0, + "pgscan": 0, + "pgsteal": 0, + "shmem": 0, + "slab": 1180928, + "slab_reclaimable": 725576, + "slab_unreclaimable": 455352, + "sock": 0, + "thp_collapse_alloc": 0, + "thp_fault_alloc": 1, + "unevictable": 0, + "workingset_activate": 0, + "workingset_nodereclaim": 0, + "workingset_refault": 0 + } + failcnt: + description: | + Number of times memory usage hits limits. + + This field is Linux-specific and only supported on cgroups v1. + It is omitted when using cgroups v2 and for Windows containers. + type: "integer" + format: "uint64" + x-nullable: true + example: 0 + limit: + description: | + This field is Linux-specific and omitted for Windows containers. + type: "integer" + format: "uint64" + x-nullable: true + example: 8217579520 + commitbytes: + description: | + Committed bytes. + + This field is Windows-specific and omitted for Linux containers. + type: "integer" + format: "uint64" + x-nullable: true + example: 0 + commitpeakbytes: + description: | + Peak committed bytes. + + This field is Windows-specific and omitted for Linux containers. + type: "integer" + format: "uint64" + x-nullable: true + example: 0 + privateworkingset: + description: | + Private working set. + + This field is Windows-specific and omitted for Linux containers. + type: "integer" + format: "uint64" + x-nullable: true + example: 0 + + ContainerNetworkStats: + description: | + Aggregates the network stats of one container + type: "object" + x-go-name: "NetworkStats" + x-nullable: true + properties: + rx_bytes: + description: | + Bytes received. Windows and Linux. + type: "integer" + format: "uint64" + example: 5338 + rx_packets: + description: | + Packets received. Windows and Linux. + type: "integer" + format: "uint64" + example: 36 + rx_errors: + description: | + Received errors. Not used on Windows. + + This field is Linux-specific and always zero for Windows containers. + type: "integer" + format: "uint64" + example: 0 + rx_dropped: + description: | + Incoming packets dropped. Windows and Linux. + type: "integer" + format: "uint64" + example: 0 + tx_bytes: + description: | + Bytes sent. Windows and Linux. + type: "integer" + format: "uint64" + example: 1200 + tx_packets: + description: | + Packets sent. Windows and Linux. + type: "integer" + format: "uint64" + example: 12 + tx_errors: + description: | + Sent errors. Not used on Windows. + + This field is Linux-specific and always zero for Windows containers. + type: "integer" + format: "uint64" + example: 0 + tx_dropped: + description: | + Outgoing packets dropped. Windows and Linux. + type: "integer" + format: "uint64" + example: 0 + endpoint_id: + description: | + Endpoint ID. Not used on Linux. + + This field is Windows-specific and omitted for Linux containers. + type: "string" + x-nullable: true + instance_id: + description: | + Instance ID. Not used on Linux. + + This field is Windows-specific and omitted for Linux containers. + type: "string" + x-nullable: true + + ContainerStorageStats: + description: | + StorageStats is the disk I/O stats for read/write on Windows. + + This type is Windows-specific and omitted for Linux containers. + type: "object" + x-go-name: "StorageStats" + x-nullable: true + properties: + read_count_normalized: + type: "integer" + format: "uint64" + x-nullable: true + example: 7593984 + read_size_bytes: + type: "integer" + format: "uint64" + x-nullable: true + example: 7593984 + write_count_normalized: + type: "integer" + format: "uint64" + x-nullable: true + example: 7593984 + write_size_bytes: + type: "integer" + format: "uint64" + x-nullable: true + example: 7593984 + + ContainerTopResponse: + type: "object" + x-go-name: "TopResponse" + title: "ContainerTopResponse" + description: |- + Container "top" response. + properties: + Titles: + description: "The ps column titles" + type: "array" + items: + type: "string" + example: + Titles: + - "UID" + - "PID" + - "PPID" + - "C" + - "STIME" + - "TTY" + - "TIME" + - "CMD" + Processes: + description: |- + Each process running in the container, where each process + is an array of values corresponding to the titles. + type: "array" + items: + type: "array" + items: + type: "string" + example: + Processes: + - + - "root" + - "13642" + - "882" + - "0" + - "17:03" + - "pts/0" + - "00:00:00" + - "/bin/bash" + - + - "root" + - "13735" + - "13642" + - "0" + - "17:06" + - "pts/0" + - "00:00:00" + - "sleep 10" + + ContainerWaitResponse: + description: "OK response to ContainerWait operation" + type: "object" + x-go-name: "WaitResponse" + title: "ContainerWaitResponse" + required: [StatusCode] + properties: + StatusCode: + description: "Exit code of the container" + type: "integer" + format: "int64" + x-nullable: false + Error: + $ref: "#/definitions/ContainerWaitExitError" + + ContainerWaitExitError: + description: "container waiting error, if any" + type: "object" + x-go-name: "WaitExitError" + properties: + Message: + description: "Details of an error" + type: "string" + + SystemVersion: + type: "object" + description: | + Response of Engine API: GET "/version" + properties: + Platform: + type: "object" + required: [Name] + properties: + Name: + type: "string" + Components: + type: "array" + description: | + Information about system components + items: + type: "object" + x-go-name: ComponentVersion + required: [Name, Version] + properties: + Name: + description: | + Name of the component + type: "string" + example: "Engine" + Version: + description: | + Version of the component + type: "string" + x-nullable: false + example: "27.0.1" + Details: + description: | + Key/value pairs of strings with additional information about the + component. These values are intended for informational purposes + only, and their content is not defined, and not part of the API + specification. + + These messages can be printed by the client as information to the user. + type: "object" + x-nullable: true + Version: + description: "The version of the daemon" + type: "string" + example: "27.0.1" + ApiVersion: + description: | + The default (and highest) API version that is supported by the daemon + type: "string" + example: "1.47" + MinAPIVersion: + description: | + The minimum API version that is supported by the daemon + type: "string" + example: "1.24" + GitCommit: + description: | + The Git commit of the source code that was used to build the daemon + type: "string" + example: "48a66213fe" + GoVersion: + description: | + The version Go used to compile the daemon, and the version of the Go + runtime in use. + type: "string" + example: "go1.22.7" + Os: + description: | + The operating system that the daemon is running on ("linux" or "windows") + type: "string" + example: "linux" + Arch: + description: | + The architecture that the daemon is running on + type: "string" + example: "amd64" + KernelVersion: + description: | + The kernel version (`uname -r`) that the daemon is running on. + + This field is omitted when empty. + type: "string" + example: "6.8.0-31-generic" + Experimental: + description: | + Indicates if the daemon is started with experimental features enabled. + + This field is omitted when empty / false. + type: "boolean" + example: true + BuildTime: + description: | + The date and time that the daemon was compiled. + type: "string" + example: "2020-06-22T15:49:27.000000000+00:00" + + SystemInfo: + type: "object" + properties: + ID: + description: | + Unique identifier of the daemon. + +


+ + > **Note**: The format of the ID itself is not part of the API, and + > should not be considered stable. + type: "string" + example: "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS" + Containers: + description: "Total number of containers on the host." + type: "integer" + example: 14 + ContainersRunning: + description: | + Number of containers with status `"running"`. + type: "integer" + example: 3 + ContainersPaused: + description: | + Number of containers with status `"paused"`. + type: "integer" + example: 1 + ContainersStopped: + description: | + Number of containers with status `"stopped"`. + type: "integer" + example: 10 + Images: + description: | + Total number of images on the host. + + Both _tagged_ and _untagged_ (dangling) images are counted. + type: "integer" + example: 508 + Driver: + description: "Name of the storage driver in use." + type: "string" + example: "overlay2" + DriverStatus: + description: | + Information specific to the storage driver, provided as + "label" / "value" pairs. + + This information is provided by the storage driver, and formatted + in a way consistent with the output of `docker info` on the command + line. + +


+ + > **Note**: The information returned in this field, including the + > formatting of values and labels, should not be considered stable, + > and may change without notice. + type: "array" + items: + type: "array" + items: + type: "string" + example: + - ["Backing Filesystem", "extfs"] + - ["Supports d_type", "true"] + - ["Native Overlay Diff", "true"] + DockerRootDir: + description: | + Root directory of persistent Docker state. + + Defaults to `/var/lib/docker` on Linux, and `C:\ProgramData\docker` + on Windows. + type: "string" + example: "/var/lib/docker" + Plugins: + $ref: "#/definitions/PluginsInfo" + MemoryLimit: + description: "Indicates if the host has memory limit support enabled." + type: "boolean" + example: true + SwapLimit: + description: "Indicates if the host has memory swap limit support enabled." + type: "boolean" + example: true + KernelMemoryTCP: + description: | + Indicates if the host has kernel memory TCP limit support enabled. This + field is omitted if not supported. + + Kernel memory TCP limits are not supported when using cgroups v2, which + does not support the corresponding `memory.kmem.tcp.limit_in_bytes` cgroup. + type: "boolean" + example: true + CpuCfsPeriod: + description: | + Indicates if CPU CFS(Completely Fair Scheduler) period is supported by + the host. + type: "boolean" + example: true + CpuCfsQuota: + description: | + Indicates if CPU CFS(Completely Fair Scheduler) quota is supported by + the host. + type: "boolean" + example: true + CPUShares: + description: | + Indicates if CPU Shares limiting is supported by the host. + type: "boolean" + example: true + CPUSet: + description: | + Indicates if CPUsets (cpuset.cpus, cpuset.mems) are supported by the host. + + See [cpuset(7)](https://www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt) + type: "boolean" + example: true + PidsLimit: + description: "Indicates if the host kernel has PID limit support enabled." + type: "boolean" + example: true + OomKillDisable: + description: "Indicates if OOM killer disable is supported on the host." + type: "boolean" + IPv4Forwarding: + description: "Indicates IPv4 forwarding is enabled." + type: "boolean" + example: true + BridgeNfIptables: + description: | + Indicates if `bridge-nf-call-iptables` is available on the host when + the daemon was started. + +


+ + > **Deprecated**: netfilter module is now loaded on-demand and no longer + > during daemon startup, making this field obsolete. This field is always + > `false` and will be removed in a API v1.49. + type: "boolean" + example: false + BridgeNfIp6tables: + description: | + Indicates if `bridge-nf-call-ip6tables` is available on the host. + +


+ + > **Deprecated**: netfilter module is now loaded on-demand, and no longer + > during daemon startup, making this field obsolete. This field is always + > `false` and will be removed in a API v1.49. + type: "boolean" + example: false + Debug: + description: | + Indicates if the daemon is running in debug-mode / with debug-level + logging enabled. + type: "boolean" + example: true + NFd: + description: | + The total number of file Descriptors in use by the daemon process. + + This information is only returned if debug-mode is enabled. + type: "integer" + example: 64 + NGoroutines: + description: | + The number of goroutines that currently exist. + + This information is only returned if debug-mode is enabled. + type: "integer" + example: 174 + SystemTime: + description: | + Current system-time in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) + format with nano-seconds. + type: "string" + example: "2017-08-08T20:28:29.06202363Z" + LoggingDriver: + description: | + The logging driver to use as a default for new containers. + type: "string" + CgroupDriver: + description: | + The driver to use for managing cgroups. + type: "string" + enum: ["cgroupfs", "systemd", "none"] + default: "cgroupfs" + example: "cgroupfs" + CgroupVersion: + description: | + The version of the cgroup. + type: "string" + enum: ["1", "2"] + default: "1" + example: "1" + NEventsListener: + description: "Number of event listeners subscribed." + type: "integer" + example: 30 + KernelVersion: + description: | + Kernel version of the host. + + On Linux, this information obtained from `uname`. On Windows this + information is queried from the HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ + registry value, for example _"10.0 14393 (14393.1198.amd64fre.rs1_release_sec.170427-1353)"_. + type: "string" + example: "6.8.0-31-generic" + OperatingSystem: + description: | + Name of the host's operating system, for example: "Ubuntu 24.04 LTS" + or "Windows Server 2016 Datacenter" + type: "string" + example: "Ubuntu 24.04 LTS" + OSVersion: + description: | + Version of the host's operating system + +


+ + > **Note**: The information returned in this field, including its + > very existence, and the formatting of values, should not be considered + > stable, and may change without notice. + type: "string" + example: "24.04" + OSType: + description: | + Generic type of the operating system of the host, as returned by the + Go runtime (`GOOS`). + + Currently returned values are "linux" and "windows". A full list of + possible values can be found in the [Go documentation](https://go.dev/doc/install/source#environment). + type: "string" + example: "linux" + Architecture: + description: | + Hardware architecture of the host, as returned by the Go runtime + (`GOARCH`). + + A full list of possible values can be found in the [Go documentation](https://go.dev/doc/install/source#environment). + type: "string" + example: "x86_64" + NCPU: + description: | + The number of logical CPUs usable by the daemon. + + The number of available CPUs is checked by querying the operating + system when the daemon starts. Changes to operating system CPU + allocation after the daemon is started are not reflected. + type: "integer" + example: 4 + MemTotal: + description: | + Total amount of physical memory available on the host, in bytes. + type: "integer" + format: "int64" + example: 2095882240 + + IndexServerAddress: + description: | + Address / URL of the index server that is used for image search, + and as a default for user authentication for Docker Hub and Docker Cloud. + default: "https://index.docker.io/v1/" + type: "string" + example: "https://index.docker.io/v1/" + RegistryConfig: + $ref: "#/definitions/RegistryServiceConfig" + GenericResources: + $ref: "#/definitions/GenericResources" + HttpProxy: + description: | + HTTP-proxy configured for the daemon. This value is obtained from the + [`HTTP_PROXY`](https://www.gnu.org/software/wget/manual/html_node/Proxies.html) environment variable. + Credentials ([user info component](https://tools.ietf.org/html/rfc3986#section-3.2.1)) in the proxy URL + are masked in the API response. + + Containers do not automatically inherit this configuration. + type: "string" + example: "http://xxxxx:xxxxx@proxy.corp.example.com:8080" + HttpsProxy: + description: | + HTTPS-proxy configured for the daemon. This value is obtained from the + [`HTTPS_PROXY`](https://www.gnu.org/software/wget/manual/html_node/Proxies.html) environment variable. + Credentials ([user info component](https://tools.ietf.org/html/rfc3986#section-3.2.1)) in the proxy URL + are masked in the API response. + + Containers do not automatically inherit this configuration. + type: "string" + example: "https://xxxxx:xxxxx@proxy.corp.example.com:4443" + NoProxy: + description: | + Comma-separated list of domain extensions for which no proxy should be + used. This value is obtained from the [`NO_PROXY`](https://www.gnu.org/software/wget/manual/html_node/Proxies.html) + environment variable. + + Containers do not automatically inherit this configuration. + type: "string" + example: "*.local, 169.254/16" + Name: + description: "Hostname of the host." + type: "string" + example: "node5.corp.example.com" + Labels: + description: | + User-defined labels (key/value metadata) as set on the daemon. + +


+ + > **Note**: When part of a Swarm, nodes can both have _daemon_ labels, + > set through the daemon configuration, and _node_ labels, set from a + > manager node in the Swarm. Node labels are not included in this + > field. Node labels can be retrieved using the `/nodes/(id)` endpoint + > on a manager node in the Swarm. + type: "array" + items: + type: "string" + example: ["storage=ssd", "production"] + ExperimentalBuild: + description: | + Indicates if experimental features are enabled on the daemon. + type: "boolean" + example: true + ServerVersion: + description: | + Version string of the daemon. + type: "string" + example: "27.0.1" + Runtimes: + description: | + List of [OCI compliant](https://github.com/opencontainers/runtime-spec) + runtimes configured on the daemon. Keys hold the "name" used to + reference the runtime. + + The Docker daemon relies on an OCI compliant runtime (invoked via the + `containerd` daemon) as its interface to the Linux kernel namespaces, + cgroups, and SELinux. + + The default runtime is `runc`, and automatically configured. Additional + runtimes can be configured by the user and will be listed here. + type: "object" + additionalProperties: + $ref: "#/definitions/Runtime" + default: + runc: + path: "runc" + example: + runc: + path: "runc" + runc-master: + path: "/go/bin/runc" + custom: + path: "/usr/local/bin/my-oci-runtime" + runtimeArgs: ["--debug", "--systemd-cgroup=false"] + DefaultRuntime: + description: | + Name of the default OCI runtime that is used when starting containers. + + The default can be overridden per-container at create time. + type: "string" + default: "runc" + example: "runc" + Swarm: + $ref: "#/definitions/SwarmInfo" + LiveRestoreEnabled: + description: | + Indicates if live restore is enabled. + + If enabled, containers are kept running when the daemon is shutdown + or upon daemon start if running containers are detected. + type: "boolean" + default: false + example: false + Isolation: + description: | + Represents the isolation technology to use as a default for containers. + The supported values are platform-specific. + + If no isolation value is specified on daemon start, on Windows client, + the default is `hyperv`, and on Windows server, the default is `process`. + + This option is currently not used on other platforms. + default: "default" + type: "string" + enum: + - "default" + - "hyperv" + - "process" + - "" + InitBinary: + description: | + Name and, optional, path of the `docker-init` binary. + + If the path is omitted, the daemon searches the host's `$PATH` for the + binary and uses the first result. + type: "string" + example: "docker-init" + ContainerdCommit: + $ref: "#/definitions/Commit" + RuncCommit: + $ref: "#/definitions/Commit" + InitCommit: + $ref: "#/definitions/Commit" + SecurityOptions: + description: | + List of security features that are enabled on the daemon, such as + apparmor, seccomp, SELinux, user-namespaces (userns), rootless and + no-new-privileges. + + Additional configuration options for each security feature may + be present, and are included as a comma-separated list of key/value + pairs. + type: "array" + items: + type: "string" + example: + - "name=apparmor" + - "name=seccomp,profile=default" + - "name=selinux" + - "name=userns" + - "name=rootless" + ProductLicense: + description: | + Reports a summary of the product license on the daemon. + + If a commercial license has been applied to the daemon, information + such as number of nodes, and expiration are included. + type: "string" + example: "Community Engine" + DefaultAddressPools: + description: | + List of custom default address pools for local networks, which can be + specified in the daemon.json file or dockerd option. + + Example: a Base "10.10.0.0/16" with Size 24 will define the set of 256 + 10.10.[0-255].0/24 address pools. + type: "array" + items: + type: "object" + properties: + Base: + description: "The network address in CIDR format" + type: "string" + example: "10.10.0.0/16" + Size: + description: "The network pool size" + type: "integer" + example: "24" + FirewallBackend: + $ref: "#/definitions/FirewallInfo" + Warnings: + description: | + List of warnings / informational messages about missing features, or + issues related to the daemon configuration. + + These messages can be printed by the client as information to the user. + type: "array" + items: + type: "string" + example: + - "WARNING: No memory limit support" + CDISpecDirs: + description: | + List of directories where (Container Device Interface) CDI + specifications are located. + + These specifications define vendor-specific modifications to an OCI + runtime specification for a container being created. + + An empty list indicates that CDI device injection is disabled. + + Note that since using CDI device injection requires the daemon to have + experimental enabled. For non-experimental daemons an empty list will + always be returned. + type: "array" + items: + type: "string" + example: + - "/etc/cdi" + - "/var/run/cdi" + Containerd: + $ref: "#/definitions/ContainerdInfo" + + ContainerdInfo: + description: | + Information for connecting to the containerd instance that is used by the daemon. + This is included for debugging purposes only. + type: "object" + x-nullable: true + properties: + Address: + description: "The address of the containerd socket." + type: "string" + example: "/run/containerd/containerd.sock" + Namespaces: + description: | + The namespaces that the daemon uses for running containers and + plugins in containerd. These namespaces can be configured in the + daemon configuration, and are considered to be used exclusively + by the daemon, Tampering with the containerd instance may cause + unexpected behavior. + + As these namespaces are considered to be exclusively accessed + by the daemon, it is not recommended to change these values, + or to change them to a value that is used by other systems, + such as cri-containerd. + type: "object" + properties: + Containers: + description: | + The default containerd namespace used for containers managed + by the daemon. + + The default namespace for containers is "moby", but will be + suffixed with the `.` of the remapped `root` if + user-namespaces are enabled and the containerd image-store + is used. + type: "string" + default: "moby" + example: "moby" + Plugins: + description: | + The default containerd namespace used for plugins managed by + the daemon. + + The default namespace for plugins is "plugins.moby", but will be + suffixed with the `.` of the remapped `root` if + user-namespaces are enabled and the containerd image-store + is used. + type: "string" + default: "plugins.moby" + example: "plugins.moby" + + FirewallInfo: + description: | + Information about the daemon's firewalling configuration. + + This field is currently only used on Linux, and omitted on other platforms. + type: "object" + x-nullable: true + properties: + Driver: + description: | + The name of the firewall backend driver. + type: "string" + example: "nftables" + Info: + description: | + Information about the firewall backend, provided as + "label" / "value" pairs. + +


+ + > **Note**: The information returned in this field, including the + > formatting of values and labels, should not be considered stable, + > and may change without notice. + type: "array" + items: + type: "array" + items: + type: "string" + example: + - ["ReloadedAt", "2025-01-01T00:00:00Z"] + + # PluginsInfo is a temp struct holding Plugins name + # registered with docker daemon. It is used by Info struct + PluginsInfo: + description: | + Available plugins per type. + +


+ + > **Note**: Only unmanaged (V1) plugins are included in this list. + > V1 plugins are "lazily" loaded, and are not returned in this list + > if there is no resource using the plugin. + type: "object" + properties: + Volume: + description: "Names of available volume-drivers, and network-driver plugins." + type: "array" + items: + type: "string" + example: ["local"] + Network: + description: "Names of available network-drivers, and network-driver plugins." + type: "array" + items: + type: "string" + example: ["bridge", "host", "ipvlan", "macvlan", "null", "overlay"] + Authorization: + description: "Names of available authorization plugins." + type: "array" + items: + type: "string" + example: ["img-authz-plugin", "hbm"] + Log: + description: "Names of available logging-drivers, and logging-driver plugins." + type: "array" + items: + type: "string" + example: ["awslogs", "fluentd", "gcplogs", "gelf", "journald", "json-file", "splunk", "syslog"] + + + RegistryServiceConfig: + description: | + RegistryServiceConfig stores daemon registry services configuration. + type: "object" + x-nullable: true + properties: + InsecureRegistryCIDRs: + description: | + List of IP ranges of insecure registries, using the CIDR syntax + ([RFC 4632](https://tools.ietf.org/html/4632)). Insecure registries + accept un-encrypted (HTTP) and/or untrusted (HTTPS with certificates + from unknown CAs) communication. + + By default, local registries (`::1/128` and `127.0.0.0/8`) are configured as + insecure. All other registries are secure. Communicating with an + insecure registry is not possible if the daemon assumes that registry + is secure. + + This configuration override this behavior, insecure communication with + registries whose resolved IP address is within the subnet described by + the CIDR syntax. + + Registries can also be marked insecure by hostname. Those registries + are listed under `IndexConfigs` and have their `Secure` field set to + `false`. + + > **Warning**: Using this option can be useful when running a local + > registry, but introduces security vulnerabilities. This option + > should therefore ONLY be used for testing purposes. For increased + > security, users should add their CA to their system's list of trusted + > CAs instead of enabling this option. + type: "array" + items: + type: "string" + example: ["::1/128", "127.0.0.0/8"] + IndexConfigs: + type: "object" + additionalProperties: + $ref: "#/definitions/IndexInfo" + example: + "127.0.0.1:5000": + "Name": "127.0.0.1:5000" + "Mirrors": [] + "Secure": false + "Official": false + "[2001:db8:a0b:12f0::1]:80": + "Name": "[2001:db8:a0b:12f0::1]:80" + "Mirrors": [] + "Secure": false + "Official": false + "docker.io": + Name: "docker.io" + Mirrors: ["https://hub-mirror.corp.example.com:5000/"] + Secure: true + Official: true + "registry.internal.corp.example.com:3000": + Name: "registry.internal.corp.example.com:3000" + Mirrors: [] + Secure: false + Official: false + Mirrors: + description: | + List of registry URLs that act as a mirror for the official + (`docker.io`) registry. + + type: "array" + items: + type: "string" + example: + - "https://hub-mirror.corp.example.com:5000/" + - "https://[2001:db8:a0b:12f0::1]/" + + IndexInfo: + description: + IndexInfo contains information about a registry. + type: "object" + x-nullable: true + properties: + Name: + description: | + Name of the registry, such as "docker.io". + type: "string" + example: "docker.io" + Mirrors: + description: | + List of mirrors, expressed as URIs. + type: "array" + items: + type: "string" + example: + - "https://hub-mirror.corp.example.com:5000/" + - "https://registry-2.docker.io/" + - "https://registry-3.docker.io/" + Secure: + description: | + Indicates if the registry is part of the list of insecure + registries. + + If `false`, the registry is insecure. Insecure registries accept + un-encrypted (HTTP) and/or untrusted (HTTPS with certificates from + unknown CAs) communication. + + > **Warning**: Insecure registries can be useful when running a local + > registry. However, because its use creates security vulnerabilities + > it should ONLY be enabled for testing purposes. For increased + > security, users should add their CA to their system's list of + > trusted CAs instead of enabling this option. + type: "boolean" + example: true + Official: + description: | + Indicates whether this is an official registry (i.e., Docker Hub / docker.io) + type: "boolean" + example: true + + Runtime: + description: | + Runtime describes an [OCI compliant](https://github.com/opencontainers/runtime-spec) + runtime. + + The runtime is invoked by the daemon via the `containerd` daemon. OCI + runtimes act as an interface to the Linux kernel namespaces, cgroups, + and SELinux. + type: "object" + properties: + path: + description: | + Name and, optional, path, of the OCI executable binary. + + If the path is omitted, the daemon searches the host's `$PATH` for the + binary and uses the first result. + type: "string" + example: "/usr/local/bin/my-oci-runtime" + runtimeArgs: + description: | + List of command-line arguments to pass to the runtime when invoked. + type: "array" + x-nullable: true + items: + type: "string" + example: ["--debug", "--systemd-cgroup=false"] + status: + description: | + Information specific to the runtime. + + While this API specification does not define data provided by runtimes, + the following well-known properties may be provided by runtimes: + + `org.opencontainers.runtime-spec.features`: features structure as defined + in the [OCI Runtime Specification](https://github.com/opencontainers/runtime-spec/blob/main/features.md), + in a JSON string representation. + +


+ + > **Note**: The information returned in this field, including the + > formatting of values and labels, should not be considered stable, + > and may change without notice. + type: "object" + x-nullable: true + additionalProperties: + type: "string" + example: + "org.opencontainers.runtime-spec.features": "{\"ociVersionMin\":\"1.0.0\",\"ociVersionMax\":\"1.1.0\",\"...\":\"...\"}" + + Commit: + description: | + Commit holds the Git-commit (SHA1) that a binary was built from, as + reported in the version-string of external tools, such as `containerd`, + or `runC`. + type: "object" + properties: + ID: + description: "Actual commit ID of external tool." + type: "string" + example: "cfb82a876ecc11b5ca0977d1733adbe58599088a" + + SwarmInfo: + description: | + Represents generic information about swarm. + type: "object" + properties: + NodeID: + description: "Unique identifier of for this node in the swarm." + type: "string" + default: "" + example: "k67qz4598weg5unwwffg6z1m1" + NodeAddr: + description: | + IP address at which this node can be reached by other nodes in the + swarm. + type: "string" + default: "" + example: "10.0.0.46" + LocalNodeState: + $ref: "#/definitions/LocalNodeState" + ControlAvailable: + type: "boolean" + default: false + example: true + Error: + type: "string" + default: "" + RemoteManagers: + description: | + List of ID's and addresses of other managers in the swarm. + type: "array" + default: null + x-nullable: true + items: + $ref: "#/definitions/PeerNode" + example: + - NodeID: "71izy0goik036k48jg985xnds" + Addr: "10.0.0.158:2377" + - NodeID: "79y6h1o4gv8n120drcprv5nmc" + Addr: "10.0.0.159:2377" + - NodeID: "k67qz4598weg5unwwffg6z1m1" + Addr: "10.0.0.46:2377" + Nodes: + description: "Total number of nodes in the swarm." + type: "integer" + x-nullable: true + example: 4 + Managers: + description: "Total number of managers in the swarm." + type: "integer" + x-nullable: true + example: 3 + Cluster: + $ref: "#/definitions/ClusterInfo" + + LocalNodeState: + description: "Current local status of this node." + type: "string" + default: "" + enum: + - "" + - "inactive" + - "pending" + - "active" + - "error" + - "locked" + example: "active" + + PeerNode: + description: "Represents a peer-node in the swarm" + type: "object" + properties: + NodeID: + description: "Unique identifier of for this node in the swarm." + type: "string" + Addr: + description: | + IP address and ports at which this node can be reached. + type: "string" + + NetworkAttachmentConfig: + description: | + Specifies how a service should be attached to a particular network. + type: "object" + properties: + Target: + description: | + The target network for attachment. Must be a network name or ID. + type: "string" + Aliases: + description: | + Discoverable alternate names for the service on this network. + type: "array" + items: + type: "string" + DriverOpts: + description: | + Driver attachment options for the network target. + type: "object" + additionalProperties: + type: "string" + + EventActor: + description: | + Actor describes something that generates events, like a container, network, + or a volume. + type: "object" + properties: + ID: + description: "The ID of the object emitting the event" + type: "string" + example: "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743" + Attributes: + description: | + Various key/value attributes of the object, depending on its type. + type: "object" + additionalProperties: + type: "string" + example: + com.example.some-label: "some-label-value" + image: "alpine:latest" + name: "my-container" + + EventMessage: + description: | + EventMessage represents the information an event contains. + type: "object" + title: "SystemEventsResponse" + properties: + Type: + description: "The type of object emitting the event" + type: "string" + enum: ["builder", "config", "container", "daemon", "image", "network", "node", "plugin", "secret", "service", "volume"] + example: "container" + Action: + description: "The type of event" + type: "string" + example: "create" + Actor: + $ref: "#/definitions/EventActor" + scope: + description: | + Scope of the event. Engine events are `local` scope. Cluster (Swarm) + events are `swarm` scope. + type: "string" + enum: ["local", "swarm"] + time: + description: "Timestamp of event" + type: "integer" + format: "int64" + example: 1629574695 + timeNano: + description: "Timestamp of event, with nanosecond accuracy" + type: "integer" + format: "int64" + example: 1629574695515050031 + + OCIDescriptor: + type: "object" + x-go-name: Descriptor + description: | + A descriptor struct containing digest, media type, and size, as defined in + the [OCI Content Descriptors Specification](https://github.com/opencontainers/image-spec/blob/v1.0.1/descriptor.md). + properties: + mediaType: + description: | + The media type of the object this schema refers to. + type: "string" + example: "application/vnd.oci.image.manifest.v1+json" + digest: + description: | + The digest of the targeted content. + type: "string" + example: "sha256:c0537ff6a5218ef531ece93d4984efc99bbf3f7497c0a7726c88e2bb7584dc96" + size: + description: | + The size in bytes of the blob. + type: "integer" + format: "int64" + example: 424 + urls: + description: |- + List of URLs from which this object MAY be downloaded. + type: "array" + items: + type: "string" + format: "uri" + x-nullable: true + annotations: + description: |- + Arbitrary metadata relating to the targeted content. + type: "object" + x-nullable: true + additionalProperties: + type: "string" + example: + "com.docker.official-images.bashbrew.arch": "amd64" + "org.opencontainers.image.base.digest": "sha256:0d0ef5c914d3ea700147da1bd050c59edb8bb12ca312f3800b29d7c8087eabd8" + "org.opencontainers.image.base.name": "scratch" + "org.opencontainers.image.created": "2025-01-27T00:00:00Z" + "org.opencontainers.image.revision": "9fabb4bad5138435b01857e2fe9363e2dc5f6a79" + "org.opencontainers.image.source": "https://git.launchpad.net/cloud-images/+oci/ubuntu-base" + "org.opencontainers.image.url": "https://hub.docker.com/_/ubuntu" + "org.opencontainers.image.version": "24.04" + data: + type: string + x-nullable: true + description: |- + Data is an embedding of the targeted content. This is encoded as a base64 + string when marshalled to JSON (automatically, by encoding/json). If + present, Data can be used directly to avoid fetching the targeted content. + example: null + platform: + $ref: "#/definitions/OCIPlatform" + artifactType: + description: |- + ArtifactType is the IANA media type of this artifact. + type: "string" + x-nullable: true + example: null + + OCIPlatform: + type: "object" + x-go-name: Platform + x-nullable: true + description: | + Describes the platform which the image in the manifest runs on, as defined + in the [OCI Image Index Specification](https://github.com/opencontainers/image-spec/blob/v1.0.1/image-index.md). + properties: + architecture: + description: | + The CPU architecture, for example `amd64` or `ppc64`. + type: "string" + example: "arm" + os: + description: | + The operating system, for example `linux` or `windows`. + type: "string" + example: "windows" + os.version: + description: | + Optional field specifying the operating system version, for example on + Windows `10.0.19041.1165`. + type: "string" + example: "10.0.19041.1165" + os.features: + description: | + Optional field specifying an array of strings, each listing a required + OS feature (for example on Windows `win32k`). + type: "array" + items: + type: "string" + example: + - "win32k" + variant: + description: | + Optional field specifying a variant of the CPU, for example `v7` to + specify ARMv7 when architecture is `arm`. + type: "string" + example: "v7" + + DistributionInspect: + type: "object" + x-go-name: DistributionInspect + title: "DistributionInspectResponse" + required: [Descriptor, Platforms] + description: | + Describes the result obtained from contacting the registry to retrieve + image metadata. + properties: + Descriptor: + $ref: "#/definitions/OCIDescriptor" + Platforms: + type: "array" + description: | + An array containing all platforms supported by the image. + items: + $ref: "#/definitions/OCIPlatform" + + ClusterVolume: + type: "object" + description: | + Options and information specific to, and only present on, Swarm CSI + cluster volumes. + properties: + ID: + type: "string" + description: | + The Swarm ID of this volume. Because cluster volumes are Swarm + objects, they have an ID, unlike non-cluster volumes. This ID can + be used to refer to the Volume instead of the name. + Version: + $ref: "#/definitions/ObjectVersion" + CreatedAt: + type: "string" + format: "dateTime" + UpdatedAt: + type: "string" + format: "dateTime" + Spec: + $ref: "#/definitions/ClusterVolumeSpec" + Info: + type: "object" + description: | + Information about the global status of the volume. + properties: + CapacityBytes: + type: "integer" + format: "int64" + description: | + The capacity of the volume in bytes. A value of 0 indicates that + the capacity is unknown. + VolumeContext: + type: "object" + description: | + A map of strings to strings returned from the storage plugin when + the volume is created. + additionalProperties: + type: "string" + VolumeID: + type: "string" + description: | + The ID of the volume as returned by the CSI storage plugin. This + is distinct from the volume's ID as provided by Docker. This ID + is never used by the user when communicating with Docker to refer + to this volume. If the ID is blank, then the Volume has not been + successfully created in the plugin yet. + AccessibleTopology: + type: "array" + description: | + The topology this volume is actually accessible from. + items: + $ref: "#/definitions/Topology" + PublishStatus: + type: "array" + description: | + The status of the volume as it pertains to its publishing and use on + specific nodes + items: + type: "object" + properties: + NodeID: + type: "string" + description: | + The ID of the Swarm node the volume is published on. + State: + type: "string" + description: | + The published state of the volume. + * `pending-publish` The volume should be published to this node, but the call to the controller plugin to do so has not yet been successfully completed. + * `published` The volume is published successfully to the node. + * `pending-node-unpublish` The volume should be unpublished from the node, and the manager is awaiting confirmation from the worker that it has done so. + * `pending-controller-unpublish` The volume is successfully unpublished from the node, but has not yet been successfully unpublished on the controller. + enum: + - "pending-publish" + - "published" + - "pending-node-unpublish" + - "pending-controller-unpublish" + PublishContext: + type: "object" + description: | + A map of strings to strings returned by the CSI controller + plugin when a volume is published. + additionalProperties: + type: "string" + + ClusterVolumeSpec: + type: "object" + description: | + Cluster-specific options used to create the volume. + properties: + Group: + type: "string" + description: | + Group defines the volume group of this volume. Volumes belonging to + the same group can be referred to by group name when creating + Services. Referring to a volume by group instructs Swarm to treat + volumes in that group interchangeably for the purpose of scheduling. + Volumes with an empty string for a group technically all belong to + the same, emptystring group. + AccessMode: + type: "object" + description: | + Defines how the volume is used by tasks. + properties: + Scope: + type: "string" + description: | + The set of nodes this volume can be used on at one time. + - `single` The volume may only be scheduled to one node at a time. + - `multi` the volume may be scheduled to any supported number of nodes at a time. + default: "single" + enum: ["single", "multi"] + x-nullable: false + Sharing: + type: "string" + description: | + The number and way that different tasks can use this volume + at one time. + - `none` The volume may only be used by one task at a time. + - `readonly` The volume may be used by any number of tasks, but they all must mount the volume as readonly + - `onewriter` The volume may be used by any number of tasks, but only one may mount it as read/write. + - `all` The volume may have any number of readers and writers. + default: "none" + enum: ["none", "readonly", "onewriter", "all"] + x-nullable: false + MountVolume: + type: "object" + description: | + Options for using this volume as a Mount-type volume. + + Either MountVolume or BlockVolume, but not both, must be + present. + properties: + FsType: + type: "string" + description: | + Specifies the filesystem type for the mount volume. + Optional. + MountFlags: + type: "array" + description: | + Flags to pass when mounting the volume. Optional. + items: + type: "string" + BlockVolume: + type: "object" + description: | + Options for using this volume as a Block-type volume. + Intentionally empty. + Secrets: + type: "array" + description: | + Swarm Secrets that are passed to the CSI storage plugin when + operating on this volume. + items: + type: "object" + description: | + One cluster volume secret entry. Defines a key-value pair that + is passed to the plugin. + properties: + Key: + type: "string" + description: | + Key is the name of the key of the key-value pair passed to + the plugin. + Secret: + type: "string" + description: | + Secret is the swarm Secret object from which to read data. + This can be a Secret name or ID. The Secret data is + retrieved by swarm and used as the value of the key-value + pair passed to the plugin. + AccessibilityRequirements: + type: "object" + description: | + Requirements for the accessible topology of the volume. These + fields are optional. For an in-depth description of what these + fields mean, see the CSI specification. + properties: + Requisite: + type: "array" + description: | + A list of required topologies, at least one of which the + volume must be accessible from. + items: + $ref: "#/definitions/Topology" + Preferred: + type: "array" + description: | + A list of topologies that the volume should attempt to be + provisioned in. + items: + $ref: "#/definitions/Topology" + CapacityRange: + type: "object" + description: | + The desired capacity that the volume should be created with. If + empty, the plugin will decide the capacity. + properties: + RequiredBytes: + type: "integer" + format: "int64" + description: | + The volume must be at least this big. The value of 0 + indicates an unspecified minimum + LimitBytes: + type: "integer" + format: "int64" + description: | + The volume must not be bigger than this. The value of 0 + indicates an unspecified maximum. + Availability: + type: "string" + description: | + The availability of the volume for use in tasks. + - `active` The volume is fully available for scheduling on the cluster + - `pause` No new workloads should use the volume, but existing workloads are not stopped. + - `drain` All workloads using this volume should be stopped and rescheduled, and no new ones should be started. + default: "active" + x-nullable: false + enum: + - "active" + - "pause" + - "drain" + + Topology: + description: | + A map of topological domains to topological segments. For in depth + details, see documentation for the Topology object in the CSI + specification. + type: "object" + additionalProperties: + type: "string" + + ImageManifestSummary: + x-go-name: "ManifestSummary" + description: | + ImageManifestSummary represents a summary of an image manifest. + type: "object" + required: ["ID", "Descriptor", "Available", "Size", "Kind"] + properties: + ID: + description: | + ID is the content-addressable ID of an image and is the same as the + digest of the image manifest. + type: "string" + example: "sha256:95869fbcf224d947ace8d61d0e931d49e31bb7fc67fffbbe9c3198c33aa8e93f" + Descriptor: + $ref: "#/definitions/OCIDescriptor" + Available: + description: Indicates whether all the child content (image config, layers) is fully available locally. + type: "boolean" + example: true + Size: + type: "object" + x-nullable: false + required: ["Content", "Total"] + properties: + Total: + type: "integer" + format: "int64" + example: 8213251 + description: | + Total is the total size (in bytes) of all the locally present + data (both distributable and non-distributable) that's related to + this manifest and its children. + This equal to the sum of [Content] size AND all the sizes in the + [Size] struct present in the Kind-specific data struct. + For example, for an image kind (Kind == "image") + this would include the size of the image content and unpacked + image snapshots ([Size.Content] + [ImageData.Size.Unpacked]). + Content: + description: | + Content is the size (in bytes) of all the locally present + content in the content store (e.g. image config, layers) + referenced by this manifest and its children. + This only includes blobs in the content store. + type: "integer" + format: "int64" + example: 3987495 + Kind: + type: "string" + example: "image" + enum: + - "image" + - "attestation" + - "unknown" + description: | + The kind of the manifest. + + kind | description + -------------|----------------------------------------------------------- + image | Image manifest that can be used to start a container. + attestation | Attestation manifest produced by the Buildkit builder for a specific image manifest. + ImageData: + description: | + The image data for the image manifest. + This field is only populated when Kind is "image". + type: "object" + x-nullable: true + x-omitempty: true + required: ["Platform", "Containers", "Size", "UnpackedSize"] + properties: + Platform: + $ref: "#/definitions/OCIPlatform" + description: | + OCI platform of the image. This will be the platform specified in the + manifest descriptor from the index/manifest list. + If it's not available, it will be obtained from the image config. + Containers: + description: | + The IDs of the containers that are using this image. + type: "array" + items: + type: "string" + example: ["ede54ee1fda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c7430", "abadbce344c096744d8d6071a90d474d28af8f1034b5ea9fb03c3f4bfc6d005e"] + Size: + type: "object" + x-nullable: false + required: ["Unpacked"] + properties: + Unpacked: + type: "integer" + format: "int64" + example: 3987495 + description: | + Unpacked is the size (in bytes) of the locally unpacked + (uncompressed) image content that's directly usable by the containers + running this image. + It's independent of the distributable content - e.g. + the image might still have an unpacked data that's still used by + some container even when the distributable/compressed content is + already gone. + AttestationData: + description: | + The image data for the attestation manifest. + This field is only populated when Kind is "attestation". + type: "object" + x-nullable: true + x-omitempty: true + required: ["For"] + properties: + For: + description: | + The digest of the image manifest that this attestation is for. + type: "string" + example: "sha256:95869fbcf224d947ace8d61d0e931d49e31bb7fc67fffbbe9c3198c33aa8e93f" + +paths: + /containers/json: + get: + summary: "List containers" + description: | + Returns a list of containers. For details on the format, see the + [inspect endpoint](#operation/ContainerInspect). + + Note that it uses a different, smaller representation of a container + than inspecting a single container. For example, the list of linked + containers is not propagated . + operationId: "ContainerList" + produces: + - "application/json" + parameters: + - name: "all" + in: "query" + description: | + Return all containers. By default, only running containers are shown. + type: "boolean" + default: false + - name: "limit" + in: "query" + description: | + Return this number of most recently created containers, including + non-running ones. + type: "integer" + - name: "size" + in: "query" + description: | + Return the size of container as fields `SizeRw` and `SizeRootFs`. + type: "boolean" + default: false + - name: "filters" + in: "query" + description: | + Filters to process on the container list, encoded as JSON (a + `map[string][]string`). For example, `{"status": ["paused"]}` will + only return paused containers. + + Available filters: + + - `ancestor`=(`[:]`, ``, or ``) + - `before`=(`` or ``) + - `expose`=(`[/]`|`/[]`) + - `exited=` containers with exit code of `` + - `health`=(`starting`|`healthy`|`unhealthy`|`none`) + - `id=` a container's ID + - `isolation=`(`default`|`process`|`hyperv`) (Windows daemon only) + - `is-task=`(`true`|`false`) + - `label=key` or `label="key=value"` of a container label + - `name=` a container's name + - `network`=(`` or ``) + - `publish`=(`[/]`|`/[]`) + - `since`=(`` or ``) + - `status=`(`created`|`restarting`|`running`|`removing`|`paused`|`exited`|`dead`) + - `volume`=(`` or ``) + type: "string" + responses: + 200: + description: "no error" + schema: + type: "array" + items: + $ref: "#/definitions/ContainerSummary" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["Container"] + /containers/create: + post: + summary: "Create a container" + operationId: "ContainerCreate" + consumes: + - "application/json" + - "application/octet-stream" + produces: + - "application/json" + parameters: + - name: "name" + in: "query" + description: | + Assign the specified name to the container. Must match + `/?[a-zA-Z0-9][a-zA-Z0-9_.-]+`. + type: "string" + pattern: "^/?[a-zA-Z0-9][a-zA-Z0-9_.-]+$" + - name: "platform" + in: "query" + description: | + Platform in the format `os[/arch[/variant]]` used for image lookup. + + When specified, the daemon checks if the requested image is present + in the local image cache with the given OS and Architecture, and + otherwise returns a `404` status. + + If the option is not set, the host's native OS and Architecture are + used to look up the image in the image cache. However, if no platform + is passed and the given image does exist in the local image cache, + but its OS or architecture does not match, the container is created + with the available image, and a warning is added to the `Warnings` + field in the response, for example; + + WARNING: The requested image's platform (linux/arm64/v8) does not + match the detected host platform (linux/amd64) and no + specific platform was requested + + type: "string" + default: "" + - name: "body" + in: "body" + description: "Container to create" + schema: + allOf: + - $ref: "#/definitions/ContainerConfig" + - type: "object" + properties: + HostConfig: + $ref: "#/definitions/HostConfig" + NetworkingConfig: + $ref: "#/definitions/NetworkingConfig" + example: + Hostname: "" + Domainname: "" + User: "" + AttachStdin: false + AttachStdout: true + AttachStderr: true + Tty: false + OpenStdin: false + StdinOnce: false + Env: + - "FOO=bar" + - "BAZ=quux" + Cmd: + - "date" + Entrypoint: "" + Image: "ubuntu" + Labels: + com.example.vendor: "Acme" + com.example.license: "GPL" + com.example.version: "1.0" + Volumes: + /volumes/data: {} + WorkingDir: "" + NetworkDisabled: false + MacAddress: "12:34:56:78:9a:bc" + ExposedPorts: + 22/tcp: {} + StopSignal: "SIGTERM" + StopTimeout: 10 + HostConfig: + Binds: + - "/tmp:/tmp" + Links: + - "redis3:redis" + Memory: 0 + MemorySwap: 0 + MemoryReservation: 0 + NanoCpus: 500000 + CpuPercent: 80 + CpuShares: 512 + CpuPeriod: 100000 + CpuRealtimePeriod: 1000000 + CpuRealtimeRuntime: 10000 + CpuQuota: 50000 + CpusetCpus: "0,1" + CpusetMems: "0,1" + MaximumIOps: 0 + MaximumIOBps: 0 + BlkioWeight: 300 + BlkioWeightDevice: + - {} + BlkioDeviceReadBps: + - {} + BlkioDeviceReadIOps: + - {} + BlkioDeviceWriteBps: + - {} + BlkioDeviceWriteIOps: + - {} + DeviceRequests: + - Driver: "nvidia" + Count: -1 + DeviceIDs": ["0", "1", "GPU-fef8089b-4820-abfc-e83e-94318197576e"] + Capabilities: [["gpu", "nvidia", "compute"]] + Options: + property1: "string" + property2: "string" + MemorySwappiness: 60 + OomKillDisable: false + OomScoreAdj: 500 + PidMode: "" + PidsLimit: 0 + PortBindings: + 22/tcp: + - HostPort: "11022" + PublishAllPorts: false + Privileged: false + ReadonlyRootfs: false + Dns: + - "8.8.8.8" + DnsOptions: + - "" + DnsSearch: + - "" + VolumesFrom: + - "parent" + - "other:ro" + CapAdd: + - "NET_ADMIN" + CapDrop: + - "MKNOD" + GroupAdd: + - "newgroup" + RestartPolicy: + Name: "" + MaximumRetryCount: 0 + AutoRemove: true + NetworkMode: "bridge" + Devices: [] + Ulimits: + - {} + LogConfig: + Type: "json-file" + Config: {} + SecurityOpt: [] + StorageOpt: {} + CgroupParent: "" + VolumeDriver: "" + ShmSize: 67108864 + NetworkingConfig: + EndpointsConfig: + isolated_nw: + IPAMConfig: + IPv4Address: "172.20.30.33" + IPv6Address: "2001:db8:abcd::3033" + LinkLocalIPs: + - "169.254.34.68" + - "fe80::3468" + Links: + - "container_1" + - "container_2" + Aliases: + - "server_x" + - "server_y" + database_nw: {} + + required: true + responses: + 201: + description: "Container created successfully" + schema: + $ref: "#/definitions/ContainerCreateResponse" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "no such image" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such image: c2ada9df5af8" + 409: + description: "conflict" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["Container"] + /containers/{id}/json: + get: + summary: "Inspect a container" + description: "Return low-level information about a container." + operationId: "ContainerInspect" + produces: + - "application/json" + responses: + 200: + description: "no error" + schema: + $ref: "#/definitions/ContainerInspectResponse" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "size" + in: "query" + type: "boolean" + default: false + description: "Return the size of container as fields `SizeRw` and `SizeRootFs`" + tags: ["Container"] + /containers/{id}/top: + get: + summary: "List processes running inside a container" + description: | + On Unix systems, this is done by running the `ps` command. This endpoint + is not supported on Windows. + operationId: "ContainerTop" + responses: + 200: + description: "no error" + schema: + $ref: "#/definitions/ContainerTopResponse" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "ps_args" + in: "query" + description: "The arguments to pass to `ps`. For example, `aux`" + type: "string" + default: "-ef" + tags: ["Container"] + /containers/{id}/logs: + get: + summary: "Get container logs" + description: | + Get `stdout` and `stderr` logs from a container. + + Note: This endpoint works only for containers with the `json-file` or + `journald` logging driver. + produces: + - "application/vnd.docker.raw-stream" + - "application/vnd.docker.multiplexed-stream" + operationId: "ContainerLogs" + responses: + 200: + description: | + logs returned as a stream in response body. + For the stream format, [see the documentation for the attach endpoint](#operation/ContainerAttach). + Note that unlike the attach endpoint, the logs endpoint does not + upgrade the connection and does not set Content-Type. + schema: + type: "string" + format: "binary" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "follow" + in: "query" + description: "Keep connection after returning logs." + type: "boolean" + default: false + - name: "stdout" + in: "query" + description: "Return logs from `stdout`" + type: "boolean" + default: false + - name: "stderr" + in: "query" + description: "Return logs from `stderr`" + type: "boolean" + default: false + - name: "since" + in: "query" + description: "Only return logs since this time, as a UNIX timestamp" + type: "integer" + default: 0 + - name: "until" + in: "query" + description: "Only return logs before this time, as a UNIX timestamp" + type: "integer" + default: 0 + - name: "timestamps" + in: "query" + description: "Add timestamps to every log line" + type: "boolean" + default: false + - name: "tail" + in: "query" + description: | + Only return this number of log lines from the end of the logs. + Specify as an integer or `all` to output all log lines. + type: "string" + default: "all" + tags: ["Container"] + /containers/{id}/changes: + get: + summary: "Get changes on a container’s filesystem" + description: | + Returns which files in a container's filesystem have been added, deleted, + or modified. The `Kind` of modification can be one of: + + - `0`: Modified ("C") + - `1`: Added ("A") + - `2`: Deleted ("D") + operationId: "ContainerChanges" + produces: ["application/json"] + responses: + 200: + description: "The list of changes" + schema: + type: "array" + items: + $ref: "#/definitions/FilesystemChange" + examples: + application/json: + - Path: "/dev" + Kind: 0 + - Path: "/dev/kmsg" + Kind: 1 + - Path: "/test" + Kind: 1 + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + tags: ["Container"] + /containers/{id}/export: + get: + summary: "Export a container" + description: "Export the contents of a container as a tarball." + operationId: "ContainerExport" + produces: + - "application/octet-stream" + responses: + 200: + description: "no error" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + tags: ["Container"] + /containers/{id}/stats: + get: + summary: "Get container stats based on resource usage" + description: | + This endpoint returns a live stream of a container’s resource usage + statistics. + + The `precpu_stats` is the CPU statistic of the *previous* read, and is + used to calculate the CPU usage percentage. It is not an exact copy + of the `cpu_stats` field. + + If either `precpu_stats.online_cpus` or `cpu_stats.online_cpus` is + nil then for compatibility with older daemons the length of the + corresponding `cpu_usage.percpu_usage` array should be used. + + On a cgroup v2 host, the following fields are not set + * `blkio_stats`: all fields other than `io_service_bytes_recursive` + * `cpu_stats`: `cpu_usage.percpu_usage` + * `memory_stats`: `max_usage` and `failcnt` + Also, `memory_stats.stats` fields are incompatible with cgroup v1. + + To calculate the values shown by the `stats` command of the docker cli tool + the following formulas can be used: + * used_memory = `memory_stats.usage - memory_stats.stats.cache` + * available_memory = `memory_stats.limit` + * Memory usage % = `(used_memory / available_memory) * 100.0` + * cpu_delta = `cpu_stats.cpu_usage.total_usage - precpu_stats.cpu_usage.total_usage` + * system_cpu_delta = `cpu_stats.system_cpu_usage - precpu_stats.system_cpu_usage` + * number_cpus = `length(cpu_stats.cpu_usage.percpu_usage)` or `cpu_stats.online_cpus` + * CPU usage % = `(cpu_delta / system_cpu_delta) * number_cpus * 100.0` + operationId: "ContainerStats" + produces: ["application/json"] + responses: + 200: + description: "no error" + schema: + $ref: "#/definitions/ContainerStatsResponse" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "stream" + in: "query" + description: | + Stream the output. If false, the stats will be output once and then + it will disconnect. + type: "boolean" + default: true + - name: "one-shot" + in: "query" + description: | + Only get a single stat instead of waiting for 2 cycles. Must be used + with `stream=false`. + type: "boolean" + default: false + tags: ["Container"] + /containers/{id}/resize: + post: + summary: "Resize a container TTY" + description: "Resize the TTY for a container." + operationId: "ContainerResize" + consumes: + - "application/octet-stream" + produces: + - "text/plain" + responses: + 200: + description: "no error" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "cannot resize container" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "h" + in: "query" + required: true + description: "Height of the TTY session in characters" + type: "integer" + - name: "w" + in: "query" + required: true + description: "Width of the TTY session in characters" + type: "integer" + tags: ["Container"] + /containers/{id}/start: + post: + summary: "Start a container" + operationId: "ContainerStart" + responses: + 204: + description: "no error" + 304: + description: "container already started" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "detachKeys" + in: "query" + description: | + Override the key sequence for detaching a container. Format is a + single character `[a-Z]` or `ctrl-` where `` is one + of: `a-z`, `@`, `^`, `[`, `,` or `_`. + type: "string" + tags: ["Container"] + /containers/{id}/stop: + post: + summary: "Stop a container" + operationId: "ContainerStop" + responses: + 204: + description: "no error" + 304: + description: "container already stopped" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "signal" + in: "query" + description: | + Signal to send to the container as an integer or string (e.g. `SIGINT`). + type: "string" + - name: "t" + in: "query" + description: "Number of seconds to wait before killing the container" + type: "integer" + tags: ["Container"] + /containers/{id}/restart: + post: + summary: "Restart a container" + operationId: "ContainerRestart" + responses: + 204: + description: "no error" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "signal" + in: "query" + description: | + Signal to send to the container as an integer or string (e.g. `SIGINT`). + type: "string" + - name: "t" + in: "query" + description: "Number of seconds to wait before killing the container" + type: "integer" + tags: ["Container"] + /containers/{id}/kill: + post: + summary: "Kill a container" + description: | + Send a POSIX signal to a container, defaulting to killing to the + container. + operationId: "ContainerKill" + responses: + 204: + description: "no error" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 409: + description: "container is not running" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "Container d37cde0fe4ad63c3a7252023b2f9800282894247d145cb5933ddf6e52cc03a28 is not running" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "signal" + in: "query" + description: | + Signal to send to the container as an integer or string (e.g. `SIGINT`). + type: "string" + default: "SIGKILL" + tags: ["Container"] + /containers/{id}/update: + post: + summary: "Update a container" + description: | + Change various configuration options of a container without having to + recreate it. + operationId: "ContainerUpdate" + consumes: ["application/json"] + produces: ["application/json"] + responses: + 200: + description: "The container has been updated." + schema: + $ref: "#/definitions/ContainerUpdateResponse" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "update" + in: "body" + required: true + schema: + allOf: + - $ref: "#/definitions/Resources" + - type: "object" + properties: + RestartPolicy: + $ref: "#/definitions/RestartPolicy" + example: + BlkioWeight: 300 + CpuShares: 512 + CpuPeriod: 100000 + CpuQuota: 50000 + CpuRealtimePeriod: 1000000 + CpuRealtimeRuntime: 10000 + CpusetCpus: "0,1" + CpusetMems: "0" + Memory: 314572800 + MemorySwap: 514288000 + MemoryReservation: 209715200 + RestartPolicy: + MaximumRetryCount: 4 + Name: "on-failure" + tags: ["Container"] + /containers/{id}/rename: + post: + summary: "Rename a container" + operationId: "ContainerRename" + responses: + 204: + description: "no error" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 409: + description: "name already in use" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "name" + in: "query" + required: true + description: "New name for the container" + type: "string" + tags: ["Container"] + /containers/{id}/pause: + post: + summary: "Pause a container" + description: | + Use the freezer cgroup to suspend all processes in a container. + + Traditionally, when suspending a process the `SIGSTOP` signal is used, + which is observable by the process being suspended. With the freezer + cgroup the process is unaware, and unable to capture, that it is being + suspended, and subsequently resumed. + operationId: "ContainerPause" + responses: + 204: + description: "no error" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + tags: ["Container"] + /containers/{id}/unpause: + post: + summary: "Unpause a container" + description: "Resume a container which has been paused." + operationId: "ContainerUnpause" + responses: + 204: + description: "no error" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + tags: ["Container"] + /containers/{id}/attach: + post: + summary: "Attach to a container" + description: | + Attach to a container to read its output or send it input. You can attach + to the same container multiple times and you can reattach to containers + that have been detached. + + Either the `stream` or `logs` parameter must be `true` for this endpoint + to do anything. + + See the [documentation for the `docker attach` command](https://docs.docker.com/engine/reference/commandline/attach/) + for more details. + + ### Hijacking + + This endpoint hijacks the HTTP connection to transport `stdin`, `stdout`, + and `stderr` on the same socket. + + This is the response from the daemon for an attach request: + + ``` + HTTP/1.1 200 OK + Content-Type: application/vnd.docker.raw-stream + + [STREAM] + ``` + + After the headers and two new lines, the TCP connection can now be used + for raw, bidirectional communication between the client and server. + + To hint potential proxies about connection hijacking, the Docker client + can also optionally send connection upgrade headers. + + For example, the client sends this request to upgrade the connection: + + ``` + POST /containers/16253994b7c4/attach?stream=1&stdout=1 HTTP/1.1 + Upgrade: tcp + Connection: Upgrade + ``` + + The Docker daemon will respond with a `101 UPGRADED` response, and will + similarly follow with the raw stream: + + ``` + HTTP/1.1 101 UPGRADED + Content-Type: application/vnd.docker.raw-stream + Connection: Upgrade + Upgrade: tcp + + [STREAM] + ``` + + ### Stream format + + When the TTY setting is disabled in [`POST /containers/create`](#operation/ContainerCreate), + the HTTP Content-Type header is set to application/vnd.docker.multiplexed-stream + and the stream over the hijacked connected is multiplexed to separate out + `stdout` and `stderr`. The stream consists of a series of frames, each + containing a header and a payload. + + The header contains the information which the stream writes (`stdout` or + `stderr`). It also contains the size of the associated frame encoded in + the last four bytes (`uint32`). + + It is encoded on the first eight bytes like this: + + ```go + header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4} + ``` + + `STREAM_TYPE` can be: + + - 0: `stdin` (is written on `stdout`) + - 1: `stdout` + - 2: `stderr` + + `SIZE1, SIZE2, SIZE3, SIZE4` are the four bytes of the `uint32` size + encoded as big endian. + + Following the header is the payload, which is the specified number of + bytes of `STREAM_TYPE`. + + The simplest way to implement this protocol is the following: + + 1. Read 8 bytes. + 2. Choose `stdout` or `stderr` depending on the first byte. + 3. Extract the frame size from the last four bytes. + 4. Read the extracted size and output it on the correct output. + 5. Goto 1. + + ### Stream format when using a TTY + + When the TTY setting is enabled in [`POST /containers/create`](#operation/ContainerCreate), + the stream is not multiplexed. The data exchanged over the hijacked + connection is simply the raw data from the process PTY and client's + `stdin`. + + operationId: "ContainerAttach" + produces: + - "application/vnd.docker.raw-stream" + - "application/vnd.docker.multiplexed-stream" + responses: + 101: + description: "no error, hints proxy about hijacking" + 200: + description: "no error, no upgrade header found" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "detachKeys" + in: "query" + description: | + Override the key sequence for detaching a container.Format is a single + character `[a-Z]` or `ctrl-` where `` is one of: `a-z`, + `@`, `^`, `[`, `,` or `_`. + type: "string" + - name: "logs" + in: "query" + description: | + Replay previous logs from the container. + + This is useful for attaching to a container that has started and you + want to output everything since the container started. + + If `stream` is also enabled, once all the previous output has been + returned, it will seamlessly transition into streaming current + output. + type: "boolean" + default: false + - name: "stream" + in: "query" + description: | + Stream attached streams from the time the request was made onwards. + type: "boolean" + default: false + - name: "stdin" + in: "query" + description: "Attach to `stdin`" + type: "boolean" + default: false + - name: "stdout" + in: "query" + description: "Attach to `stdout`" + type: "boolean" + default: false + - name: "stderr" + in: "query" + description: "Attach to `stderr`" + type: "boolean" + default: false + tags: ["Container"] + /containers/{id}/attach/ws: + get: + summary: "Attach to a container via a websocket" + operationId: "ContainerAttachWebsocket" + responses: + 101: + description: "no error, hints proxy about hijacking" + 200: + description: "no error, no upgrade header found" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "detachKeys" + in: "query" + description: | + Override the key sequence for detaching a container.Format is a single + character `[a-Z]` or `ctrl-` where `` is one of: `a-z`, + `@`, `^`, `[`, `,`, or `_`. + type: "string" + - name: "logs" + in: "query" + description: "Return logs" + type: "boolean" + default: false + - name: "stream" + in: "query" + description: "Return stream" + type: "boolean" + default: false + - name: "stdin" + in: "query" + description: "Attach to `stdin`" + type: "boolean" + default: false + - name: "stdout" + in: "query" + description: "Attach to `stdout`" + type: "boolean" + default: false + - name: "stderr" + in: "query" + description: "Attach to `stderr`" + type: "boolean" + default: false + tags: ["Container"] + /containers/{id}/wait: + post: + summary: "Wait for a container" + description: "Block until a container stops, then returns the exit code." + operationId: "ContainerWait" + produces: ["application/json"] + responses: + 200: + description: "The container has exit." + schema: + $ref: "#/definitions/ContainerWaitResponse" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "condition" + in: "query" + description: | + Wait until a container state reaches the given condition. + + Defaults to `not-running` if omitted or empty. + type: "string" + enum: + - "not-running" + - "next-exit" + - "removed" + default: "not-running" + tags: ["Container"] + /containers/{id}: + delete: + summary: "Remove a container" + operationId: "ContainerDelete" + responses: + 204: + description: "no error" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 409: + description: "conflict" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: | + You cannot remove a running container: c2ada9df5af8. Stop the + container before attempting removal or force remove + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "v" + in: "query" + description: "Remove anonymous volumes associated with the container." + type: "boolean" + default: false + - name: "force" + in: "query" + description: "If the container is running, kill it before removing it." + type: "boolean" + default: false + - name: "link" + in: "query" + description: "Remove the specified link associated with the container." + type: "boolean" + default: false + tags: ["Container"] + /containers/{id}/archive: + head: + summary: "Get information about files in a container" + description: | + A response header `X-Docker-Container-Path-Stat` is returned, containing + a base64 - encoded JSON object with some filesystem header information + about the path. + operationId: "ContainerArchiveInfo" + responses: + 200: + description: "no error" + headers: + X-Docker-Container-Path-Stat: + type: "string" + description: | + A base64 - encoded JSON object with some filesystem header + information about the path + 400: + description: "Bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "Container or path does not exist" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "path" + in: "query" + required: true + description: "Resource in the container’s filesystem to archive." + type: "string" + tags: ["Container"] + get: + summary: "Get an archive of a filesystem resource in a container" + description: "Get a tar archive of a resource in the filesystem of container id." + operationId: "ContainerArchive" + produces: ["application/x-tar"] + responses: + 200: + description: "no error" + 400: + description: "Bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "Container or path does not exist" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "path" + in: "query" + required: true + description: "Resource in the container’s filesystem to archive." + type: "string" + tags: ["Container"] + put: + summary: "Extract an archive of files or folders to a directory in a container" + description: | + Upload a tar archive to be extracted to a path in the filesystem of container id. + `path` parameter is asserted to be a directory. If it exists as a file, 400 error + will be returned with message "not a directory". + operationId: "PutContainerArchive" + consumes: ["application/x-tar", "application/octet-stream"] + responses: + 200: + description: "The content was extracted successfully" + 400: + description: "Bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "not a directory" + 403: + description: "Permission denied, the volume or container rootfs is marked as read-only." + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "No such container or path does not exist inside the container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the container" + type: "string" + - name: "path" + in: "query" + required: true + description: "Path to a directory in the container to extract the archive’s contents into. " + type: "string" + - name: "noOverwriteDirNonDir" + in: "query" + description: | + If `1`, `true`, or `True` then it will be an error if unpacking the + given content would cause an existing directory to be replaced with + a non-directory and vice versa. + type: "string" + - name: "copyUIDGID" + in: "query" + description: | + If `1`, `true`, then it will copy UID/GID maps to the dest file or + dir + type: "string" + - name: "inputStream" + in: "body" + required: true + description: | + The input stream must be a tar archive compressed with one of the + following algorithms: `identity` (no compression), `gzip`, `bzip2`, + or `xz`. + schema: + type: "string" + format: "binary" + tags: ["Container"] + /containers/prune: + post: + summary: "Delete stopped containers" + produces: + - "application/json" + operationId: "ContainerPrune" + parameters: + - name: "filters" + in: "query" + description: | + Filters to process on the prune list, encoded as JSON (a `map[string][]string`). + + Available filters: + - `until=` Prune containers created before this timestamp. The `` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon machine’s time. + - `label` (`label=`, `label==`, `label!=`, or `label!==`) Prune containers with (or without, in case `label!=...` is used) the specified labels. + type: "string" + responses: + 200: + description: "No error" + schema: + type: "object" + title: "ContainerPruneResponse" + properties: + ContainersDeleted: + description: "Container IDs that were deleted" + type: "array" + items: + type: "string" + SpaceReclaimed: + description: "Disk space reclaimed in bytes" + type: "integer" + format: "int64" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["Container"] + /images/json: + get: + summary: "List Images" + description: "Returns a list of images on the server. Note that it uses a different, smaller representation of an image than inspecting a single image." + operationId: "ImageList" + produces: + - "application/json" + responses: + 200: + description: "Summary image data for the images matching the query" + schema: + type: "array" + items: + $ref: "#/definitions/ImageSummary" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "all" + in: "query" + description: "Show all images. Only images from a final layer (no children) are shown by default." + type: "boolean" + default: false + - name: "filters" + in: "query" + description: | + A JSON encoded value of the filters (a `map[string][]string`) to + process on the images list. + + Available filters: + + - `before`=(`[:]`, `` or ``) + - `dangling=true` + - `label=key` or `label="key=value"` of an image label + - `reference`=(`[:]`) + - `since`=(`[:]`, `` or ``) + - `until=` + type: "string" + - name: "shared-size" + in: "query" + description: "Compute and show shared size as a `SharedSize` field on each image." + type: "boolean" + default: false + - name: "digests" + in: "query" + description: "Show digest information as a `RepoDigests` field on each image." + type: "boolean" + default: false + - name: "manifests" + in: "query" + description: "Include `Manifests` in the image summary." + type: "boolean" + default: false + tags: ["Image"] + /build: + post: + summary: "Build an image" + description: | + Build an image from a tar archive with a `Dockerfile` in it. + + The `Dockerfile` specifies how the image is built from the tar archive. It is typically in the archive's root, but can be at a different path or have a different name by specifying the `dockerfile` parameter. [See the `Dockerfile` reference for more information](https://docs.docker.com/engine/reference/builder/). + + The Docker daemon performs a preliminary validation of the `Dockerfile` before starting the build, and returns an error if the syntax is incorrect. After that, each instruction is run one-by-one until the ID of the new image is output. + + The build is canceled if the client drops the connection by quitting or being killed. + operationId: "ImageBuild" + consumes: + - "application/octet-stream" + produces: + - "application/json" + parameters: + - name: "inputStream" + in: "body" + description: "A tar archive compressed with one of the following algorithms: identity (no compression), gzip, bzip2, xz." + schema: + type: "string" + format: "binary" + - name: "dockerfile" + in: "query" + description: "Path within the build context to the `Dockerfile`. This is ignored if `remote` is specified and points to an external `Dockerfile`." + type: "string" + default: "Dockerfile" + - name: "t" + in: "query" + description: "A name and optional tag to apply to the image in the `name:tag` format. If you omit the tag the default `latest` value is assumed. You can provide several `t` parameters." + type: "string" + - name: "extrahosts" + in: "query" + description: "Extra hosts to add to /etc/hosts" + type: "string" + - name: "remote" + in: "query" + description: "A Git repository URI or HTTP/HTTPS context URI. If the URI points to a single text file, the file’s contents are placed into a file called `Dockerfile` and the image is built from that file. If the URI points to a tarball, the file is downloaded by the daemon and the contents therein used as the context for the build. If the URI points to a tarball and the `dockerfile` parameter is also specified, there must be a file with the corresponding path inside the tarball." + type: "string" + - name: "q" + in: "query" + description: "Suppress verbose build output." + type: "boolean" + default: false + - name: "nocache" + in: "query" + description: "Do not use the cache when building the image." + type: "boolean" + default: false + - name: "cachefrom" + in: "query" + description: "JSON array of images used for build cache resolution." + type: "string" + - name: "pull" + in: "query" + description: "Attempt to pull the image even if an older image exists locally." + type: "string" + - name: "rm" + in: "query" + description: "Remove intermediate containers after a successful build." + type: "boolean" + default: true + - name: "forcerm" + in: "query" + description: "Always remove intermediate containers, even upon failure." + type: "boolean" + default: false + - name: "memory" + in: "query" + description: "Set memory limit for build." + type: "integer" + - name: "memswap" + in: "query" + description: "Total memory (memory + swap). Set as `-1` to disable swap." + type: "integer" + - name: "cpushares" + in: "query" + description: "CPU shares (relative weight)." + type: "integer" + - name: "cpusetcpus" + in: "query" + description: "CPUs in which to allow execution (e.g., `0-3`, `0,1`)." + type: "string" + - name: "cpuperiod" + in: "query" + description: "The length of a CPU period in microseconds." + type: "integer" + - name: "cpuquota" + in: "query" + description: "Microseconds of CPU time that the container can get in a CPU period." + type: "integer" + - name: "buildargs" + in: "query" + description: > + JSON map of string pairs for build-time variables. Users pass these values at build-time. Docker + uses the buildargs as the environment context for commands run via the `Dockerfile` RUN + instruction, or for variable expansion in other `Dockerfile` instructions. This is not meant for + passing secret values. + + + For example, the build arg `FOO=bar` would become `{"FOO":"bar"}` in JSON. This would result in the + query parameter `buildargs={"FOO":"bar"}`. Note that `{"FOO":"bar"}` should be URI component encoded. + + + [Read more about the buildargs instruction.](https://docs.docker.com/engine/reference/builder/#arg) + type: "string" + - name: "shmsize" + in: "query" + description: "Size of `/dev/shm` in bytes. The size must be greater than 0. If omitted the system uses 64MB." + type: "integer" + - name: "squash" + in: "query" + description: "Squash the resulting images layers into a single layer. *(Experimental release only.)*" + type: "boolean" + - name: "labels" + in: "query" + description: "Arbitrary key/value labels to set on the image, as a JSON map of string pairs." + type: "string" + - name: "networkmode" + in: "query" + description: | + Sets the networking mode for the run commands during build. Supported + standard values are: `bridge`, `host`, `none`, and `container:`. + Any other value is taken as a custom network's name or ID to which this + container should connect to. + type: "string" + - name: "Content-type" + in: "header" + type: "string" + enum: + - "application/x-tar" + default: "application/x-tar" + - name: "X-Registry-Config" + in: "header" + description: | + This is a base64-encoded JSON object with auth configurations for multiple registries that a build may refer to. + + The key is a registry URL, and the value is an auth configuration object, [as described in the authentication section](#section/Authentication). For example: + + ``` + { + "docker.example.com": { + "username": "janedoe", + "password": "hunter2" + }, + "https://index.docker.io/v1/": { + "username": "mobydock", + "password": "conta1n3rize14" + } + } + ``` + + Only the registry domain name (and port if not the default 443) are required. However, for legacy reasons, the Docker Hub registry must be specified with both a `https://` prefix and a `/v1/` suffix even though Docker will prefer to use the v2 registry API. + type: "string" + - name: "platform" + in: "query" + description: "Platform in the format os[/arch[/variant]]" + type: "string" + default: "" + - name: "target" + in: "query" + description: "Target build stage" + type: "string" + default: "" + - name: "outputs" + in: "query" + description: "BuildKit output configuration" + type: "string" + default: "" + - name: "version" + in: "query" + type: "string" + default: "1" + enum: ["1", "2"] + description: | + Version of the builder backend to use. + + - `1` is the first generation classic (deprecated) builder in the Docker daemon (default) + - `2` is [BuildKit](https://github.com/moby/buildkit) + responses: + 200: + description: "no error" + 400: + description: "Bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["Image"] + /build/prune: + post: + summary: "Delete builder cache" + produces: + - "application/json" + operationId: "BuildPrune" + parameters: + - name: "keep-storage" + in: "query" + description: | + Amount of disk space in bytes to keep for cache + + > **Deprecated**: This parameter is deprecated and has been renamed to "reserved-space". + > It is kept for backward compatibility and will be removed in API v1.49. + type: "integer" + format: "int64" + - name: "reserved-space" + in: "query" + description: "Amount of disk space in bytes to keep for cache" + type: "integer" + format: "int64" + - name: "max-used-space" + in: "query" + description: "Maximum amount of disk space allowed to keep for cache" + type: "integer" + format: "int64" + - name: "min-free-space" + in: "query" + description: "Target amount of free disk space after pruning" + type: "integer" + format: "int64" + - name: "all" + in: "query" + type: "boolean" + description: "Remove all types of build cache" + - name: "filters" + in: "query" + type: "string" + description: | + A JSON encoded value of the filters (a `map[string][]string`) to + process on the list of build cache objects. + + Available filters: + + - `until=` remove cache older than ``. The `` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon's local time. + - `id=` + - `parent=` + - `type=` + - `description=` + - `inuse` + - `shared` + - `private` + responses: + 200: + description: "No error" + schema: + type: "object" + title: "BuildPruneResponse" + properties: + CachesDeleted: + type: "array" + items: + description: "ID of build cache object" + type: "string" + SpaceReclaimed: + description: "Disk space reclaimed in bytes" + type: "integer" + format: "int64" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["Image"] + /images/create: + post: + summary: "Create an image" + description: "Pull or import an image." + operationId: "ImageCreate" + consumes: + - "text/plain" + - "application/octet-stream" + produces: + - "application/json" + responses: + 200: + description: "no error" + 404: + description: "repository does not exist or no read access" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "fromImage" + in: "query" + description: | + Name of the image to pull. If the name includes a tag or digest, specific behavior applies: + + - If only `fromImage` includes a tag, that tag is used. + - If both `fromImage` and `tag` are provided, `tag` takes precedence. + - If `fromImage` includes a digest, the image is pulled by digest, and `tag` is ignored. + - If neither a tag nor digest is specified, all tags are pulled. + type: "string" + - name: "fromSrc" + in: "query" + description: "Source to import. The value may be a URL from which the image can be retrieved or `-` to read the image from the request body. This parameter may only be used when importing an image." + type: "string" + - name: "repo" + in: "query" + description: "Repository name given to an image when it is imported. The repo may include a tag. This parameter may only be used when importing an image." + type: "string" + - name: "tag" + in: "query" + description: "Tag or digest. If empty when pulling an image, this causes all tags for the given image to be pulled." + type: "string" + - name: "message" + in: "query" + description: "Set commit message for imported image." + type: "string" + - name: "inputImage" + in: "body" + description: "Image content if the value `-` has been specified in fromSrc query parameter" + schema: + type: "string" + required: false + - name: "X-Registry-Auth" + in: "header" + description: | + A base64url-encoded auth configuration. + + Refer to the [authentication section](#section/Authentication) for + details. + type: "string" + - name: "changes" + in: "query" + description: | + Apply `Dockerfile` instructions to the image that is created, + for example: `changes=ENV DEBUG=true`. + Note that `ENV DEBUG=true` should be URI component encoded. + + Supported `Dockerfile` instructions: + `CMD`|`ENTRYPOINT`|`ENV`|`EXPOSE`|`ONBUILD`|`USER`|`VOLUME`|`WORKDIR` + type: "array" + items: + type: "string" + - name: "platform" + in: "query" + description: | + Platform in the format os[/arch[/variant]]. + + When used in combination with the `fromImage` option, the daemon checks + if the given image is present in the local image cache with the given + OS and Architecture, and otherwise attempts to pull the image. If the + option is not set, the host's native OS and Architecture are used. + If the given image does not exist in the local image cache, the daemon + attempts to pull the image with the host's native OS and Architecture. + If the given image does exists in the local image cache, but its OS or + architecture does not match, a warning is produced. + + When used with the `fromSrc` option to import an image from an archive, + this option sets the platform information for the imported image. If + the option is not set, the host's native OS and Architecture are used + for the imported image. + type: "string" + default: "" + tags: ["Image"] + /images/{name}/json: + get: + summary: "Inspect an image" + description: "Return low-level information about an image." + operationId: "ImageInspect" + produces: + - "application/json" + responses: + 200: + description: "No error" + schema: + $ref: "#/definitions/ImageInspect" + 404: + description: "No such image" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such image: someimage (tag: latest)" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + description: "Image name or id" + type: "string" + required: true + - name: "manifests" + in: "query" + description: "Include Manifests in the image summary." + type: "boolean" + default: false + required: false + tags: ["Image"] + /images/{name}/history: + get: + summary: "Get the history of an image" + description: "Return parent layers of an image." + operationId: "ImageHistory" + produces: ["application/json"] + responses: + 200: + description: "List of image layers" + schema: + type: "array" + items: + type: "object" + x-go-name: HistoryResponseItem + title: "HistoryResponseItem" + description: "individual image layer information in response to ImageHistory operation" + required: [Id, Created, CreatedBy, Tags, Size, Comment] + properties: + Id: + type: "string" + x-nullable: false + Created: + type: "integer" + format: "int64" + x-nullable: false + CreatedBy: + type: "string" + x-nullable: false + Tags: + type: "array" + items: + type: "string" + Size: + type: "integer" + format: "int64" + x-nullable: false + Comment: + type: "string" + x-nullable: false + examples: + application/json: + - Id: "3db9c44f45209632d6050b35958829c3a2aa256d81b9a7be45b362ff85c54710" + Created: 1398108230 + CreatedBy: "/bin/sh -c #(nop) ADD file:eb15dbd63394e063b805a3c32ca7bf0266ef64676d5a6fab4801f2e81e2a5148 in /" + Tags: + - "ubuntu:lucid" + - "ubuntu:10.04" + Size: 182964289 + Comment: "" + - Id: "6cfa4d1f33fb861d4d114f43b25abd0ac737509268065cdfd69d544a59c85ab8" + Created: 1398108222 + CreatedBy: "/bin/sh -c #(nop) MAINTAINER Tianon Gravi - mkimage-debootstrap.sh -i iproute,iputils-ping,ubuntu-minimal -t lucid.tar.xz lucid http://archive.ubuntu.com/ubuntu/" + Tags: [] + Size: 0 + Comment: "" + - Id: "511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158" + Created: 1371157430 + CreatedBy: "" + Tags: + - "scratch12:latest" + - "scratch:latest" + Size: 0 + Comment: "Imported from -" + 404: + description: "No such image" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + description: "Image name or ID" + type: "string" + required: true + - name: "platform" + type: "string" + in: "query" + description: | + JSON-encoded OCI platform to select the platform-variant. + If omitted, it defaults to any locally available platform, + prioritizing the daemon's host platform. + + If the daemon provides a multi-platform image store, this selects + the platform-variant to show the history for. If the image is + a single-platform image, or if the multi-platform image does not + provide a variant matching the given platform, an error is returned. + + Example: `{"os": "linux", "architecture": "arm", "variant": "v5"}` + tags: ["Image"] + /images/{name}/push: + post: + summary: "Push an image" + description: | + Push an image to a registry. + + If you wish to push an image on to a private registry, that image must + already have a tag which references the registry. For example, + `registry.example.com/myimage:latest`. + + The push is cancelled if the HTTP connection is closed. + operationId: "ImagePush" + consumes: + - "application/octet-stream" + responses: + 200: + description: "No error" + 404: + description: "No such image" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + description: | + Name of the image to push. For example, `registry.example.com/myimage`. + The image must be present in the local image store with the same name. + + The name should be provided without tag; if a tag is provided, it + is ignored. For example, `registry.example.com/myimage:latest` is + considered equivalent to `registry.example.com/myimage`. + + Use the `tag` parameter to specify the tag to push. + type: "string" + required: true + - name: "tag" + in: "query" + description: | + Tag of the image to push. For example, `latest`. If no tag is provided, + all tags of the given image that are present in the local image store + are pushed. + type: "string" + - name: "platform" + type: "string" + in: "query" + description: | + JSON-encoded OCI platform to select the platform-variant to push. + If not provided, all available variants will attempt to be pushed. + + If the daemon provides a multi-platform image store, this selects + the platform-variant to push to the registry. If the image is + a single-platform image, or if the multi-platform image does not + provide a variant matching the given platform, an error is returned. + + Example: `{"os": "linux", "architecture": "arm", "variant": "v5"}` + - name: "X-Registry-Auth" + in: "header" + description: | + A base64url-encoded auth configuration. + + Refer to the [authentication section](#section/Authentication) for + details. + type: "string" + required: true + tags: ["Image"] + /images/{name}/tag: + post: + summary: "Tag an image" + description: "Tag an image so that it becomes part of a repository." + operationId: "ImageTag" + responses: + 201: + description: "No error" + 400: + description: "Bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "No such image" + schema: + $ref: "#/definitions/ErrorResponse" + 409: + description: "Conflict" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + description: "Image name or ID to tag." + type: "string" + required: true + - name: "repo" + in: "query" + description: "The repository to tag in. For example, `someuser/someimage`." + type: "string" + - name: "tag" + in: "query" + description: "The name of the new tag." + type: "string" + tags: ["Image"] + /images/{name}: + delete: + summary: "Remove an image" + description: | + Remove an image, along with any untagged parent images that were + referenced by that image. + + Images can't be removed if they have descendant images, are being + used by a running container or are being used by a build. + operationId: "ImageDelete" + produces: ["application/json"] + responses: + 200: + description: "The image was deleted successfully" + schema: + type: "array" + items: + $ref: "#/definitions/ImageDeleteResponseItem" + examples: + application/json: + - Untagged: "3e2f21a89f" + - Deleted: "3e2f21a89f" + - Deleted: "53b4f83ac9" + 404: + description: "No such image" + schema: + $ref: "#/definitions/ErrorResponse" + 409: + description: "Conflict" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + description: "Image name or ID" + type: "string" + required: true + - name: "force" + in: "query" + description: "Remove the image even if it is being used by stopped containers or has other tags" + type: "boolean" + default: false + - name: "noprune" + in: "query" + description: "Do not delete untagged parent images" + type: "boolean" + default: false + tags: ["Image"] + /images/search: + get: + summary: "Search images" + description: "Search for an image on Docker Hub." + operationId: "ImageSearch" + produces: + - "application/json" + responses: + 200: + description: "No error" + schema: + type: "array" + items: + type: "object" + title: "ImageSearchResponseItem" + properties: + description: + type: "string" + is_official: + type: "boolean" + is_automated: + description: | + Whether this repository has automated builds enabled. + +


+ + > **Deprecated**: This field is deprecated and will always be "false". + type: "boolean" + example: false + name: + type: "string" + star_count: + type: "integer" + examples: + application/json: + - description: "A minimal Docker image based on Alpine Linux with a complete package index and only 5 MB in size!" + is_official: true + is_automated: false + name: "alpine" + star_count: 10093 + - description: "Busybox base image." + is_official: true + is_automated: false + name: "Busybox base image." + star_count: 3037 + - description: "The PostgreSQL object-relational database system provides reliability and data integrity." + is_official: true + is_automated: false + name: "postgres" + star_count: 12408 + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "term" + in: "query" + description: "Term to search" + type: "string" + required: true + - name: "limit" + in: "query" + description: "Maximum number of results to return" + type: "integer" + - name: "filters" + in: "query" + description: | + A JSON encoded value of the filters (a `map[string][]string`) to process on the images list. Available filters: + + - `is-official=(true|false)` + - `stars=` Matches images that has at least 'number' stars. + type: "string" + tags: ["Image"] + /images/prune: + post: + summary: "Delete unused images" + produces: + - "application/json" + operationId: "ImagePrune" + parameters: + - name: "filters" + in: "query" + description: | + Filters to process on the prune list, encoded as JSON (a `map[string][]string`). Available filters: + + - `dangling=` When set to `true` (or `1`), prune only + unused *and* untagged images. When set to `false` + (or `0`), all unused images are pruned. + - `until=` Prune images created before this timestamp. The `` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon machine’s time. + - `label` (`label=`, `label==`, `label!=`, or `label!==`) Prune images with (or without, in case `label!=...` is used) the specified labels. + type: "string" + responses: + 200: + description: "No error" + schema: + type: "object" + title: "ImagePruneResponse" + properties: + ImagesDeleted: + description: "Images that were deleted" + type: "array" + items: + $ref: "#/definitions/ImageDeleteResponseItem" + SpaceReclaimed: + description: "Disk space reclaimed in bytes" + type: "integer" + format: "int64" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["Image"] + /auth: + post: + summary: "Check auth configuration" + description: | + Validate credentials for a registry and, if available, get an identity + token for accessing the registry without password. + operationId: "SystemAuth" + consumes: ["application/json"] + produces: ["application/json"] + responses: + 200: + description: "An identity token was generated successfully." + schema: + type: "object" + title: "SystemAuthResponse" + required: [Status] + properties: + Status: + description: "The status of the authentication" + type: "string" + x-nullable: false + IdentityToken: + description: "An opaque token used to authenticate a user after a successful login" + type: "string" + x-nullable: false + examples: + application/json: + Status: "Login Succeeded" + IdentityToken: "9cbaf023786cd7..." + 204: + description: "No error" + 401: + description: "Auth error" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "authConfig" + in: "body" + description: "Authentication to check" + schema: + $ref: "#/definitions/AuthConfig" + tags: ["System"] + /info: + get: + summary: "Get system information" + operationId: "SystemInfo" + produces: + - "application/json" + responses: + 200: + description: "No error" + schema: + $ref: "#/definitions/SystemInfo" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["System"] + /version: + get: + summary: "Get version" + description: "Returns the version of Docker that is running and various information about the system that Docker is running on." + operationId: "SystemVersion" + produces: ["application/json"] + responses: + 200: + description: "no error" + schema: + $ref: "#/definitions/SystemVersion" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["System"] + /_ping: + get: + summary: "Ping" + description: "This is a dummy endpoint you can use to test if the server is accessible." + operationId: "SystemPing" + produces: ["text/plain"] + responses: + 200: + description: "no error" + schema: + type: "string" + example: "OK" + headers: + Api-Version: + type: "string" + description: "Max API Version the server supports" + Builder-Version: + type: "string" + description: | + Default version of docker image builder + + The default on Linux is version "2" (BuildKit), but the daemon + can be configured to recommend version "1" (classic Builder). + Windows does not yet support BuildKit for native Windows images, + and uses "1" (classic builder) as a default. + + This value is a recommendation as advertised by the daemon, and + it is up to the client to choose which builder to use. + default: "2" + Docker-Experimental: + type: "boolean" + description: "If the server is running with experimental mode enabled" + Swarm: + type: "string" + enum: ["inactive", "pending", "error", "locked", "active/worker", "active/manager"] + description: | + Contains information about Swarm status of the daemon, + and if the daemon is acting as a manager or worker node. + default: "inactive" + Cache-Control: + type: "string" + default: "no-cache, no-store, must-revalidate" + Pragma: + type: "string" + default: "no-cache" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + headers: + Cache-Control: + type: "string" + default: "no-cache, no-store, must-revalidate" + Pragma: + type: "string" + default: "no-cache" + tags: ["System"] + head: + summary: "Ping" + description: "This is a dummy endpoint you can use to test if the server is accessible." + operationId: "SystemPingHead" + produces: ["text/plain"] + responses: + 200: + description: "no error" + schema: + type: "string" + example: "(empty)" + headers: + Api-Version: + type: "string" + description: "Max API Version the server supports" + Builder-Version: + type: "string" + description: "Default version of docker image builder" + Docker-Experimental: + type: "boolean" + description: "If the server is running with experimental mode enabled" + Swarm: + type: "string" + enum: ["inactive", "pending", "error", "locked", "active/worker", "active/manager"] + description: | + Contains information about Swarm status of the daemon, + and if the daemon is acting as a manager or worker node. + default: "inactive" + Cache-Control: + type: "string" + default: "no-cache, no-store, must-revalidate" + Pragma: + type: "string" + default: "no-cache" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["System"] + /commit: + post: + summary: "Create a new image from a container" + operationId: "ImageCommit" + consumes: + - "application/json" + produces: + - "application/json" + responses: + 201: + description: "no error" + schema: + $ref: "#/definitions/IDResponse" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "containerConfig" + in: "body" + description: "The container configuration" + schema: + $ref: "#/definitions/ContainerConfig" + - name: "container" + in: "query" + description: "The ID or name of the container to commit" + type: "string" + - name: "repo" + in: "query" + description: "Repository name for the created image" + type: "string" + - name: "tag" + in: "query" + description: "Tag name for the create image" + type: "string" + - name: "comment" + in: "query" + description: "Commit message" + type: "string" + - name: "author" + in: "query" + description: "Author of the image (e.g., `John Hannibal Smith `)" + type: "string" + - name: "pause" + in: "query" + description: "Whether to pause the container before committing" + type: "boolean" + default: true + - name: "changes" + in: "query" + description: "`Dockerfile` instructions to apply while committing" + type: "string" + tags: ["Image"] + /events: + get: + summary: "Monitor events" + description: | + Stream real-time events from the server. + + Various objects within Docker report events when something happens to them. + + Containers report these events: `attach`, `commit`, `copy`, `create`, `destroy`, `detach`, `die`, `exec_create`, `exec_detach`, `exec_start`, `exec_die`, `export`, `health_status`, `kill`, `oom`, `pause`, `rename`, `resize`, `restart`, `start`, `stop`, `top`, `unpause`, `update`, and `prune` + + Images report these events: `create`, `delete`, `import`, `load`, `pull`, `push`, `save`, `tag`, `untag`, and `prune` + + Volumes report these events: `create`, `mount`, `unmount`, `destroy`, and `prune` + + Networks report these events: `create`, `connect`, `disconnect`, `destroy`, `update`, `remove`, and `prune` + + The Docker daemon reports these events: `reload` + + Services report these events: `create`, `update`, and `remove` + + Nodes report these events: `create`, `update`, and `remove` + + Secrets report these events: `create`, `update`, and `remove` + + Configs report these events: `create`, `update`, and `remove` + + The Builder reports `prune` events + + operationId: "SystemEvents" + produces: + - "application/json" + responses: + 200: + description: "no error" + schema: + $ref: "#/definitions/EventMessage" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "since" + in: "query" + description: "Show events created since this timestamp then stream new events." + type: "string" + - name: "until" + in: "query" + description: "Show events created until this timestamp then stop streaming." + type: "string" + - name: "filters" + in: "query" + description: | + A JSON encoded value of filters (a `map[string][]string`) to process on the event list. Available filters: + + - `config=` config name or ID + - `container=` container name or ID + - `daemon=` daemon name or ID + - `event=` event type + - `image=` image name or ID + - `label=` image or container label + - `network=` network name or ID + - `node=` node ID + - `plugin`= plugin name or ID + - `scope`= local or swarm + - `secret=` secret name or ID + - `service=` service name or ID + - `type=` object to filter by, one of `container`, `image`, `volume`, `network`, `daemon`, `plugin`, `node`, `service`, `secret` or `config` + - `volume=` volume name + type: "string" + tags: ["System"] + /system/df: + get: + summary: "Get data usage information" + operationId: "SystemDataUsage" + responses: + 200: + description: "no error" + schema: + type: "object" + title: "SystemDataUsageResponse" + properties: + LayersSize: + type: "integer" + format: "int64" + Images: + type: "array" + items: + $ref: "#/definitions/ImageSummary" + Containers: + type: "array" + items: + $ref: "#/definitions/ContainerSummary" + Volumes: + type: "array" + items: + $ref: "#/definitions/Volume" + BuildCache: + type: "array" + items: + $ref: "#/definitions/BuildCache" + example: + LayersSize: 1092588 + Images: + - + Id: "sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749" + ParentId: "" + RepoTags: + - "busybox:latest" + RepoDigests: + - "busybox@sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6" + Created: 1466724217 + Size: 1092588 + SharedSize: 0 + Labels: {} + Containers: 1 + Containers: + - + Id: "e575172ed11dc01bfce087fb27bee502db149e1a0fad7c296ad300bbff178148" + Names: + - "/top" + Image: "busybox" + ImageID: "sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749" + Command: "top" + Created: 1472592424 + Ports: [] + SizeRootFs: 1092588 + Labels: {} + State: "exited" + Status: "Exited (0) 56 minutes ago" + HostConfig: + NetworkMode: "default" + NetworkSettings: + Networks: + bridge: + IPAMConfig: null + Links: null + Aliases: null + NetworkID: "d687bc59335f0e5c9ee8193e5612e8aee000c8c62ea170cfb99c098f95899d92" + EndpointID: "8ed5115aeaad9abb174f68dcf135b49f11daf597678315231a32ca28441dec6a" + Gateway: "172.18.0.1" + IPAddress: "172.18.0.2" + IPPrefixLen: 16 + IPv6Gateway: "" + GlobalIPv6Address: "" + GlobalIPv6PrefixLen: 0 + MacAddress: "02:42:ac:12:00:02" + Mounts: [] + Volumes: + - + Name: "my-volume" + Driver: "local" + Mountpoint: "/var/lib/docker/volumes/my-volume/_data" + Labels: null + Scope: "local" + Options: null + UsageData: + Size: 10920104 + RefCount: 2 + BuildCache: + - + ID: "hw53o5aio51xtltp5xjp8v7fx" + Parents: [] + Type: "regular" + Description: "pulled from docker.io/library/debian@sha256:234cb88d3020898631af0ccbbcca9a66ae7306ecd30c9720690858c1b007d2a0" + InUse: false + Shared: true + Size: 0 + CreatedAt: "2021-06-28T13:31:01.474619385Z" + LastUsedAt: "2021-07-07T22:02:32.738075951Z" + UsageCount: 26 + - + ID: "ndlpt0hhvkqcdfkputsk4cq9c" + Parents: ["ndlpt0hhvkqcdfkputsk4cq9c"] + Type: "regular" + Description: "mount / from exec /bin/sh -c echo 'Binary::apt::APT::Keep-Downloaded-Packages \"true\";' > /etc/apt/apt.conf.d/keep-cache" + InUse: false + Shared: true + Size: 51 + CreatedAt: "2021-06-28T13:31:03.002625487Z" + LastUsedAt: "2021-07-07T22:02:32.773909517Z" + UsageCount: 26 + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "type" + in: "query" + description: | + Object types, for which to compute and return data. + type: "array" + collectionFormat: multi + items: + type: "string" + enum: ["container", "image", "volume", "build-cache"] + tags: ["System"] + /images/{name}/get: + get: + summary: "Export an image" + description: | + Get a tarball containing all images and metadata for a repository. + + If `name` is a specific name and tag (e.g. `ubuntu:latest`), then only that image (and its parents) are returned. If `name` is an image ID, similarly only that image (and its parents) are returned, but with the exclusion of the `repositories` file in the tarball, as there were no image names referenced. + + ### Image tarball format + + An image tarball contains [Content as defined in the OCI Image Layout Specification](https://github.com/opencontainers/image-spec/blob/v1.1.1/image-layout.md#content). + + Additionally, includes the manifest.json file associated with a backwards compatible docker save format. + + If the tarball defines a repository, the tarball should also include a `repositories` file at the root that contains a list of repository and tag names mapped to layer IDs. + + ```json + { + "hello-world": { + "latest": "565a9d68a73f6706862bfe8409a7f659776d4d60a8d096eb4a3cbce6999cc2a1" + } + } + ``` + operationId: "ImageGet" + produces: + - "application/x-tar" + responses: + 200: + description: "no error" + schema: + type: "string" + format: "binary" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + description: "Image name or ID" + type: "string" + required: true + - name: "platform" + type: "string" + in: "query" + description: | + JSON encoded OCI platform describing a platform which will be used + to select a platform-specific image to be saved if the image is + multi-platform. + If not provided, the full multi-platform image will be saved. + + Example: `{"os": "linux", "architecture": "arm", "variant": "v5"}` + tags: ["Image"] + /images/get: + get: + summary: "Export several images" + description: | + Get a tarball containing all images and metadata for several image + repositories. + + For each value of the `names` parameter: if it is a specific name and + tag (e.g. `ubuntu:latest`), then only that image (and its parents) are + returned; if it is an image ID, similarly only that image (and its parents) + are returned and there would be no names referenced in the 'repositories' + file for this image ID. + + For details on the format, see the [export image endpoint](#operation/ImageGet). + operationId: "ImageGetAll" + produces: + - "application/x-tar" + responses: + 200: + description: "no error" + schema: + type: "string" + format: "binary" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "names" + in: "query" + description: "Image names to filter by" + type: "array" + items: + type: "string" + - name: "platform" + type: "string" + in: "query" + description: | + JSON encoded OCI platform describing a platform which will be used + to select a platform-specific image to be saved if the image is + multi-platform. + If not provided, the full multi-platform image will be saved. + + Example: `{"os": "linux", "architecture": "arm", "variant": "v5"}` + tags: ["Image"] + /images/load: + post: + summary: "Import images" + description: | + Load a set of images and tags into a repository. + + For details on the format, see the [export image endpoint](#operation/ImageGet). + operationId: "ImageLoad" + consumes: + - "application/x-tar" + produces: + - "application/json" + responses: + 200: + description: "no error" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "imagesTarball" + in: "body" + description: "Tar archive containing images" + schema: + type: "string" + format: "binary" + - name: "quiet" + in: "query" + description: "Suppress progress details during load." + type: "boolean" + default: false + - name: "platform" + type: "string" + in: "query" + description: | + JSON encoded OCI platform describing a platform which will be used + to select a platform-specific image to be load if the image is + multi-platform. + If not provided, the full multi-platform image will be loaded. + + Example: `{"os": "linux", "architecture": "arm", "variant": "v5"}` + tags: ["Image"] + /containers/{id}/exec: + post: + summary: "Create an exec instance" + description: "Run a command inside a running container." + operationId: "ContainerExec" + consumes: + - "application/json" + produces: + - "application/json" + responses: + 201: + description: "no error" + schema: + $ref: "#/definitions/IDResponse" + 404: + description: "no such container" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such container: c2ada9df5af8" + 409: + description: "container is paused" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "execConfig" + in: "body" + description: "Exec configuration" + schema: + type: "object" + title: "ExecConfig" + properties: + AttachStdin: + type: "boolean" + description: "Attach to `stdin` of the exec command." + AttachStdout: + type: "boolean" + description: "Attach to `stdout` of the exec command." + AttachStderr: + type: "boolean" + description: "Attach to `stderr` of the exec command." + ConsoleSize: + type: "array" + description: "Initial console size, as an `[height, width]` array." + x-nullable: true + minItems: 2 + maxItems: 2 + items: + type: "integer" + minimum: 0 + example: [80, 64] + DetachKeys: + type: "string" + description: | + Override the key sequence for detaching a container. Format is + a single character `[a-Z]` or `ctrl-` where `` + is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. + Tty: + type: "boolean" + description: "Allocate a pseudo-TTY." + Env: + description: | + A list of environment variables in the form `["VAR=value", ...]`. + type: "array" + items: + type: "string" + Cmd: + type: "array" + description: "Command to run, as a string or array of strings." + items: + type: "string" + Privileged: + type: "boolean" + description: "Runs the exec process with extended privileges." + default: false + User: + type: "string" + description: | + The user, and optionally, group to run the exec process inside + the container. Format is one of: `user`, `user:group`, `uid`, + or `uid:gid`. + WorkingDir: + type: "string" + description: | + The working directory for the exec process inside the container. + example: + AttachStdin: false + AttachStdout: true + AttachStderr: true + DetachKeys: "ctrl-p,ctrl-q" + Tty: false + Cmd: + - "date" + Env: + - "FOO=bar" + - "BAZ=quux" + required: true + - name: "id" + in: "path" + description: "ID or name of container" + type: "string" + required: true + tags: ["Exec"] + /exec/{id}/start: + post: + summary: "Start an exec instance" + description: | + Starts a previously set up exec instance. If detach is true, this endpoint + returns immediately after starting the command. Otherwise, it sets up an + interactive session with the command. + operationId: "ExecStart" + consumes: + - "application/json" + produces: + - "application/vnd.docker.raw-stream" + - "application/vnd.docker.multiplexed-stream" + responses: + 200: + description: "No error" + 404: + description: "No such exec instance" + schema: + $ref: "#/definitions/ErrorResponse" + 409: + description: "Container is stopped or paused" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "execStartConfig" + in: "body" + schema: + type: "object" + title: "ExecStartConfig" + properties: + Detach: + type: "boolean" + description: "Detach from the command." + example: false + Tty: + type: "boolean" + description: "Allocate a pseudo-TTY." + example: true + ConsoleSize: + type: "array" + description: "Initial console size, as an `[height, width]` array." + x-nullable: true + minItems: 2 + maxItems: 2 + items: + type: "integer" + minimum: 0 + example: [80, 64] + - name: "id" + in: "path" + description: "Exec instance ID" + required: true + type: "string" + tags: ["Exec"] + /exec/{id}/resize: + post: + summary: "Resize an exec instance" + description: | + Resize the TTY session used by an exec instance. This endpoint only works + if `tty` was specified as part of creating and starting the exec instance. + operationId: "ExecResize" + responses: + 200: + description: "No error" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "No such exec instance" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "Exec instance ID" + required: true + type: "string" + - name: "h" + in: "query" + required: true + description: "Height of the TTY session in characters" + type: "integer" + - name: "w" + in: "query" + required: true + description: "Width of the TTY session in characters" + type: "integer" + tags: ["Exec"] + /exec/{id}/json: + get: + summary: "Inspect an exec instance" + description: "Return low-level information about an exec instance." + operationId: "ExecInspect" + produces: + - "application/json" + responses: + 200: + description: "No error" + schema: + type: "object" + title: "ExecInspectResponse" + properties: + CanRemove: + type: "boolean" + DetachKeys: + type: "string" + ID: + type: "string" + Running: + type: "boolean" + ExitCode: + type: "integer" + ProcessConfig: + $ref: "#/definitions/ProcessConfig" + OpenStdin: + type: "boolean" + OpenStderr: + type: "boolean" + OpenStdout: + type: "boolean" + ContainerID: + type: "string" + Pid: + type: "integer" + description: "The system process ID for the exec process." + examples: + application/json: + CanRemove: false + ContainerID: "b53ee82b53a40c7dca428523e34f741f3abc51d9f297a14ff874bf761b995126" + DetachKeys: "" + ExitCode: 2 + ID: "f33bbfb39f5b142420f4759b2348913bd4a8d1a6d7fd56499cb41a1bb91d7b3b" + OpenStderr: true + OpenStdin: true + OpenStdout: true + ProcessConfig: + arguments: + - "-c" + - "exit 2" + entrypoint: "sh" + privileged: false + tty: true + user: "1000" + Running: false + Pid: 42000 + 404: + description: "No such exec instance" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "Exec instance ID" + required: true + type: "string" + tags: ["Exec"] + + /volumes: + get: + summary: "List volumes" + operationId: "VolumeList" + produces: ["application/json"] + responses: + 200: + description: "Summary volume data that matches the query" + schema: + $ref: "#/definitions/VolumeListResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "filters" + in: "query" + description: | + JSON encoded value of the filters (a `map[string][]string`) to + process on the volumes list. Available filters: + + - `dangling=` When set to `true` (or `1`), returns all + volumes that are not in use by a container. When set to `false` + (or `0`), only volumes that are in use by one or more + containers are returned. + - `driver=` Matches volumes based on their driver. + - `label=` or `label=:` Matches volumes based on + the presence of a `label` alone or a `label` and a value. + - `name=` Matches all or part of a volume name. + type: "string" + format: "json" + tags: ["Volume"] + + /volumes/create: + post: + summary: "Create a volume" + operationId: "VolumeCreate" + consumes: ["application/json"] + produces: ["application/json"] + responses: + 201: + description: "The volume was created successfully" + schema: + $ref: "#/definitions/Volume" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "volumeConfig" + in: "body" + required: true + description: "Volume configuration" + schema: + $ref: "#/definitions/VolumeCreateOptions" + tags: ["Volume"] + + /volumes/{name}: + get: + summary: "Inspect a volume" + operationId: "VolumeInspect" + produces: ["application/json"] + responses: + 200: + description: "No error" + schema: + $ref: "#/definitions/Volume" + 404: + description: "No such volume" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + required: true + description: "Volume name or ID" + type: "string" + tags: ["Volume"] + + put: + summary: | + "Update a volume. Valid only for Swarm cluster volumes" + operationId: "VolumeUpdate" + consumes: ["application/json"] + produces: ["application/json"] + responses: + 200: + description: "no error" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "no such volume" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + description: "The name or ID of the volume" + type: "string" + required: true + - name: "body" + in: "body" + schema: + # though the schema for is an object that contains only a + # ClusterVolumeSpec, wrapping the ClusterVolumeSpec in this object + # means that if, later on, we support things like changing the + # labels, we can do so without duplicating that information to the + # ClusterVolumeSpec. + type: "object" + description: "Volume configuration" + properties: + Spec: + $ref: "#/definitions/ClusterVolumeSpec" + description: | + The spec of the volume to update. Currently, only Availability may + change. All other fields must remain unchanged. + - name: "version" + in: "query" + description: | + The version number of the volume being updated. This is required to + avoid conflicting writes. Found in the volume's `ClusterVolume` + field. + type: "integer" + format: "int64" + required: true + tags: ["Volume"] + + delete: + summary: "Remove a volume" + description: "Instruct the driver to remove the volume." + operationId: "VolumeDelete" + responses: + 204: + description: "The volume was removed" + 404: + description: "No such volume or volume driver" + schema: + $ref: "#/definitions/ErrorResponse" + 409: + description: "Volume is in use and cannot be removed" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + required: true + description: "Volume name or ID" + type: "string" + - name: "force" + in: "query" + description: "Force the removal of the volume" + type: "boolean" + default: false + tags: ["Volume"] + + /volumes/prune: + post: + summary: "Delete unused volumes" + produces: + - "application/json" + operationId: "VolumePrune" + parameters: + - name: "filters" + in: "query" + description: | + Filters to process on the prune list, encoded as JSON (a `map[string][]string`). + + Available filters: + - `label` (`label=`, `label==`, `label!=`, or `label!==`) Prune volumes with (or without, in case `label!=...` is used) the specified labels. + - `all` (`all=true`) - Consider all (local) volumes for pruning and not just anonymous volumes. + type: "string" + responses: + 200: + description: "No error" + schema: + type: "object" + title: "VolumePruneResponse" + properties: + VolumesDeleted: + description: "Volumes that were deleted" + type: "array" + items: + type: "string" + SpaceReclaimed: + description: "Disk space reclaimed in bytes" + type: "integer" + format: "int64" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["Volume"] + /networks: + get: + summary: "List networks" + description: | + Returns a list of networks. For details on the format, see the + [network inspect endpoint](#operation/NetworkInspect). + + Note that it uses a different, smaller representation of a network than + inspecting a single network. For example, the list of containers attached + to the network is not propagated in API versions 1.28 and up. + operationId: "NetworkList" + produces: + - "application/json" + responses: + 200: + description: "No error" + schema: + type: "array" + items: + $ref: "#/definitions/Network" + examples: + application/json: + - Name: "bridge" + Id: "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566" + Created: "2016-10-19T06:21:00.416543526Z" + Scope: "local" + Driver: "bridge" + EnableIPv4: true + EnableIPv6: false + Internal: false + Attachable: false + Ingress: false + IPAM: + Driver: "default" + Config: + - + Subnet: "172.17.0.0/16" + Options: + com.docker.network.bridge.default_bridge: "true" + com.docker.network.bridge.enable_icc: "true" + com.docker.network.bridge.enable_ip_masquerade: "true" + com.docker.network.bridge.host_binding_ipv4: "0.0.0.0" + com.docker.network.bridge.name: "docker0" + com.docker.network.driver.mtu: "1500" + - Name: "none" + Id: "e086a3893b05ab69242d3c44e49483a3bbbd3a26b46baa8f61ab797c1088d794" + Created: "0001-01-01T00:00:00Z" + Scope: "local" + Driver: "null" + EnableIPv4: false + EnableIPv6: false + Internal: false + Attachable: false + Ingress: false + IPAM: + Driver: "default" + Config: [] + Containers: {} + Options: {} + - Name: "host" + Id: "13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e" + Created: "0001-01-01T00:00:00Z" + Scope: "local" + Driver: "host" + EnableIPv4: false + EnableIPv6: false + Internal: false + Attachable: false + Ingress: false + IPAM: + Driver: "default" + Config: [] + Containers: {} + Options: {} + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "filters" + in: "query" + description: | + JSON encoded value of the filters (a `map[string][]string`) to process + on the networks list. + + Available filters: + + - `dangling=` When set to `true` (or `1`), returns all + networks that are not in use by a container. When set to `false` + (or `0`), only networks that are in use by one or more + containers are returned. + - `driver=` Matches a network's driver. + - `id=` Matches all or part of a network ID. + - `label=` or `label==` of a network label. + - `name=` Matches all or part of a network name. + - `scope=["swarm"|"global"|"local"]` Filters networks by scope (`swarm`, `global`, or `local`). + - `type=["custom"|"builtin"]` Filters networks by type. The `custom` keyword returns all user-defined networks. + type: "string" + tags: ["Network"] + + /networks/{id}: + get: + summary: "Inspect a network" + operationId: "NetworkInspect" + produces: + - "application/json" + responses: + 200: + description: "No error" + schema: + $ref: "#/definitions/Network" + 404: + description: "Network not found" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "Network ID or name" + required: true + type: "string" + - name: "verbose" + in: "query" + description: "Detailed inspect output for troubleshooting" + type: "boolean" + default: false + - name: "scope" + in: "query" + description: "Filter the network by scope (swarm, global, or local)" + type: "string" + tags: ["Network"] + + delete: + summary: "Remove a network" + operationId: "NetworkDelete" + responses: + 204: + description: "No error" + 403: + description: "operation not supported for pre-defined networks" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "no such network" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "Network ID or name" + required: true + type: "string" + tags: ["Network"] + + /networks/create: + post: + summary: "Create a network" + operationId: "NetworkCreate" + consumes: + - "application/json" + produces: + - "application/json" + responses: + 201: + description: "Network created successfully" + schema: + $ref: "#/definitions/NetworkCreateResponse" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 403: + description: | + Forbidden operation. This happens when trying to create a network named after a pre-defined network, + or when trying to create an overlay network on a daemon which is not part of a Swarm cluster. + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "plugin not found" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "networkConfig" + in: "body" + description: "Network configuration" + required: true + schema: + type: "object" + title: "NetworkCreateRequest" + required: ["Name"] + properties: + Name: + description: "The network's name." + type: "string" + example: "my_network" + Driver: + description: "Name of the network driver plugin to use." + type: "string" + default: "bridge" + example: "bridge" + Scope: + description: | + The level at which the network exists (e.g. `swarm` for cluster-wide + or `local` for machine level). + type: "string" + Internal: + description: "Restrict external access to the network." + type: "boolean" + Attachable: + description: | + Globally scoped network is manually attachable by regular + containers from workers in swarm mode. + type: "boolean" + example: true + Ingress: + description: | + Ingress network is the network which provides the routing-mesh + in swarm mode. + type: "boolean" + example: false + ConfigOnly: + description: | + Creates a config-only network. Config-only networks are placeholder + networks for network configurations to be used by other networks. + Config-only networks cannot be used directly to run containers + or services. + type: "boolean" + default: false + example: false + ConfigFrom: + description: | + Specifies the source which will provide the configuration for + this network. The specified network must be an existing + config-only network; see ConfigOnly. + $ref: "#/definitions/ConfigReference" + IPAM: + description: "Optional custom IP scheme for the network." + $ref: "#/definitions/IPAM" + EnableIPv4: + description: "Enable IPv4 on the network." + type: "boolean" + example: true + EnableIPv6: + description: "Enable IPv6 on the network." + type: "boolean" + example: true + Options: + description: "Network specific options to be used by the drivers." + type: "object" + additionalProperties: + type: "string" + example: + com.docker.network.bridge.default_bridge: "true" + com.docker.network.bridge.enable_icc: "true" + com.docker.network.bridge.enable_ip_masquerade: "true" + com.docker.network.bridge.host_binding_ipv4: "0.0.0.0" + com.docker.network.bridge.name: "docker0" + com.docker.network.driver.mtu: "1500" + Labels: + description: "User-defined key/value metadata." + type: "object" + additionalProperties: + type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" + tags: ["Network"] + + /networks/{id}/connect: + post: + summary: "Connect a container to a network" + description: "The network must be either a local-scoped network or a swarm-scoped network with the `attachable` option set. A network cannot be re-attached to a running container" + operationId: "NetworkConnect" + consumes: + - "application/json" + responses: + 200: + description: "No error" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 403: + description: "Operation forbidden" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "Network or container not found" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "Network ID or name" + required: true + type: "string" + - name: "container" + in: "body" + required: true + schema: + type: "object" + title: "NetworkConnectRequest" + properties: + Container: + type: "string" + description: "The ID or name of the container to connect to the network." + EndpointConfig: + $ref: "#/definitions/EndpointSettings" + example: + Container: "3613f73ba0e4" + EndpointConfig: + IPAMConfig: + IPv4Address: "172.24.56.89" + IPv6Address: "2001:db8::5689" + MacAddress: "02:42:ac:12:05:02" + Priority: 100 + tags: ["Network"] + + /networks/{id}/disconnect: + post: + summary: "Disconnect a container from a network" + operationId: "NetworkDisconnect" + consumes: + - "application/json" + responses: + 200: + description: "No error" + 403: + description: "Operation not supported for swarm scoped networks" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "Network or container not found" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "Network ID or name" + required: true + type: "string" + - name: "container" + in: "body" + required: true + schema: + type: "object" + title: "NetworkDisconnectRequest" + properties: + Container: + type: "string" + description: | + The ID or name of the container to disconnect from the network. + Force: + type: "boolean" + description: | + Force the container to disconnect from the network. + tags: ["Network"] + /networks/prune: + post: + summary: "Delete unused networks" + produces: + - "application/json" + operationId: "NetworkPrune" + parameters: + - name: "filters" + in: "query" + description: | + Filters to process on the prune list, encoded as JSON (a `map[string][]string`). + + Available filters: + - `until=` Prune networks created before this timestamp. The `` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon machine’s time. + - `label` (`label=`, `label==`, `label!=`, or `label!==`) Prune networks with (or without, in case `label!=...` is used) the specified labels. + type: "string" + responses: + 200: + description: "No error" + schema: + type: "object" + title: "NetworkPruneResponse" + properties: + NetworksDeleted: + description: "Networks that were deleted" + type: "array" + items: + type: "string" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["Network"] + /plugins: + get: + summary: "List plugins" + operationId: "PluginList" + description: "Returns information about installed plugins." + produces: ["application/json"] + responses: + 200: + description: "No error" + schema: + type: "array" + items: + $ref: "#/definitions/Plugin" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "filters" + in: "query" + type: "string" + description: | + A JSON encoded value of the filters (a `map[string][]string`) to + process on the plugin list. + + Available filters: + + - `capability=` + - `enable=|` + tags: ["Plugin"] + + /plugins/privileges: + get: + summary: "Get plugin privileges" + operationId: "GetPluginPrivileges" + responses: + 200: + description: "no error" + schema: + type: "array" + items: + $ref: "#/definitions/PluginPrivilege" + example: + - Name: "network" + Description: "" + Value: + - "host" + - Name: "mount" + Description: "" + Value: + - "/data" + - Name: "device" + Description: "" + Value: + - "/dev/cpu_dma_latency" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "remote" + in: "query" + description: | + The name of the plugin. The `:latest` tag is optional, and is the + default if omitted. + required: true + type: "string" + tags: + - "Plugin" + + /plugins/pull: + post: + summary: "Install a plugin" + operationId: "PluginPull" + description: | + Pulls and installs a plugin. After the plugin is installed, it can be + enabled using the [`POST /plugins/{name}/enable` endpoint](#operation/PostPluginsEnable). + produces: + - "application/json" + responses: + 204: + description: "no error" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "remote" + in: "query" + description: | + Remote reference for plugin to install. + + The `:latest` tag is optional, and is used as the default if omitted. + required: true + type: "string" + - name: "name" + in: "query" + description: | + Local name for the pulled plugin. + + The `:latest` tag is optional, and is used as the default if omitted. + required: false + type: "string" + - name: "X-Registry-Auth" + in: "header" + description: | + A base64url-encoded auth configuration to use when pulling a plugin + from a registry. + + Refer to the [authentication section](#section/Authentication) for + details. + type: "string" + - name: "body" + in: "body" + schema: + type: "array" + items: + $ref: "#/definitions/PluginPrivilege" + example: + - Name: "network" + Description: "" + Value: + - "host" + - Name: "mount" + Description: "" + Value: + - "/data" + - Name: "device" + Description: "" + Value: + - "/dev/cpu_dma_latency" + tags: ["Plugin"] + /plugins/{name}/json: + get: + summary: "Inspect a plugin" + operationId: "PluginInspect" + responses: + 200: + description: "no error" + schema: + $ref: "#/definitions/Plugin" + 404: + description: "plugin is not installed" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + description: | + The name of the plugin. The `:latest` tag is optional, and is the + default if omitted. + required: true + type: "string" + tags: ["Plugin"] + /plugins/{name}: + delete: + summary: "Remove a plugin" + operationId: "PluginDelete" + responses: + 200: + description: "no error" + schema: + $ref: "#/definitions/Plugin" + 404: + description: "plugin is not installed" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + description: | + The name of the plugin. The `:latest` tag is optional, and is the + default if omitted. + required: true + type: "string" + - name: "force" + in: "query" + description: | + Disable the plugin before removing. This may result in issues if the + plugin is in use by a container. + type: "boolean" + default: false + tags: ["Plugin"] + /plugins/{name}/enable: + post: + summary: "Enable a plugin" + operationId: "PluginEnable" + responses: + 200: + description: "no error" + 404: + description: "plugin is not installed" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + description: | + The name of the plugin. The `:latest` tag is optional, and is the + default if omitted. + required: true + type: "string" + - name: "timeout" + in: "query" + description: "Set the HTTP client timeout (in seconds)" + type: "integer" + default: 0 + tags: ["Plugin"] + /plugins/{name}/disable: + post: + summary: "Disable a plugin" + operationId: "PluginDisable" + responses: + 200: + description: "no error" + 404: + description: "plugin is not installed" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + description: | + The name of the plugin. The `:latest` tag is optional, and is the + default if omitted. + required: true + type: "string" + - name: "force" + in: "query" + description: | + Force disable a plugin even if still in use. + required: false + type: "boolean" + tags: ["Plugin"] + /plugins/{name}/upgrade: + post: + summary: "Upgrade a plugin" + operationId: "PluginUpgrade" + responses: + 204: + description: "no error" + 404: + description: "plugin not installed" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + description: | + The name of the plugin. The `:latest` tag is optional, and is the + default if omitted. + required: true + type: "string" + - name: "remote" + in: "query" + description: | + Remote reference to upgrade to. + + The `:latest` tag is optional, and is used as the default if omitted. + required: true + type: "string" + - name: "X-Registry-Auth" + in: "header" + description: | + A base64url-encoded auth configuration to use when pulling a plugin + from a registry. + + Refer to the [authentication section](#section/Authentication) for + details. + type: "string" + - name: "body" + in: "body" + schema: + type: "array" + items: + $ref: "#/definitions/PluginPrivilege" + example: + - Name: "network" + Description: "" + Value: + - "host" + - Name: "mount" + Description: "" + Value: + - "/data" + - Name: "device" + Description: "" + Value: + - "/dev/cpu_dma_latency" + tags: ["Plugin"] + /plugins/create: + post: + summary: "Create a plugin" + operationId: "PluginCreate" + consumes: + - "application/x-tar" + responses: + 204: + description: "no error" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "query" + description: | + The name of the plugin. The `:latest` tag is optional, and is the + default if omitted. + required: true + type: "string" + - name: "tarContext" + in: "body" + description: "Path to tar containing plugin rootfs and manifest" + schema: + type: "string" + format: "binary" + tags: ["Plugin"] + /plugins/{name}/push: + post: + summary: "Push a plugin" + operationId: "PluginPush" + description: | + Push a plugin to the registry. + parameters: + - name: "name" + in: "path" + description: | + The name of the plugin. The `:latest` tag is optional, and is the + default if omitted. + required: true + type: "string" + responses: + 200: + description: "no error" + 404: + description: "plugin not installed" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["Plugin"] + /plugins/{name}/set: + post: + summary: "Configure a plugin" + operationId: "PluginSet" + consumes: + - "application/json" + parameters: + - name: "name" + in: "path" + description: | + The name of the plugin. The `:latest` tag is optional, and is the + default if omitted. + required: true + type: "string" + - name: "body" + in: "body" + schema: + type: "array" + items: + type: "string" + example: ["DEBUG=1"] + responses: + 204: + description: "No error" + 404: + description: "Plugin not installed" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["Plugin"] + /nodes: + get: + summary: "List nodes" + operationId: "NodeList" + responses: + 200: + description: "no error" + schema: + type: "array" + items: + $ref: "#/definitions/Node" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "filters" + in: "query" + description: | + Filters to process on the nodes list, encoded as JSON (a `map[string][]string`). + + Available filters: + - `id=` + - `label=` + - `membership=`(`accepted`|`pending`)` + - `name=` + - `node.label=` + - `role=`(`manager`|`worker`)` + type: "string" + tags: ["Node"] + /nodes/{id}: + get: + summary: "Inspect a node" + operationId: "NodeInspect" + responses: + 200: + description: "no error" + schema: + $ref: "#/definitions/Node" + 404: + description: "no such node" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "The ID or name of the node" + type: "string" + required: true + tags: ["Node"] + delete: + summary: "Delete a node" + operationId: "NodeDelete" + responses: + 200: + description: "no error" + 404: + description: "no such node" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "The ID or name of the node" + type: "string" + required: true + - name: "force" + in: "query" + description: "Force remove a node from the swarm" + default: false + type: "boolean" + tags: ["Node"] + /nodes/{id}/update: + post: + summary: "Update a node" + operationId: "NodeUpdate" + responses: + 200: + description: "no error" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "no such node" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "The ID of the node" + type: "string" + required: true + - name: "body" + in: "body" + schema: + $ref: "#/definitions/NodeSpec" + - name: "version" + in: "query" + description: | + The version number of the node object being updated. This is required + to avoid conflicting writes. + type: "integer" + format: "int64" + required: true + tags: ["Node"] + /swarm: + get: + summary: "Inspect swarm" + operationId: "SwarmInspect" + responses: + 200: + description: "no error" + schema: + $ref: "#/definitions/Swarm" + 404: + description: "no such swarm" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["Swarm"] + /swarm/init: + post: + summary: "Initialize a new swarm" + operationId: "SwarmInit" + produces: + - "application/json" + - "text/plain" + responses: + 200: + description: "no error" + schema: + description: "The node ID" + type: "string" + example: "7v2t30z9blmxuhnyo6s4cpenp" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is already part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "body" + in: "body" + required: true + schema: + type: "object" + title: "SwarmInitRequest" + properties: + ListenAddr: + description: | + Listen address used for inter-manager communication, as well + as determining the networking interface used for the VXLAN + Tunnel Endpoint (VTEP). This can either be an address/port + combination in the form `192.168.1.1:4567`, or an interface + followed by a port number, like `eth0:4567`. If the port number + is omitted, the default swarm listening port is used. + type: "string" + AdvertiseAddr: + description: | + Externally reachable address advertised to other nodes. This + can either be an address/port combination in the form + `192.168.1.1:4567`, or an interface followed by a port number, + like `eth0:4567`. If the port number is omitted, the port + number from the listen address is used. If `AdvertiseAddr` is + not specified, it will be automatically detected when possible. + type: "string" + DataPathAddr: + description: | + Address or interface to use for data path traffic (format: + ``), for example, `192.168.1.1`, or an interface, + like `eth0`. If `DataPathAddr` is unspecified, the same address + as `AdvertiseAddr` is used. + + The `DataPathAddr` specifies the address that global scope + network drivers will publish towards other nodes in order to + reach the containers running on this node. Using this parameter + it is possible to separate the container data traffic from the + management traffic of the cluster. + type: "string" + DataPathPort: + description: | + DataPathPort specifies the data path port number for data traffic. + Acceptable port range is 1024 to 49151. + if no port is set or is set to 0, default port 4789 will be used. + type: "integer" + format: "uint32" + DefaultAddrPool: + description: | + Default Address Pool specifies default subnet pools for global + scope networks. + type: "array" + items: + type: "string" + example: ["10.10.0.0/16", "20.20.0.0/16"] + ForceNewCluster: + description: "Force creation of a new swarm." + type: "boolean" + SubnetSize: + description: | + SubnetSize specifies the subnet size of the networks created + from the default subnet pool. + type: "integer" + format: "uint32" + Spec: + $ref: "#/definitions/SwarmSpec" + example: + ListenAddr: "0.0.0.0:2377" + AdvertiseAddr: "192.168.1.1:2377" + DataPathPort: 4789 + DefaultAddrPool: ["10.10.0.0/8", "20.20.0.0/8"] + SubnetSize: 24 + ForceNewCluster: false + Spec: + Orchestration: {} + Raft: {} + Dispatcher: {} + CAConfig: {} + EncryptionConfig: + AutoLockManagers: false + tags: ["Swarm"] + /swarm/join: + post: + summary: "Join an existing swarm" + operationId: "SwarmJoin" + responses: + 200: + description: "no error" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is already part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "body" + in: "body" + required: true + schema: + type: "object" + title: "SwarmJoinRequest" + properties: + ListenAddr: + description: | + Listen address used for inter-manager communication if the node + gets promoted to manager, as well as determining the networking + interface used for the VXLAN Tunnel Endpoint (VTEP). + type: "string" + AdvertiseAddr: + description: | + Externally reachable address advertised to other nodes. This + can either be an address/port combination in the form + `192.168.1.1:4567`, or an interface followed by a port number, + like `eth0:4567`. If the port number is omitted, the port + number from the listen address is used. If `AdvertiseAddr` is + not specified, it will be automatically detected when possible. + type: "string" + DataPathAddr: + description: | + Address or interface to use for data path traffic (format: + ``), for example, `192.168.1.1`, or an interface, + like `eth0`. If `DataPathAddr` is unspecified, the same address + as `AdvertiseAddr` is used. + + The `DataPathAddr` specifies the address that global scope + network drivers will publish towards other nodes in order to + reach the containers running on this node. Using this parameter + it is possible to separate the container data traffic from the + management traffic of the cluster. + + type: "string" + RemoteAddrs: + description: | + Addresses of manager nodes already participating in the swarm. + type: "array" + items: + type: "string" + JoinToken: + description: "Secret token for joining this swarm." + type: "string" + example: + ListenAddr: "0.0.0.0:2377" + AdvertiseAddr: "192.168.1.1:2377" + DataPathAddr: "192.168.1.1" + RemoteAddrs: + - "node1:2377" + JoinToken: "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2" + tags: ["Swarm"] + /swarm/leave: + post: + summary: "Leave a swarm" + operationId: "SwarmLeave" + responses: + 200: + description: "no error" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "force" + description: | + Force leave swarm, even if this is the last manager or that it will + break the cluster. + in: "query" + type: "boolean" + default: false + tags: ["Swarm"] + /swarm/update: + post: + summary: "Update a swarm" + operationId: "SwarmUpdate" + responses: + 200: + description: "no error" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "body" + in: "body" + required: true + schema: + $ref: "#/definitions/SwarmSpec" + - name: "version" + in: "query" + description: | + The version number of the swarm object being updated. This is + required to avoid conflicting writes. + type: "integer" + format: "int64" + required: true + - name: "rotateWorkerToken" + in: "query" + description: "Rotate the worker join token." + type: "boolean" + default: false + - name: "rotateManagerToken" + in: "query" + description: "Rotate the manager join token." + type: "boolean" + default: false + - name: "rotateManagerUnlockKey" + in: "query" + description: "Rotate the manager unlock key." + type: "boolean" + default: false + tags: ["Swarm"] + /swarm/unlockkey: + get: + summary: "Get the unlock key" + operationId: "SwarmUnlockkey" + consumes: + - "application/json" + responses: + 200: + description: "no error" + schema: + type: "object" + title: "UnlockKeyResponse" + properties: + UnlockKey: + description: "The swarm's unlock key." + type: "string" + example: + UnlockKey: "SWMKEY-1-7c37Cc8654o6p38HnroywCi19pllOnGtbdZEgtKxZu8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["Swarm"] + /swarm/unlock: + post: + summary: "Unlock a locked manager" + operationId: "SwarmUnlock" + consumes: + - "application/json" + produces: + - "application/json" + parameters: + - name: "body" + in: "body" + required: true + schema: + type: "object" + title: "SwarmUnlockRequest" + properties: + UnlockKey: + description: "The swarm's unlock key." + type: "string" + example: + UnlockKey: "SWMKEY-1-7c37Cc8654o6p38HnroywCi19pllOnGtbdZEgtKxZu8" + responses: + 200: + description: "no error" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["Swarm"] + /services: + get: + summary: "List services" + operationId: "ServiceList" + responses: + 200: + description: "no error" + schema: + type: "array" + items: + $ref: "#/definitions/Service" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "filters" + in: "query" + type: "string" + description: | + A JSON encoded value of the filters (a `map[string][]string`) to + process on the services list. + + Available filters: + + - `id=` + - `label=` + - `mode=["replicated"|"global"]` + - `name=` + - name: "status" + in: "query" + type: "boolean" + description: | + Include service status, with count of running and desired tasks. + tags: ["Service"] + /services/create: + post: + summary: "Create a service" + operationId: "ServiceCreate" + consumes: + - "application/json" + produces: + - "application/json" + responses: + 201: + description: "no error" + schema: + $ref: "#/definitions/ServiceCreateResponse" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 403: + description: "network is not eligible for services" + schema: + $ref: "#/definitions/ErrorResponse" + 409: + description: "name conflicts with an existing service" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "body" + in: "body" + required: true + schema: + allOf: + - $ref: "#/definitions/ServiceSpec" + - type: "object" + example: + Name: "web" + TaskTemplate: + ContainerSpec: + Image: "nginx:alpine" + Mounts: + - + ReadOnly: true + Source: "web-data" + Target: "/usr/share/nginx/html" + Type: "volume" + VolumeOptions: + DriverConfig: {} + Labels: + com.example.something: "something-value" + Hosts: ["10.10.10.10 host1", "ABCD:EF01:2345:6789:ABCD:EF01:2345:6789 host2"] + User: "33" + DNSConfig: + Nameservers: ["8.8.8.8"] + Search: ["example.org"] + Options: ["timeout:3"] + Secrets: + - + File: + Name: "www.example.org.key" + UID: "33" + GID: "33" + Mode: 384 + SecretID: "fpjqlhnwb19zds35k8wn80lq9" + SecretName: "example_org_domain_key" + OomScoreAdj: 0 + LogDriver: + Name: "json-file" + Options: + max-file: "3" + max-size: "10M" + Placement: {} + Resources: + Limits: + MemoryBytes: 104857600 + Reservations: {} + RestartPolicy: + Condition: "on-failure" + Delay: 10000000000 + MaxAttempts: 10 + Mode: + Replicated: + Replicas: 4 + UpdateConfig: + Parallelism: 2 + Delay: 1000000000 + FailureAction: "pause" + Monitor: 15000000000 + MaxFailureRatio: 0.15 + RollbackConfig: + Parallelism: 1 + Delay: 1000000000 + FailureAction: "pause" + Monitor: 15000000000 + MaxFailureRatio: 0.15 + EndpointSpec: + Ports: + - + Protocol: "tcp" + PublishedPort: 8080 + TargetPort: 80 + Labels: + foo: "bar" + - name: "X-Registry-Auth" + in: "header" + description: | + A base64url-encoded auth configuration for pulling from private + registries. + + Refer to the [authentication section](#section/Authentication) for + details. + type: "string" + tags: ["Service"] + /services/{id}: + get: + summary: "Inspect a service" + operationId: "ServiceInspect" + responses: + 200: + description: "no error" + schema: + $ref: "#/definitions/Service" + 404: + description: "no such service" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "ID or name of service." + required: true + type: "string" + - name: "insertDefaults" + in: "query" + description: "Fill empty fields with default values." + type: "boolean" + default: false + tags: ["Service"] + delete: + summary: "Delete a service" + operationId: "ServiceDelete" + responses: + 200: + description: "no error" + 404: + description: "no such service" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "ID or name of service." + required: true + type: "string" + tags: ["Service"] + /services/{id}/update: + post: + summary: "Update a service" + operationId: "ServiceUpdate" + consumes: ["application/json"] + produces: ["application/json"] + responses: + 200: + description: "no error" + schema: + $ref: "#/definitions/ServiceUpdateResponse" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "no such service" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "ID or name of service." + required: true + type: "string" + - name: "body" + in: "body" + required: true + schema: + allOf: + - $ref: "#/definitions/ServiceSpec" + - type: "object" + example: + Name: "top" + TaskTemplate: + ContainerSpec: + Image: "busybox" + Args: + - "top" + OomScoreAdj: 0 + Resources: + Limits: {} + Reservations: {} + RestartPolicy: + Condition: "any" + MaxAttempts: 0 + Placement: {} + ForceUpdate: 0 + Mode: + Replicated: + Replicas: 1 + UpdateConfig: + Parallelism: 2 + Delay: 1000000000 + FailureAction: "pause" + Monitor: 15000000000 + MaxFailureRatio: 0.15 + RollbackConfig: + Parallelism: 1 + Delay: 1000000000 + FailureAction: "pause" + Monitor: 15000000000 + MaxFailureRatio: 0.15 + EndpointSpec: + Mode: "vip" + + - name: "version" + in: "query" + description: | + The version number of the service object being updated. This is + required to avoid conflicting writes. + This version number should be the value as currently set on the + service *before* the update. You can find the current version by + calling `GET /services/{id}` + required: true + type: "integer" + - name: "registryAuthFrom" + in: "query" + description: | + If the `X-Registry-Auth` header is not specified, this parameter + indicates where to find registry authorization credentials. + type: "string" + enum: ["spec", "previous-spec"] + default: "spec" + - name: "rollback" + in: "query" + description: | + Set to this parameter to `previous` to cause a server-side rollback + to the previous service spec. The supplied spec will be ignored in + this case. + type: "string" + - name: "X-Registry-Auth" + in: "header" + description: | + A base64url-encoded auth configuration for pulling from private + registries. + + Refer to the [authentication section](#section/Authentication) for + details. + type: "string" + + tags: ["Service"] + /services/{id}/logs: + get: + summary: "Get service logs" + description: | + Get `stdout` and `stderr` logs from a service. See also + [`/containers/{id}/logs`](#operation/ContainerLogs). + + **Note**: This endpoint works only for services with the `local`, + `json-file` or `journald` logging drivers. + produces: + - "application/vnd.docker.raw-stream" + - "application/vnd.docker.multiplexed-stream" + operationId: "ServiceLogs" + responses: + 200: + description: "logs returned as a stream in response body" + schema: + type: "string" + format: "binary" + 404: + description: "no such service" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such service: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID or name of the service" + type: "string" + - name: "details" + in: "query" + description: "Show service context and extra details provided to logs." + type: "boolean" + default: false + - name: "follow" + in: "query" + description: "Keep connection after returning logs." + type: "boolean" + default: false + - name: "stdout" + in: "query" + description: "Return logs from `stdout`" + type: "boolean" + default: false + - name: "stderr" + in: "query" + description: "Return logs from `stderr`" + type: "boolean" + default: false + - name: "since" + in: "query" + description: "Only return logs since this time, as a UNIX timestamp" + type: "integer" + default: 0 + - name: "timestamps" + in: "query" + description: "Add timestamps to every log line" + type: "boolean" + default: false + - name: "tail" + in: "query" + description: | + Only return this number of log lines from the end of the logs. + Specify as an integer or `all` to output all log lines. + type: "string" + default: "all" + tags: ["Service"] + /tasks: + get: + summary: "List tasks" + operationId: "TaskList" + produces: + - "application/json" + responses: + 200: + description: "no error" + schema: + type: "array" + items: + $ref: "#/definitions/Task" + example: + - ID: "0kzzo1i0y4jz6027t0k7aezc7" + Version: + Index: 71 + CreatedAt: "2016-06-07T21:07:31.171892745Z" + UpdatedAt: "2016-06-07T21:07:31.376370513Z" + Spec: + ContainerSpec: + Image: "redis" + Resources: + Limits: {} + Reservations: {} + RestartPolicy: + Condition: "any" + MaxAttempts: 0 + Placement: {} + ServiceID: "9mnpnzenvg8p8tdbtq4wvbkcz" + Slot: 1 + NodeID: "60gvrl6tm78dmak4yl7srz94v" + Status: + Timestamp: "2016-06-07T21:07:31.290032978Z" + State: "running" + Message: "started" + ContainerStatus: + ContainerID: "e5d62702a1b48d01c3e02ca1e0212a250801fa8d67caca0b6f35919ebc12f035" + PID: 677 + DesiredState: "running" + NetworksAttachments: + - Network: + ID: "4qvuz4ko70xaltuqbt8956gd1" + Version: + Index: 18 + CreatedAt: "2016-06-07T20:31:11.912919752Z" + UpdatedAt: "2016-06-07T21:07:29.955277358Z" + Spec: + Name: "ingress" + Labels: + com.docker.swarm.internal: "true" + DriverConfiguration: {} + IPAMOptions: + Driver: {} + Configs: + - Subnet: "10.255.0.0/16" + Gateway: "10.255.0.1" + DriverState: + Name: "overlay" + Options: + com.docker.network.driver.overlay.vxlanid_list: "256" + IPAMOptions: + Driver: + Name: "default" + Configs: + - Subnet: "10.255.0.0/16" + Gateway: "10.255.0.1" + Addresses: + - "10.255.0.10/16" + - ID: "1yljwbmlr8er2waf8orvqpwms" + Version: + Index: 30 + CreatedAt: "2016-06-07T21:07:30.019104782Z" + UpdatedAt: "2016-06-07T21:07:30.231958098Z" + Name: "hopeful_cori" + Spec: + ContainerSpec: + Image: "redis" + Resources: + Limits: {} + Reservations: {} + RestartPolicy: + Condition: "any" + MaxAttempts: 0 + Placement: {} + ServiceID: "9mnpnzenvg8p8tdbtq4wvbkcz" + Slot: 1 + NodeID: "60gvrl6tm78dmak4yl7srz94v" + Status: + Timestamp: "2016-06-07T21:07:30.202183143Z" + State: "shutdown" + Message: "shutdown" + ContainerStatus: + ContainerID: "1cf8d63d18e79668b0004a4be4c6ee58cddfad2dae29506d8781581d0688a213" + DesiredState: "shutdown" + NetworksAttachments: + - Network: + ID: "4qvuz4ko70xaltuqbt8956gd1" + Version: + Index: 18 + CreatedAt: "2016-06-07T20:31:11.912919752Z" + UpdatedAt: "2016-06-07T21:07:29.955277358Z" + Spec: + Name: "ingress" + Labels: + com.docker.swarm.internal: "true" + DriverConfiguration: {} + IPAMOptions: + Driver: {} + Configs: + - Subnet: "10.255.0.0/16" + Gateway: "10.255.0.1" + DriverState: + Name: "overlay" + Options: + com.docker.network.driver.overlay.vxlanid_list: "256" + IPAMOptions: + Driver: + Name: "default" + Configs: + - Subnet: "10.255.0.0/16" + Gateway: "10.255.0.1" + Addresses: + - "10.255.0.5/16" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "filters" + in: "query" + type: "string" + description: | + A JSON encoded value of the filters (a `map[string][]string`) to + process on the tasks list. + + Available filters: + + - `desired-state=(running | shutdown | accepted)` + - `id=` + - `label=key` or `label="key=value"` + - `name=` + - `node=` + - `service=` + tags: ["Task"] + /tasks/{id}: + get: + summary: "Inspect a task" + operationId: "TaskInspect" + produces: + - "application/json" + responses: + 200: + description: "no error" + schema: + $ref: "#/definitions/Task" + 404: + description: "no such task" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "ID of the task" + required: true + type: "string" + tags: ["Task"] + /tasks/{id}/logs: + get: + summary: "Get task logs" + description: | + Get `stdout` and `stderr` logs from a task. + See also [`/containers/{id}/logs`](#operation/ContainerLogs). + + **Note**: This endpoint works only for services with the `local`, + `json-file` or `journald` logging drivers. + operationId: "TaskLogs" + produces: + - "application/vnd.docker.raw-stream" + - "application/vnd.docker.multiplexed-stream" + responses: + 200: + description: "logs returned as a stream in response body" + schema: + type: "string" + format: "binary" + 404: + description: "no such task" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such task: c2ada9df5af8" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + description: "ID of the task" + type: "string" + - name: "details" + in: "query" + description: "Show task context and extra details provided to logs." + type: "boolean" + default: false + - name: "follow" + in: "query" + description: "Keep connection after returning logs." + type: "boolean" + default: false + - name: "stdout" + in: "query" + description: "Return logs from `stdout`" + type: "boolean" + default: false + - name: "stderr" + in: "query" + description: "Return logs from `stderr`" + type: "boolean" + default: false + - name: "since" + in: "query" + description: "Only return logs since this time, as a UNIX timestamp" + type: "integer" + default: 0 + - name: "timestamps" + in: "query" + description: "Add timestamps to every log line" + type: "boolean" + default: false + - name: "tail" + in: "query" + description: | + Only return this number of log lines from the end of the logs. + Specify as an integer or `all` to output all log lines. + type: "string" + default: "all" + tags: ["Task"] + /secrets: + get: + summary: "List secrets" + operationId: "SecretList" + produces: + - "application/json" + responses: + 200: + description: "no error" + schema: + type: "array" + items: + $ref: "#/definitions/Secret" + example: + - ID: "blt1owaxmitz71s9v5zh81zun" + Version: + Index: 85 + CreatedAt: "2017-07-20T13:55:28.678958722Z" + UpdatedAt: "2017-07-20T13:55:28.678958722Z" + Spec: + Name: "mysql-passwd" + Labels: + some.label: "some.value" + Driver: + Name: "secret-bucket" + Options: + OptionA: "value for driver option A" + OptionB: "value for driver option B" + - ID: "ktnbjxoalbkvbvedmg1urrz8h" + Version: + Index: 11 + CreatedAt: "2016-11-05T01:20:17.327670065Z" + UpdatedAt: "2016-11-05T01:20:17.327670065Z" + Spec: + Name: "app-dev.crt" + Labels: + foo: "bar" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "filters" + in: "query" + type: "string" + description: | + A JSON encoded value of the filters (a `map[string][]string`) to + process on the secrets list. + + Available filters: + + - `id=` + - `label= or label==value` + - `name=` + - `names=` + tags: ["Secret"] + /secrets/create: + post: + summary: "Create a secret" + operationId: "SecretCreate" + consumes: + - "application/json" + produces: + - "application/json" + responses: + 201: + description: "no error" + schema: + $ref: "#/definitions/IDResponse" + 409: + description: "name conflicts with an existing object" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "body" + in: "body" + schema: + allOf: + - $ref: "#/definitions/SecretSpec" + - type: "object" + example: + Name: "app-key.crt" + Labels: + foo: "bar" + Data: "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg==" + Driver: + Name: "secret-bucket" + Options: + OptionA: "value for driver option A" + OptionB: "value for driver option B" + tags: ["Secret"] + /secrets/{id}: + get: + summary: "Inspect a secret" + operationId: "SecretInspect" + produces: + - "application/json" + responses: + 200: + description: "no error" + schema: + $ref: "#/definitions/Secret" + examples: + application/json: + ID: "ktnbjxoalbkvbvedmg1urrz8h" + Version: + Index: 11 + CreatedAt: "2016-11-05T01:20:17.327670065Z" + UpdatedAt: "2016-11-05T01:20:17.327670065Z" + Spec: + Name: "app-dev.crt" + Labels: + foo: "bar" + Driver: + Name: "secret-bucket" + Options: + OptionA: "value for driver option A" + OptionB: "value for driver option B" + + 404: + description: "secret not found" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + type: "string" + description: "ID of the secret" + tags: ["Secret"] + delete: + summary: "Delete a secret" + operationId: "SecretDelete" + produces: + - "application/json" + responses: + 204: + description: "no error" + 404: + description: "secret not found" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + type: "string" + description: "ID of the secret" + tags: ["Secret"] + /secrets/{id}/update: + post: + summary: "Update a Secret" + operationId: "SecretUpdate" + responses: + 200: + description: "no error" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "no such secret" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "The ID or name of the secret" + type: "string" + required: true + - name: "body" + in: "body" + schema: + $ref: "#/definitions/SecretSpec" + description: | + The spec of the secret to update. Currently, only the Labels field + can be updated. All other fields must remain unchanged from the + [SecretInspect endpoint](#operation/SecretInspect) response values. + - name: "version" + in: "query" + description: | + The version number of the secret object being updated. This is + required to avoid conflicting writes. + type: "integer" + format: "int64" + required: true + tags: ["Secret"] + /configs: + get: + summary: "List configs" + operationId: "ConfigList" + produces: + - "application/json" + responses: + 200: + description: "no error" + schema: + type: "array" + items: + $ref: "#/definitions/Config" + example: + - ID: "ktnbjxoalbkvbvedmg1urrz8h" + Version: + Index: 11 + CreatedAt: "2016-11-05T01:20:17.327670065Z" + UpdatedAt: "2016-11-05T01:20:17.327670065Z" + Spec: + Name: "server.conf" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "filters" + in: "query" + type: "string" + description: | + A JSON encoded value of the filters (a `map[string][]string`) to + process on the configs list. + + Available filters: + + - `id=` + - `label= or label==value` + - `name=` + - `names=` + tags: ["Config"] + /configs/create: + post: + summary: "Create a config" + operationId: "ConfigCreate" + consumes: + - "application/json" + produces: + - "application/json" + responses: + 201: + description: "no error" + schema: + $ref: "#/definitions/IDResponse" + 409: + description: "name conflicts with an existing object" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "body" + in: "body" + schema: + allOf: + - $ref: "#/definitions/ConfigSpec" + - type: "object" + example: + Name: "server.conf" + Labels: + foo: "bar" + Data: "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg==" + tags: ["Config"] + /configs/{id}: + get: + summary: "Inspect a config" + operationId: "ConfigInspect" + produces: + - "application/json" + responses: + 200: + description: "no error" + schema: + $ref: "#/definitions/Config" + examples: + application/json: + ID: "ktnbjxoalbkvbvedmg1urrz8h" + Version: + Index: 11 + CreatedAt: "2016-11-05T01:20:17.327670065Z" + UpdatedAt: "2016-11-05T01:20:17.327670065Z" + Spec: + Name: "app-dev.crt" + 404: + description: "config not found" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + type: "string" + description: "ID of the config" + tags: ["Config"] + delete: + summary: "Delete a config" + operationId: "ConfigDelete" + produces: + - "application/json" + responses: + 204: + description: "no error" + 404: + description: "config not found" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + required: true + type: "string" + description: "ID of the config" + tags: ["Config"] + /configs/{id}/update: + post: + summary: "Update a Config" + operationId: "ConfigUpdate" + responses: + 200: + description: "no error" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 404: + description: "no such config" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + 503: + description: "node is not part of a swarm" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "id" + in: "path" + description: "The ID or name of the config" + type: "string" + required: true + - name: "body" + in: "body" + schema: + $ref: "#/definitions/ConfigSpec" + description: | + The spec of the config to update. Currently, only the Labels field + can be updated. All other fields must remain unchanged from the + [ConfigInspect endpoint](#operation/ConfigInspect) response values. + - name: "version" + in: "query" + description: | + The version number of the config object being updated. This is + required to avoid conflicting writes. + type: "integer" + format: "int64" + required: true + tags: ["Config"] + /distribution/{name}/json: + get: + summary: "Get image information from the registry" + description: | + Return image digest and platform information by contacting the registry. + operationId: "DistributionInspect" + produces: + - "application/json" + responses: + 200: + description: "descriptor and platform information" + schema: + $ref: "#/definitions/DistributionInspect" + 401: + description: "Failed authentication or no image found" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "No such image: someimage (tag: latest)" + 500: + description: "Server error" + schema: + $ref: "#/definitions/ErrorResponse" + parameters: + - name: "name" + in: "path" + description: "Image name or id" + type: "string" + required: true + tags: ["Distribution"] + /session: + post: + summary: "Initialize interactive session" + description: | + Start a new interactive session with a server. Session allows server to + call back to the client for advanced capabilities. + + ### Hijacking + + This endpoint hijacks the HTTP connection to HTTP2 transport that allows + the client to expose gPRC services on that connection. + + For example, the client sends this request to upgrade the connection: + + ``` + POST /session HTTP/1.1 + Upgrade: h2c + Connection: Upgrade + ``` + + The Docker daemon responds with a `101 UPGRADED` response follow with + the raw stream: + + ``` + HTTP/1.1 101 UPGRADED + Connection: Upgrade + Upgrade: h2c + ``` + operationId: "Session" + produces: + - "application/vnd.docker.raw-stream" + responses: + 101: + description: "no error, hijacking successful" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" + 500: + description: "server error" + schema: + $ref: "#/definitions/ErrorResponse" + tags: ["Session"] diff --git a/_vendor/github.com/moby/moby/docs/api/version-history.md b/_vendor/github.com/moby/moby/docs/api/version-history.md index 396b27ec16da..3184e42d7372 100644 --- a/_vendor/github.com/moby/moby/docs/api/version-history.md +++ b/_vendor/github.com/moby/moby/docs/api/version-history.md @@ -13,6 +13,23 @@ keywords: "API, Docker, rcli, REST, documentation" will be rejected. --> +## v1.49 API changes + +[Docker Engine API v1.49](https://docs.docker.com/reference/api/engine/version/v1.49/) documentation + +* `GET /images/{name}/json` now supports a `platform` parameter (JSON + encoded OCI Platform type) allowing to specify a platform of the multi-platform + image to inspect. + This option is mutually exclusive with the `manifests` option. +* `GET /info` now returns a `FirewallBackend` containing information about + the daemon's firewalling configuration. +* Deprecated: The `AllowNondistributableArtifactsCIDRs` and `AllowNondistributableArtifactsHostnames` + fields in the `RegistryConfig` struct in the `GET /info` response are omitted + in API v1.49. +* Deprecated: The `ContainerdCommit.Expected`, `RuncCommit.Expected`, and + `InitCommit.Expected` fields in the `GET /info` endpoint were deprecated + in API v1.48, and are now omitted in API v1.49. + ## v1.48 API changes [Docker Engine API v1.48](https://docs.docker.com/reference/api/engine/version/v1.48/) documentation diff --git a/_vendor/modules.txt b/_vendor/modules.txt index a945859abb37..e578e9d82872 100644 --- a/_vendor/modules.txt +++ b/_vendor/modules.txt @@ -1,6 +1,6 @@ -# github.com/moby/moby v28.0.2+incompatible +# github.com/moby/moby v28.1.0-rc.2+incompatible # github.com/moby/buildkit v0.21.0 # github.com/docker/buildx v0.23.0 -# github.com/docker/cli v28.0.4+incompatible +# github.com/docker/cli v28.1.0-rc.2+incompatible # github.com/docker/compose/v2 v2.35.0 # github.com/docker/scout-cli v1.15.0 diff --git a/content/manuals/engine/release-notes/28.md b/content/manuals/engine/release-notes/28.md index b939d6f226ff..2d8d74041127 100644 --- a/content/manuals/engine/release-notes/28.md +++ b/content/manuals/engine/release-notes/28.md @@ -13,6 +13,7 @@ aliases: - /release-notes/docker-ce/ - /release-notes/docker-engine/ - /engine/release-notes/28.0/ +- /engine/release-notes/28.1/ --- This page describes the latest changes, additions, known issues, and fixes for Docker Engine version 28. @@ -22,6 +23,78 @@ For more information about: - Deprecated and removed features, see [Deprecated Engine Features](../deprecated.md). - Changes to the Engine API, see [Engine API version history](/reference/api/engine/version-history.md). +## 28.1.0 + +{{< release-date date="2025-04-17" >}} + +For a full list of pull requests and changes in this release, refer to the relevant GitHub milestones: + +- [docker/cli, 28.1.0 milestone](https://github.com/docker/cli/issues?q=is%3Aclosed+milestone%3A28.1.0) +- [moby/moby, 28.1.0 milestone](https://github.com/moby/moby/issues?q=is%3Aclosed+milestone%3A28.1.0) + +### New + +- Add `docker bake` sub-command as alias for `docker buildx bake`. [docker/cli#5947](https://github.com/docker/cli/pull/5947) +- Experimental: add a new `--use-api-socket` flag on `docker run` and `docker create` to enable access to Docker socket from inside a container and to share credentials from the host with the container. [docker/cli#5858](https://github.com/docker/cli/pull/5858) +- `docker image inspect` now supports a `--platform` flag to inspect a specific platform of a multi-platform image. [docker/cli#5934](https://github.com/docker/cli/pull/5934) + +### Bug fixes and enhancements + +- Add CLI shell-completion for context names. [docker/cli#6016](https://github.com/docker/cli/pull/6016) +- Fix `docker images --tree` not including non-container images content size in the total image content size. [docker/cli#6000](https://github.com/docker/cli/pull/6000) +- Fix `docker load` not preserving replaced images. [moby/moby#49650](https://github.com/moby/moby/pull/49650) +- Fix `docker login` hints when logging in to a custom registry. [docker/cli#6015](https://github.com/docker/cli/pull/6015) +- Fix `docker stats` not working properly on machines with high CPU core count. [moby/moby#49734](https://github.com/moby/moby/pull/49734) +- Fix a regression causing `docker pull/push` to fail when interacting with a private repository. [docker/cli#5964](https://github.com/docker/cli/pull/5964) +- Fix an issue preventing rootless Docker setup on a host with no `ip_tables` kernel module. [moby/moby#49727](https://github.com/moby/moby/pull/49727) +- Fix an issue that could lead to unwanted iptables rules being restored and never deleted following a firewalld reload. [moby/moby#49728](https://github.com/moby/moby/pull/49728) +- Improve CLI completion of `docker service scale`. [docker/cli#5968](https://github.com/docker/cli/pull/5968) +- `docker images --tree` now hides both untagged and dangling images by default. [docker/cli#5924](https://github.com/docker/cli/pull/5924) +- `docker system info` will provide an exit code if a connection cannot be established to the Docker daemon. [docker/cli#5918](https://github.com/docker/cli/pull/5918) +- containerd image store: Fix `image tag` event not being emitted when building with BuildKit. [moby/moby#49678](https://github.com/moby/moby/pull/49678) +- containerd image store: Improve `docker push/pull` handling of remote registry errors. [moby/moby#49770](https://github.com/moby/moby/pull/49770) +- containerd image store: Show pull progress for non-layer image blobs. [moby/moby#49746](https://github.com/moby/moby/pull/49746) + +### Packaging updates + +- Add Debian "Trixie" packages. [docker/docker-ce-packaging#1181](https://github.com/docker/docker-ce-packaging/pull/1181) +- Add Fedora 42 packages. [docker/containerd-packaging#418](https://github.com/docker/containerd-packaging/pull/418), [docker/docker-ce-packaging#1169](https://github.com/docker/docker-ce-packaging/pull/1169) +- Add Ubuntu 25.04 "Plucky Puffin" packages. [docker/containerd-packaging#419](https://github.com/docker/containerd-packaging/pull/419), [docker/docker-ce-packaging#1177](https://github.com/docker/docker-ce-packaging/pull/1177) +- Update BuildKit to [v0.21.0](https://github.com/moby/buildkit/releases/tag/v0.21.0). [moby/moby#49809](https://github.com/moby/moby/pull/49809) +- Update Compose to [v2.35.0](https://github.com/docker/compose/releases/tag/v2.35.0). [docker/docker-ce-packaging#1183](https://github.com/docker/docker-ce-packaging/pull/1183) +- Update Go runtime to [1.23.8](https://go.dev/doc/devel/release#go1.23.8). [docker/cli#5986](https://github.com/docker/cli/pull/5986), [docker/docker-ce-packaging#1180](https://github.com/docker/docker-ce-packaging/pull/1180), [moby/moby#49737](https://github.com/moby/moby/pull/49737) + +### Networking + +- Fix a bug causing host port-mappings on Swarm containers to be duplicated on `docker ps` and `docker inspect`. [moby/moby#49724](https://github.com/moby/moby/pull/49724) +- Fix an issue that caused container network attachment to fail with error "Bridge port not forwarding". [moby/moby#49705](https://github.com/moby/moby/pull/49705) +- Fix an issue with removal of a `--link` from a container in the default bridge network. [moby/moby#49778](https://github.com/moby/moby/pull/49778) +- Improve how network-endpoint relationships are tracked to reduce the chance of the "has active endpoints" error to be wrongfully returned. [moby/moby#49736](https://github.com/moby/moby/pull/49736) +- Improve the "has active endpoints" error message by including the name of endpoints still connected to the network being deleted. [moby/moby#49773](https://github.com/moby/moby/pull/49773) + +### API + +- Update API version to [v1.49](https://docs.docker.com/engine/api/v1.49/). [moby/moby#49718](https://github.com/moby/moby/pull/49718) +- `GET /image/{name}/json` now supports a `platform` parameter allowing to specify which platform variant of a multi-platform image to inspect. [moby/moby#49586](https://github.com/moby/moby/pull/49586) +- `GET /info` now returns a `FirewallBackend` containing information about the daemon's firewalling configuration. [moby/moby#49761](https://github.com/moby/moby/pull/49761) + +### Go SDK + +- Update minimum required Go version to go1.23. [docker/cli#5868](https://github.com/docker/cli/pull/5868) +- cli/command/context: remove temporary `ContextType` field from JSON output. [docker/cli#5981](https://github.com/docker/cli/pull/5981) +- client: Keep image references in canonical format where possible. [moby/moby#49609](https://github.com/moby/moby/pull/49609) + +### Deprecations + +- API: Deprecated `AllowNondistributableArtifactsCIDRs` and `AllowNondistributableArtifactsHostnames` fields in the `RegistryConfig` struct in the `GET /info` response are omitted in API v1.49. [moby/moby#49749](https://github.com/moby/moby/pull/49749) +- API: Deprecated: The `ContainerdCommit.Expected`, `RuncCommit.Expected`, and `InitCommit.Expected` fields in the `GET /info` endpoint were deprecated in API v1.48, and are now omitted in API v1.49. [moby/moby#48556](https://github.com/moby/moby/pull/48556) +- Go-SDK: cli/command/image: Deprecate `RunPull`: this function was only used internally and will be removed in the next release. [docker/cli#5975](https://github.com/docker/cli/pull/5975) +- Go-SDK: cli/config/configfile: deprecate `ConfigFile.Experimental` field. Experimental CLI features are always enabled since version v20.10 and this field is no longer used. Use `ConfigFile.Features` instead for optional features. This field will be removed in a future release. [docker/cli#5977](https://github.com/docker/cli/pull/5977) +- Go-SDK: deprecate `pkg/archive`, which was migrated to `github.com/moby/go-archive`. [moby/moby#49743](https://github.com/moby/moby/pull/49743) +- Go-SDK: deprecate `pkg/atomicwriter`, which was migrated to `github.com/moby/sys/atomicwriter`. [moby/moby#49748](https://github.com/moby/moby/pull/49748) +- Go-SDK: opts: remove deprecated `PortOpt`, `ConfigOpt`, `SecretOpt` aliases. [docker/cli#5953](https://github.com/docker/cli/pull/5953) +- Go-SDK: registry: deprecate `APIEndpoint.Official` field. [moby/moby#49706](https://github.com/moby/moby/pull/49706) + ## 28.0.4 {{< release-date date="2025-03-25" >}} diff --git a/content/reference/api/engine/version/v1.48.md b/content/reference/api/engine/version/v1.48.md index b55622392050..88e36b559748 100644 --- a/content/reference/api/engine/version/v1.48.md +++ b/content/reference/api/engine/version/v1.48.md @@ -3,6 +3,4 @@ linkTitle: v1.48 title: Docker Engine API v1.48 reference aliases: - /engine/api/v1.48/ - - /engine/api/latest/ - - /reference/api/engine/latest/ --- diff --git a/content/reference/api/engine/version/v1.49.md b/content/reference/api/engine/version/v1.49.md new file mode 100644 index 000000000000..394722071d33 --- /dev/null +++ b/content/reference/api/engine/version/v1.49.md @@ -0,0 +1,8 @@ +--- +linkTitle: v1.49 +title: Docker Engine API v1.49 reference +aliases: + - /engine/api/v1.49/ + - /engine/api/latest/ + - /reference/api/engine/latest/ +--- diff --git a/go.mod b/go.mod index b19b80e56f8d..8cbd447281bd 100644 --- a/go.mod +++ b/go.mod @@ -6,18 +6,18 @@ toolchain go1.24.1 require ( github.com/docker/buildx v0.23.0 // indirect - github.com/docker/cli v28.0.4+incompatible // indirect + github.com/docker/cli v28.1.0-rc.2+incompatible // indirect github.com/docker/compose/v2 v2.35.0 // indirect github.com/docker/scout-cli v1.15.0 // indirect github.com/moby/buildkit v0.21.0 // indirect - github.com/moby/moby v28.0.2+incompatible // indirect + github.com/moby/moby v28.1.0-rc.2+incompatible // indirect ) replace ( github.com/docker/buildx => github.com/docker/buildx v0.23.0 - github.com/docker/cli => github.com/docker/cli v28.0.2+incompatible + github.com/docker/cli => github.com/docker/cli v28.1.0-rc.2+incompatible github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.35.0 github.com/docker/scout-cli => github.com/docker/scout-cli v1.15.0 github.com/moby/buildkit => github.com/moby/buildkit v0.20.0 - github.com/moby/moby => github.com/moby/moby v28.0.2+incompatible + github.com/moby/moby => github.com/moby/moby v28.1.0-rc.2+incompatible ) diff --git a/go.sum b/go.sum index 4c52ab50f7f1..f08edec55f5c 100644 --- a/go.sum +++ b/go.sum @@ -164,6 +164,8 @@ github.com/docker/cli v28.0.1+incompatible h1:g0h5NQNda3/CxIsaZfH4Tyf6vpxFth7PYl github.com/docker/cli v28.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v28.0.2+incompatible h1:cRPZ77FK3/IXTAIQQj1vmhlxiLS5m+MIUDwS6f57lrE= github.com/docker/cli v28.0.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v28.1.0-rc.2+incompatible h1:BDhiR2nacubawpKAWFLqZmjGkARWPtYmUmy5gg4k/f8= +github.com/docker/cli v28.1.0-rc.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/compose-cli v1.0.35 h1:uZyEHLalfqBS2PiTpA1LAULyJmuQ+YtZg7nG4Xl3/Cc= github.com/docker/compose-cli v1.0.35/go.mod h1:mSXI4hFLpRU3EtI8NTo32bNwI0UXSr8jnq+/rYjGAUU= github.com/docker/compose/v2 v2.22.0 h1:3rRz4L7tPU75wRsV8JZh2/aTgerQvPa1cpzZN+tHqUY= @@ -410,6 +412,8 @@ github.com/moby/moby v28.0.1+incompatible h1:10ejBTwFhM3/9p6pSaKrLyXnx7QzzCmCYHA github.com/moby/moby v28.0.1+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= github.com/moby/moby v28.0.2+incompatible h1:CZfEXXYP3TYmdaYw4llMj7NIHA++tQzDiPk8mtryjL4= github.com/moby/moby v28.0.2+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= +github.com/moby/moby v28.1.0-rc.2+incompatible h1:F9Ku4A7eCFvb9cYR/jk7sLC6U9+r2u4vzjwZQzv/EQc= +github.com/moby/moby v28.1.0-rc.2+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= diff --git a/hugo.yaml b/hugo.yaml index 86fb60d1ed75..13eed7cc8021 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -132,16 +132,16 @@ params: # Use `grep` to figure out how they might be used. # Latest version of the Docker Engine API - latest_engine_api_version: "1.48" + latest_engine_api_version: "1.49" # Latest version of Docker Engine - docker_ce_version: "28.0.4" + docker_ce_version: "28.1.0" # Previous version of the Docker Engine # (Used to show e.g., "latest" and "latest"-1 in engine install examples - docker_ce_version_prev: "28.0.3" + docker_ce_version_prev: "28.0.4" # Latest Docker Compose version compose_version: "v2.35.0" # Latest BuildKit version - buildkit_version: "0.20.2" + buildkit_version: "0.21.0" # Example runtime/library/os versions example_go_version: "1.23" From a6a887c1cbc608df12403886997a2459a1cd4fe6 Mon Sep 17 00:00:00 2001 From: Craig Osterhout <103533812+craig-osterhout@users.noreply.github.com> Date: Thu, 17 Apr 2025 13:37:39 -0700 Subject: [PATCH 316/699] glossary: add static terms (#22401) ## Description Reverted the glossary back to some static terms and instead added a tip to ask AI. https://deploy-preview-22401--docsdocker.netlify.app/reference/glossary/ ## Related issues or tickets ## Reviews - [ ] Editorial review --------- Signed-off-by: Craig --- content/reference/glossary.md | 15 ++++++- data/glossary.yaml | 78 ++++++++++++++++++++++++++++++++++ layouts/_default/glossary.html | 39 +++++++++++++++++ 3 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 data/glossary.yaml create mode 100644 layouts/_default/glossary.html diff --git a/content/reference/glossary.md b/content/reference/glossary.md index 33df8a4760a0..333da26ad87e 100644 --- a/content/reference/glossary.md +++ b/content/reference/glossary.md @@ -3,10 +3,21 @@ title: Glossary description: Glossary of terms used around Docker keywords: glossary, docker, terms, definitions notoc: true +layout: glossary aliases: - /engine/reference/glossary/ - /glossary/ --- -Need a definition? Docker's AI-powered assistant can help. Select **Ask AI** in the -top navigation and ask it to define a term. \ No newline at end of file +> [!TIP] +> +> Looking for a definition that's not listed or need a more context-aware +> explanation? +> +> Try Ask AI. + + + \ No newline at end of file diff --git a/data/glossary.yaml b/data/glossary.yaml new file mode 100644 index 000000000000..7fbad242ddfd --- /dev/null +++ b/data/glossary.yaml @@ -0,0 +1,78 @@ +base image: | + A base image is an image you designate in a `FROM` directive in a Dockerfile. + It defines the starting point for your build. + Dockerfile instructions create additional layers on top of the base image. + A Dockerfile with the `FROM scratch` directive uses an empty base image. + +build: | + Build is the process of building Docker images using a Dockerfile. The build + uses a Dockerfile and a "context". The context is the set of files in the + directory in which the image is built. + +container: | + A container is a runnable instance of an image. You can start, stop, move, or + delete a container using the Docker CLI or API. Containers are isolated from + one another and the host system but share the OS kernel. They provide a + lightweight and consistent way to run applications. + +context: | + A Docker context contains endpoint configuration for the Docker CLI to connect + to different Docker environments, such as remote Docker hosts or Docker + Desktop. Use `docker context use` to switch between contexts. + +Docker CLI: | + The Docker CLI is the command-line interface for interacting with the Docker + Engine. It provides commands like `docker run`, `docker build`, `docker ps`, + and others to manage Docker containers, images, and services. + +Docker Compose: | + Docker Compose is a tool for defining and running multi-container Docker + applications using a YAML file (`compose.yaml`). With a single command, you + can start all services defined in the configuration. + +Docker Desktop: | + Docker Desktop is an easy-to-install application for Windows, macOS, and Linux + that provides a local Docker development environment. It includes Docker + Engine, Docker CLI, Docker Compose, and a Kubernetes cluster. + +Docker Engine: | + Docker Engine is the client-server technology that creates and runs Docker + containers. It includes the Docker daemon (`dockerd`), REST API, and the + Docker CLI client. + +Docker Hub: | + Docker Hub is Docker’s public registry service where users can store, share, + and manage container images. It hosts Docker Official Images, Verified + Publisher content, and community-contributed images. + +image: | + An image is a read-only template used to create containers. It typically + includes a base operating system and application code packaged together using + a Dockerfile. Images are versioned using tags and can be pushed to or pulled + from a container registry like Docker Hub. + +layer: | + In an image, a layer is a modification represented by an instruction in the + Dockerfile. Layers are applied in sequence to the base image to create the + final image. Unchanged layers are cached, making image builds faster and more + efficient. + +multi-architecture image: | + A multi-architecture image is a Docker image that supports multiple CPU + architectures, like `amd64` or `arm64`. Docker automatically pulls the correct + architecture image for your platform when using a multi-arch image. + +persistent storage: | + Persistent storage or volume storage provides a way for containers to retain + data beyond their lifecycle. This storage can exist on the host machine or an + external storage system and is not tied to the container's runtime. + +registry: | + A registry is a storage and content delivery system for Docker images. The + default public registry is Docker Hub, but you can also set up private + registries using Docker Distribution. + +volume: | + A volume is a special directory within a container that bypasses the Union + File System. Volumes are designed to persist data independently of the + container lifecycle. Docker supports host, anonymous, and named volumes. \ No newline at end of file diff --git a/layouts/_default/glossary.html b/layouts/_default/glossary.html new file mode 100644 index 000000000000..cc4da2ee3b51 --- /dev/null +++ b/layouts/_default/glossary.html @@ -0,0 +1,39 @@ +{{ define "left" }} + {{ partial "sidebar/mainnav.html" . }} + {{ partial "sidebar/sections.html" . }} +{{ end }} + +{{ define "main" }} + {{ partial "breadcrumbs.html" . }} +
+ {{ with .Title }} +

{{ . }}

+ {{ end }} + {{ with .Content }} + {{ . }} + {{ end }} + + + + + + + + + {{ range $term, $definition := site.Data.glossary }} + + + + + {{ end }} + +
TermDefinition
+ + {{ $term }} + {{ $definition | $.RenderString }}
+
+{{ end }} + +{{ define "right" }} + {{ partial "aside.html" . }} +{{ end }} \ No newline at end of file From 0583f11b717758c6d5a47f989273c2c903ef0772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Gronowski?= Date: Fri, 18 Apr 2025 11:51:53 +0200 Subject: [PATCH 317/699] engine: v28.1.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Paweł Gronowski --- content/manuals/engine/release-notes/28.md | 23 ++++++++++++++++++++++ hugo.yaml | 4 ++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/content/manuals/engine/release-notes/28.md b/content/manuals/engine/release-notes/28.md index 2d8d74041127..015be60b89b6 100644 --- a/content/manuals/engine/release-notes/28.md +++ b/content/manuals/engine/release-notes/28.md @@ -23,6 +23,29 @@ For more information about: - Deprecated and removed features, see [Deprecated Engine Features](../deprecated.md). - Changes to the Engine API, see [Engine API version history](/reference/api/engine/version-history.md). +## 28.1.1 + +{{< release-date date="2025-04-18" >}} + +For a full list of pull requests and changes in this release, refer to the relevant GitHub milestones: + +- [docker/cli, 28.1.1 milestone](https://github.com/docker/cli/issues?q=is%3Aclosed+milestone%3A28.1.1) +- [moby/moby, 28.1.1 milestone](https://github.com/moby/moby/issues?q=is%3Aclosed+milestone%3A28.1.1) + +### Bug fixes and enhancements + +- Fix `dockerd-rootless-setuptool.sh` incorrectly reporting missing `iptables`. [moby/moby#49833](https://github.com/moby/moby/pull/49833) +- containerd image store: Fix a potential daemon crash when using `docker load` with archives containing zero-size tar headers. [moby/moby#49837](https://github.com/moby/moby/pull/49837) + +### Packaging updates + +- Update Buildx to [v0.23.0](https://github.com/docker/buildx/releases/tag/v0.23.0). [docker/docker-ce-packaging#1185](https://github.com/docker/docker-ce-packaging/pull/1185) +- Update Compose to [v2.35.1](https://github.com/docker/compose/releases/tag/v2.35.1). [docker/docker-ce-packaging#1188](https://github.com/docker/docker-ce-packaging/pull/1188) + +### Networking + +- Add a warning to a container's `/etc/resolv.conf` when no upstream DNS servers were found. [moby/moby#49827](https://github.com/moby/moby/pull/49827) + ## 28.1.0 {{< release-date date="2025-04-17" >}} diff --git a/hugo.yaml b/hugo.yaml index 13eed7cc8021..c479873e4bf4 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -134,10 +134,10 @@ params: # Latest version of the Docker Engine API latest_engine_api_version: "1.49" # Latest version of Docker Engine - docker_ce_version: "28.1.0" + docker_ce_version: "28.1.1" # Previous version of the Docker Engine # (Used to show e.g., "latest" and "latest"-1 in engine install examples - docker_ce_version_prev: "28.0.4" + docker_ce_version_prev: "28.1.0" # Latest Docker Compose version compose_version: "v2.35.0" # Latest BuildKit version From 23589f14d261b3ece1234e76c30e6159f1769c4a Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Mon, 21 Apr 2025 09:06:29 -0400 Subject: [PATCH 318/699] security: caveats for admin-settings.json (#22441) ## Description - admin-settings.json required sign in & business subscription, or the file will not apply settings - updated prereqs to be clearer, added a known limitations section for air-gapped containers or regulated environments that can't authenticate ## Related issues or tickets - [ENGDOCS-2563](https://docker.atlassian.net/browse/ENGDOCS-2563) ## Reviews - [ ] Product review - [ ] Editorial review [ENGDOCS-2563]: https://docker.atlassian.net/browse/ENGDOCS-2563?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Craig Osterhout <103533812+craig-osterhout@users.noreply.github.com> --- .../settings-management/configure-json-file.md | 18 +++++++++++++++++- hugo_stats.json | 4 ++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md index 9b61004cf50f..0096692d5a89 100644 --- a/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md @@ -17,7 +17,23 @@ Settings Management is designed specifically for organizations who don’t give ## Prerequisites -You first need to [enforce sign-in](/manuals/security/for-admins/enforce-sign-in/_index.md) to ensure that all Docker Desktop developers authenticate with your organization. Since Settings Management requires a Docker Business subscription, enforced sign-in guarantees that only authenticated users have access and that the feature consistently takes effect across all users, even though it may still work without enforced sign-in. +You must [enforce sign-in](/manuals/security/for-admins/enforce-sign-in/_index.md) to ensure that all Docker Desktop users authenticate with your organization. + +Settings management requires a Docker Business subscription. Docker Desktop verifies the user's authentication and licensing before applying any settings from the `admin-settings.json` file. The settings file will not take effect unless both authentication and license checks pass. These checks ensure that only licensed users receive managed settings. + +> [!IMPORTANT] +> +> If a user is not signed in, or their Docker ID does not belong to an organization with a Docker Business subscription, Docker Desktop ignores the `admin-settings.json` file. + + +## Known limitations + +The `admin-settings.json` file requires users to authenticate with Docker Hub and be a member +of an organization with a Docker Business subscription. This means the file does not work in: + +- Air-grapped or offline environments where Docker Desktop can't authenticate with Docker Hub. +- Restricted environments where SSO and cloud-based authentication are not permitted. + ## Step one: Create the `admin-settings.json` file and save it in the correct location diff --git a/hugo_stats.json b/hugo_stats.json index a01b564ea82f..c940976a29e3 100644 --- a/hugo_stats.json +++ b/hugo_stats.json @@ -13,6 +13,7 @@ "-v", "-z-10", ".NET", + "AWS-Route-53", "Admin-Console", "After", "Angular", @@ -53,6 +54,8 @@ "Git-Bash-CLI", "GitLab", "Go", + "GoDaddy", + "Google-Cloud-DNS", "HTTP", "Heredocs", "Hyper-V-backend-x86_64", @@ -82,6 +85,7 @@ "Okta", "Okta-SAML", "Old-Dockerfile", + "Other-providers", "PHP", "PowerShell", "PowerShell-CLI", From e73846d9bb38ddd7bc30133aa33f82ea45a9ce13 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Tue, 22 Apr 2025 09:10:25 +0100 Subject: [PATCH 319/699] rm: projects docs (#22445) ## Description Removes project docs. They have been archived into the team's google drive ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/_index.md | 4 - content/manuals/projects/_index.md | 53 ------------- content/manuals/projects/about.md | 45 ----------- content/manuals/projects/edit.md | 47 ----------- content/manuals/projects/faq.md | 22 ------ content/manuals/projects/manage.md | 37 --------- content/manuals/projects/open.md | 121 ----------------------------- content/manuals/projects/share.md | 27 ------- content/manuals/projects/view.md | 80 ------------------- 9 files changed, 436 deletions(-) delete mode 100644 content/manuals/projects/_index.md delete mode 100644 content/manuals/projects/about.md delete mode 100644 content/manuals/projects/edit.md delete mode 100644 content/manuals/projects/faq.md delete mode 100644 content/manuals/projects/manage.md delete mode 100644 content/manuals/projects/open.md delete mode 100644 content/manuals/projects/share.md delete mode 100644 content/manuals/projects/view.md diff --git a/content/manuals/_index.md b/content/manuals/_index.md index b50d64a98b78..d7f80dbc4907 100644 --- a/content/manuals/_index.md +++ b/content/manuals/_index.md @@ -59,10 +59,6 @@ params: description: Run integration tests, with real dependencies, in the cloud. icon: package_2 link: https://testcontainers.com/cloud/docs/ - - title: Docker Projects - description: Use a unified, project-based workflow to run your containerized projects. - icon: folder - link: /projects/ platform: - title: Administration description: Centralized observability for companies and organizations. diff --git a/content/manuals/projects/_index.md b/content/manuals/projects/_index.md deleted file mode 100644 index 535b2d28c59e..000000000000 --- a/content/manuals/projects/_index.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Docker Projects -params: - sidebar: - group: Products - badge: - color: blue - text: Beta -weight: 50 -sitemap: false -description: Learn how to use Docker Projects which provides a unified, project-based workflow to run your containerized projects. -keywords: Docker, projects, docker deskotp, containerization -grid: -- title: How Docker Projects works - description: Learn How Docker Projects works - icon: category - link: /projects/about/ -- title: Open a new project - description: Learn how to open a new local or remote projects. - icon: checklist - link: /projects/open/ -- title: Edit your project - description: Edit your project's run commands and setup. N - icon: design_services - link: /projects/edit/ -- title: Manage your projects - description: Run or remove your projects. - icon: tune - link: /projects/manage/ -- title: View your projects - description: View detailed information about your projects and services within your projects - icon: visibility - link: /projects/view/ -- title: FAQs - description: View common FAQs about Docker Projects - icon: help - link: /projects/faq/ ---- - -{{< summary-bar feature_name="Docker Projects" >}} - -Docker Projects provides a simplified, project-based workflow for running and managing containerized applications. It organizes your code, configurations, and logs across local and cloud environments into a single view, making it easy to collaborate and share across teams. - -A project organizes your code and Docker artifacts into a single object. These artifacts include logs as well as customizable run commands. These artifacts can persist remotely in the cloud, which lets you access your projects from any device that has Docker Desktop. - -### Key features and benefits - - - One-click project setup: Open a local folder or clone a Git repository and run your project instantly. - - Minimal Docker expertise required: Ideal for both beginners and experienced developers. - - Custom `run` commands for your projects: Define and store pre-configured `run` commands that are equivalent to running `docker compose up`. - - Local and remote projects: Work on projects locally or sync artifacts to the cloud for cross-device access and easy collaboration. - -{{< grid >}} diff --git a/content/manuals/projects/about.md b/content/manuals/projects/about.md deleted file mode 100644 index d7f81fa1a6c7..000000000000 --- a/content/manuals/projects/about.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: How it works -description: Understand how Docker Projects works -keywords: docker projects -weight: 10 ---- - -Docker Projects requires a Compose file (`compose.yml`) to define your application's services, networks, and configurations. When you open a project, Docker Projects automatically detects the Compose file, allowing you to configure and run services with pre-set commands. - -By integrating with Docker Compose, Docker Projects ensures a consistent, easy-to-manage workflow for both individual developers and teams. Whether you're starting a new project, configuring it, or collaborating with a team, Docker Projects keeps the process simple. - -Docker Projects works as follows: - -1. Create or open a project. You can: - - - Open a local project: Select a folder on your machine that contains your project code. - - Clone a Git repository: Provide a repository URL and clone the project into a local directory. - - Once a project is opened, Docker Desktop detects the Compose file and prepares the project for execution. - -2. Configure and run your project with pre-configured commands. These commands: - - - Work like `docker compose up`, launching services based on the Compose file. - - Can be customized with additional flags, multiple Compose files, and environment variables. - - Enable pre-run tasks, such as executing scripts before starting the services. - - All of which means you can fine-tune your configurations without manually running complex CLI commands. - -3. Collaborate and share with teams. For projects linked to a Git repository, Docker Projects stores artifacts in the cloud, enabling easy collaboration: - - - Work across devices: Open a project from any machine and instantly access stored configurations. - - Share configurations: Team members can access pre-defined run commands, reducing setup time. - - Collaboration is easy — new developers can join a team, open a project, and start working without complex setup steps. - -4. Manage and iterate. Once a project is up and running, Docker Projects makes it easy to monitor, update, and troubleshoot: - - - View logs to debug issues and track service activity. - - Edit configurations and run commands as requirements change. - -## What's next - - - [Learn how to open a new project](/manuals/projects/open.md) - - [Explore common FAQs](/manuals/projects/faq.md) - diff --git a/content/manuals/projects/edit.md b/content/manuals/projects/edit.md deleted file mode 100644 index 0021fe98f7a2..000000000000 --- a/content/manuals/projects/edit.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Add or edit your run commands -description: Learn how to add or edit your run commands in Docker Projects -keywords: Docker, projects, docker deskotp, containerization, open, remote, local, run commands -weight: 40 ---- - -## Add a run command to a project - -1. Open an existing project and ensure that it is stopped. - -2. From the command drop-down menu, select **New run command**. - -3. Specify the following information for the run command: - - > [!TIP] - > - > While configuring your run command, you can view the equivalent `docker compose up` command in the **Run command** section on the configuration page. You can also use this command to run your project from the command line. You can refer to the [`docker compose up` reference documentation](/reference/cli/docker/compose/up.md) to learn more about the options you configure. - - - **Name**: Specify a name to identify the run command. - - **Compose files**: Select one or more Compose files from your project. - - **Flags**: Optionally, select one or more flags for your run command. - - > [!TIP] - > - > While the `--env-file` flag isn't currently supported, you can specify environment variables in your Compose file, or use the **Tasks** option to run a script that sets your environment variables. - - - **Services that will run**: After selecting one or more Compose files, the services defined in the files will appear here. If there is more than one service, you can optionally choose to not run a service by deselecting the checkbox. - - **Tasks (Advanced options)**: Optionally specify a command to run before running the project. For example, if you want to run a bash script from the project directory named `set-vars.sh`, you can specify bash `set-vars.sh`. Or, on Windows, to run a script with `cmd.exe` named `set-vars.bat`, specify `set-vars.bat`. Note that a task can access environment variables from your terminal profile, but it can't access local shell functions nor aliases. - -4. Select **Save changes**. - -You can now select the new run command from the drop-down menu after opening the project. - -## Edit a run command - -1. Open an existing project and ensure that it is stopped. - -2. Select the run command you want to change from the command drop-down menu. - -3. Select the **Edit** icon next to the **Run** button. - -4. Specify your changes and then select **Save changes**. - -## What's next? - - - [Manage your projects](/manuals/projects/manage.md) \ No newline at end of file diff --git a/content/manuals/projects/faq.md b/content/manuals/projects/faq.md deleted file mode 100644 index 88628a555067..000000000000 --- a/content/manuals/projects/faq.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: Docker Projects FAQs -linkTitle: FAQs -description: Find common FAQs for Docker Projects -keywords: faqs, docker projects, local, remote -weight: 70 ---- - -## Why is a Compose file required? - -A Compose file (`compose.yml`) defines how your application's containers should run together, including: - - - Services (e.g., web, database, API) - - Networks for inter-container communication - - Volumes for persistent data storage - - Environment variables and configurations - -Without a Compose file, Docker Projects doesn't have a way to understand how your application should be structured or executed. - -## What if my project doesn’t have a Compose file? - -If your project doesn't include a `compose.yml` file, you need to create one before opening it in Docker Projects. \ No newline at end of file diff --git a/content/manuals/projects/manage.md b/content/manuals/projects/manage.md deleted file mode 100644 index 097b609d819c..000000000000 --- a/content/manuals/projects/manage.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Manage your projects -description: Learn how to delete or completely remove a project. -keywords: Docker, projects, docker deskotp, containerization, open, remote, local -weight: 50 ---- - -## Run a project or service - -1. Open a new or existing project. - -2. Select a run command from the drop-down menu. - -3. Select the **Run** button for the project or the **Play** button next to the service you'd like to run. - -## Stop or restart a project or service - -1. Open an existing project that is running. - -2. Select the **Stop** or **Restart** button for the project or the appropriate button next to the service. - -## Remove a project from Docker Desktop - -If a project is associated with a Git repository, you can remove it from Docker Desktop. When a project is deleted, you can no longer run the project from the **Projects** view, but its run configuration still exists remotely in the cloud. - -This means that you can later [open the project](/manuals/projects/open.md#open-an-existing-remote-project) and associate it with the remote run configuration without having to specify the run command again. -None of your local code is deleted when removing a project from Docker Desktop. - -To remove a project from Docker Desktop: - -1. Sign in to Docker Desktop, and go to **Projects**. - -2. Select the **More actions** menu next to the project, and then select **Remove from Docker Desktop**. - -## Delete a project - -Deleting a project removes it from Docker Desktop and deletes all configuration locally and remotely from the cloud. When a project is deleted, you can no longer run the project from the **Projects** view. None of your local code is deleted when you delete a project from Docker Desktop. diff --git a/content/manuals/projects/open.md b/content/manuals/projects/open.md deleted file mode 100644 index 001c06c3c913..000000000000 --- a/content/manuals/projects/open.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Open a new project -description: Learn how to open a new local or remote project, or an existing project in Docker Projects. -keywords: Docker, projects, docker deskotp, containerization, open, remote, local -weight: 20 ---- - -> [!IMPORTANT] -> -> To use Docker Projects, you must enable the **Access experimental features** setting in Docker Desktop. See [Features in development](/manuals/desktop/settings-and-maintenance/settings.md#features-in-development) for more information. - -## New projects - -To run a new project, it must be stored locally. In the **Projects** view in Docker Desktop, local projects display the local path under the project. - -### Open a new local project - -A project consists of your code and at least one Compose file. Ensure that you have a Compose file before trying to open a new project. - -To open a new project: - -1. Sign in to Docker Desktop, and go to **Projects**. - -2. Select **Open a local folder**. This lets you select a local folder that contains your project’s code and a Compose file. - - > [!NOTE] - > - > A local folder can also be the folder of a Git repository that you have already cloned. - -3. Configure your project by giving it a name and setting the owner, then select **Next**. - - > [!NOTE] - > - > If you are part of a Docker organization you have the option to [share your project](share.md) with the organization. - -4. Specify how to run your project by selecting **New run command**: - - > [!TIP] - > - > While configuring your run command, you can view the equivalent `docker compose up` command in the **Run command** section on the configuration page. You can also use this command to run your project from the command line. You can refer to the [`docker compose up` reference documentation](/reference/cli/docker/compose/up.md) to learn more about the options you configure. - - - **Name**: Specify a name to identify the run command. - - **Compose files**: Select one or more Compose files from your project. - - **Flags**: Optionally, select one or more flags for your run command. - - > [!TIP] - > - > While the `--env-file` flag isn't currently supported, you can specify environment variables in your Compose file, or use the **Tasks** option to run a script that sets your environment variables. - - - **Services that will run**: After selecting one or more Compose files, the services defined in the files will appear here. If there is more than one service, you can optionally choose to not run a service by deselecting the checkbox. - - **Tasks (Advanced options)**: Optionally specify a command to run before running the project. For example, if you want to run a bash script from the project directory named `set-vars.sh`, you can specify bash `set-vars.sh`. Or, on Windows, to run a script with `cmd.exe` named `set-vars.bat`, specify `set-vars.bat`. Note that a task can access environment variables from your terminal profile, but it can't access local shell functions nor aliases. - -5. Select **Save changes**. - -Your project is now ready to run. - -### Open a new remote project - -The following steps prompt you to clone the Git repository for your project. - -If you have already cloned the repository outside of Docker Projects, then you can open the project as a new project and Docker Projects will automatically detect and link the repository. - -To clone and open a remote project: - -1. Sign in to Docker Desktop, and go to **Projects**. - -2. Select **Clone a git repository**. This lets you specify a Git repository and a local folder to clone that repository to. The repository must contain at least your project’s code and a Compose file. - -3. Enter the remote source and choose the local destination to clone to. - -4. Select **Clone project**. - -5. Configure your project by giving it a name and setting the owner, then select **Next**. - - > [!NOTE] - > - > If you are part of a Docker organization you have the option to [share your project](share.md) with the organization. - -6. Specify how to run your project by selecting **New run command**: - - > [!TIP] - > - > While configuring your run command, you can view the equivalent `docker compose up` command in the **Run command** section on the configuration page. You can also use this command to run your project from the command line. You can refer to the [`docker compose up` reference documentation](/reference/cli/docker/compose/up.md) to learn more about the options you configure. - - - **Name**: Specify a name to identify the run command. - - **Compose files**: Select one or more Compose files from your project. - - **Flags**: Optionally, select one or more flags for your run command. - - > [!TIP] - > - > While the `--env-file` flag isn't currently supported, you can specify environment variables in your Compose file, or use the **Tasks** option to run a script that sets your environment variables. - - - **Services that will run**: After selecting one or more Compose files, the services defined in the files will appear here. If there is more than one service, you can optionally choose to not run a service by deselecting the checkbox. - - **Tasks (Advanced options)**: Optionally specify a command to run before running the project. For example, if you want to run a bash script from the project directory named `set-vars.sh`, you can specify bash `set-vars.sh`. Or, on Windows, to run a script with `cmd.exe` named `set-vars.bat`, specify `set-vars.bat`. Note that a task can access environment variables from your terminal profile, but it can't access local shell functions nor aliases. - -7. Select **Save changes**. - -## Existing projects - -### Open an existing local project - -1. Sign in to Docker Desktop, and go to **Projects**. - -2. Open your project by selecting your project under **Recents**, or by selecting the specific owner that your project is associated with and then select your project. - -### Open an existing remote project - -In the **Projects** view in Docker Desktop, existing remote projects display **No local copy** under the project. - -You’ll see remote projects when you are new to the team and are accessing a shared project, remove a project from Docker Desktop, or access Docker Desktop from a new device after creating a project associated with a Git repository. - -To open an existing remote project, you can choose between: - - - Cloning the project into a local destination. - - Linking to an existing folder where the project has already been cloned - -## What's next? - - - [View your project](/manuals/projects/view.md) - - [Add or edit your run commands](/manuals/projects/edit.md) - - [Manage your projects](/manuals/projects/manage.md) diff --git a/content/manuals/projects/share.md b/content/manuals/projects/share.md deleted file mode 100644 index 70d7ee73ea9b..000000000000 --- a/content/manuals/projects/share.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Share and collaborate on a project -linkTitle: Collaborate -description: Learn how to collaborate on a project -keywords: collaborate, projects, docker desktop, local, remote -weight: 60 ---- - -Docker Projects makes it easy for teams to share, manage, and collaborate on containerized applications. - -Collaboration is managed by associating a project with a Docker organization, and leveraging cloud-stored configurations. This allows team members to easily access and work on the same project without needing extensive manual setup. - -Once a project is associated with an organization, other team members can access it by: - -1. Signing into Docker Desktop and navigating to **Projects**. - -2. Selecting the correct organization tab. - -3. Selecting the project from the list of shared projects. - -4. Cloning the project into a local destination. - -## What's next - - - [View your project](/manuals/projects/view.md) - - [Add or edit your run commands](/manuals/projects/edit.md) - - [Manage your projects](/manuals/projects/manage.md) diff --git a/content/manuals/projects/view.md b/content/manuals/projects/view.md deleted file mode 100644 index 3e45b5490b44..000000000000 --- a/content/manuals/projects/view.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: View your project -description: View information about your project or the services within your project. -keywords: containers, docker projects, local, remote, docker desktop -weight: 30 ---- - -## View a project’s README - -If a project has a README file, you can view it via Docker Projects. Note that the README tab is only visible if the project has a README file. - -To view a project’s README, open a new or existing project and then select the README tab. - -## View logs for a project - -1. Open a new or existing project. - -2. Select the **Logs** tab to see all project logs. - -3. Optionally, use the menu in the top right corner of the logs to copy the logs to your clipboard or clear the logs. - -## View service-level information - -With Docker Projects, you can view the following information about your containers within your project: - - - Logs - - Image - - Files - - Network - - Environment variables - -From the **Exec** tab, you can use the integrated terminal, on a running container, directly within Docker Desktop. You are able to quickly run commands within your container so you can understand its current state or debug when something goes wrong. - -### Logs - -Select **Logs** to see logs from the containers in your project. You can also: - -- Use `Cmd + f`/`Ctrl + f` to open the search bar and find specific entries. - Search matches are highlighted in yellow. -- Press `Enter` or `Shift + Enter` to jump to the next or previous search match - respectively. -- Use the **Copy** icon in the top right-hand corner to copy all the logs to - your clipboard. -- Automatically copy any logs content by highlighting a few lines or a section - of the logs. -- Use the **Clear terminal** icon in the top right-hand corner to clear the - logs terminal. -- Select and view external links that may be in your logs. - -### Image - -The **Image** tab in Docker Projects provides details about the Docker image associated with a service. It helps you verify which image is being used, when it was last built, and where the corresponding Dockerfile is located. - -It also provides quick access to inspect the image or open the Dockerfile for modifications. - -### Files - -Select **Files** to explore the filesystem of running or stopped containers in your project. You -can also: - - - See which files have been recently added, modified, or deleted - - Edit a file straight from the built-in editor - - Drag and drop files and folders between the host and the container - - Delete unnecessary files when you right-click on a file - - Download files and folders from the container straight to the host - -### Network - -The **Network** tab in Docker Projects provides an overview of how the containerized services communicate with each other and the host system. It displays the assigned network name, connected services, and mapped container ports. - -If a service is mapped to a host port, you can select the link to open it in a browser - -### Environment variables - -The **Env** tab in Docker Projects displays the environment variables available to a service. These variables help configure the runtime environment without modifying the container image. - -## What's next? - - - [Add or edit your run commands](/manuals/projects/edit.md) - - [Manage your projects](/manuals/projects/manage.md) From 4f7b212c9a41ee4b022038e9970734117bc7126e Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Tue, 22 Apr 2025 11:38:36 +0300 Subject: [PATCH 320/699] Fix the link to the "Running containers" documentation in the "Using lifecycle hooks with Compose" manual (#22451) ## Description [The current documentation link](https://github.com/manuals//engine/containers/run.md#default-command-and-options) responds with `Not Found`. See the available manuals for containers [here](https://github.com/docker/docs/tree/main/content/manuals/engine/containers). --------- Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- content/manuals/compose/how-tos/lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/compose/how-tos/lifecycle.md b/content/manuals/compose/how-tos/lifecycle.md index ef43083d520b..d60a942d9691 100644 --- a/content/manuals/compose/how-tos/lifecycle.md +++ b/content/manuals/compose/how-tos/lifecycle.md @@ -11,7 +11,7 @@ keywords: cli, compose, lifecycle, hooks reference ## Services lifecycle hooks When Docker Compose runs a container, it uses two elements, -[ENTRYPOINT and COMMAND](https://github.com/manuals//engine/containers/run.md#default-command-and-options), +[ENTRYPOINT and COMMAND](/manuals/engine/containers/run.md#default-command-and-options), to manage what happens when the container starts and stops. However, it can sometimes be easier to handle these tasks separately with lifecycle hooks - From 211733e3d35dabe7ffa39b9f5155d3239776c337 Mon Sep 17 00:00:00 2001 From: Jakub Meysner Date: Tue, 22 Apr 2025 10:47:47 +0200 Subject: [PATCH 321/699] Fix typos in wasm.md (#22455) ## Description Fix 2 small typos in the Wasm workloads doc. ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/desktop/features/wasm.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/manuals/desktop/features/wasm.md b/content/manuals/desktop/features/wasm.md index eba9c67ed008..35df7ca492c2 100644 --- a/content/manuals/desktop/features/wasm.md +++ b/content/manuals/desktop/features/wasm.md @@ -15,7 +15,7 @@ params: {{< summary-bar feature_name="Wasm workloads" >}} -WebAssembly (Wasm) is a fast, light alternative Linux and +WebAssembly (Wasm) is a fast, light alternative to Linux and Windows containers. With Docker Desktop, you can now run Wasm workloads side by side with traditional containers. This page provides information about the ability to run Wasm applications @@ -93,7 +93,7 @@ Start the application using the normal Docker Compose commands: ### Running a multi-service application with Wasm -Networking works the same as you expect with Linux containers, giving you the +Networking works the same as you'd expect with Linux containers, giving you the flexibility to combine Wasm applications with other containerized workloads, such as a database, in a single application stack. From 452734fa3a83777b1b16af52ce4b57a08a376ee8 Mon Sep 17 00:00:00 2001 From: karman <110832017+karman-docker@users.noreply.github.com> Date: Tue, 22 Apr 2025 09:07:29 +0000 Subject: [PATCH 322/699] call out the behavior when PAC file download fails (#22464) ## Description ## Related issues or tickets https://docker.slack.com/archives/C02DDPKLJ0J/p1744707532756369?thread_ts=1744293644.289759&cid=C02DDPKLJ0J ## Reviews - [ ] Technical review - [x] Editorial review - [ ] Product review --- .../for-admins/hardened-desktop/air-gapped-containers.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/manuals/security/for-admins/hardened-desktop/air-gapped-containers.md b/content/manuals/security/for-admins/hardened-desktop/air-gapped-containers.md index 8c980376b682..595493ef4d92 100644 --- a/content/manuals/security/for-admins/hardened-desktop/air-gapped-containers.md +++ b/content/manuals/security/for-admins/hardened-desktop/air-gapped-containers.md @@ -52,6 +52,7 @@ The `containersProxy` setting describes the policy which is applied to traffic f > [!IMPORTANT] > > Any existing `proxy` setting in the `admin-settings.json` file continues to apply to traffic from the app on the host. +> If the PAC file download fails, the Docker Desktop app and its containers do not block the request; instead, they attempt to connect directly to the target URL. ## Example PAC file From 8339b4473e7ded0b41e03f7652d3b6e3040a84a6 Mon Sep 17 00:00:00 2001 From: Guillaume Lours <705411+glours@users.noreply.github.com> Date: Tue, 22 Apr 2025 11:10:09 +0200 Subject: [PATCH 323/699] release-notes for Compose v2.35.1 version (#22456) ## Description Add release notes for latest Compose release `v2.35.1` ## Related issues or tickets N/A ## Reviews - [ ] Technical review - [x] Editorial review - [ ] Product review Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> --- _vendor/modules.txt | 4 ++-- .../manuals/compose/releases/release-notes.md | 23 ++++++++++++++++--- go.mod | 6 ++--- go.sum | 2 ++ hugo.yaml | 2 +- 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/_vendor/modules.txt b/_vendor/modules.txt index e578e9d82872..ca334bf0d1a8 100644 --- a/_vendor/modules.txt +++ b/_vendor/modules.txt @@ -1,6 +1,6 @@ # github.com/moby/moby v28.1.0-rc.2+incompatible # github.com/moby/buildkit v0.21.0 # github.com/docker/buildx v0.23.0 -# github.com/docker/cli v28.1.0-rc.2+incompatible -# github.com/docker/compose/v2 v2.35.0 +# github.com/docker/cli v28.1.0+incompatible +# github.com/docker/compose/v2 v2.35.1 # github.com/docker/scout-cli v1.15.0 diff --git a/content/manuals/compose/releases/release-notes.md b/content/manuals/compose/releases/release-notes.md index 3b59ca3b7474..c8e6064da395 100644 --- a/content/manuals/compose/releases/release-notes.md +++ b/content/manuals/compose/releases/release-notes.md @@ -13,6 +13,23 @@ aliases: For more detailed information, see the [release notes in the Compose repo](https://github.com/docker/compose/releases/). +## 2.35.1 + +{{< release-date date="2025-04-17" >}} + +### Bug fixes and enhancements + +- Fixed an issue with bind mounts + +### Update + +- Dependencies upgrade: bump compose-go to v2.6.0 +- Dependencies upgrade: bump docker engine and cli to v28.0.4 +- Dependencies upgrade: bump buildx to v0.22.0 + + + + ## 2.35.0 {{< release-date date="2025-04-10" >}} @@ -30,9 +47,9 @@ For more detailed information, see the [release notes in the Compose repo](https ### Update -- Dependencies upgrade: bump compose-go to v2.6.0 -- Dependencies upgrade: bump docker engine and cli to v28.0.4 -- Dependencies upgrade: bump buildx to v0.22.0 +- Dependencies upgrade: bump docker engine and cli to v28.1.0 +- Dependencies upgrade: bump buildx to v0.23.0 +- Dependencies upgrade: bump buildkit to v0.21.0 ## 2.34.0 diff --git a/go.mod b/go.mod index 8cbd447281bd..155f635ef101 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ toolchain go1.24.1 require ( github.com/docker/buildx v0.23.0 // indirect - github.com/docker/cli v28.1.0-rc.2+incompatible // indirect - github.com/docker/compose/v2 v2.35.0 // indirect + github.com/docker/cli v28.1.0+incompatible // indirect + github.com/docker/compose/v2 v2.35.1 // indirect github.com/docker/scout-cli v1.15.0 // indirect github.com/moby/buildkit v0.21.0 // indirect github.com/moby/moby v28.1.0-rc.2+incompatible // indirect @@ -16,7 +16,7 @@ require ( replace ( github.com/docker/buildx => github.com/docker/buildx v0.23.0 github.com/docker/cli => github.com/docker/cli v28.1.0-rc.2+incompatible - github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.35.0 + github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.35.1 github.com/docker/scout-cli => github.com/docker/scout-cli v1.15.0 github.com/moby/buildkit => github.com/moby/buildkit v0.20.0 github.com/moby/moby => github.com/moby/moby v28.1.0-rc.2+incompatible diff --git a/go.sum b/go.sum index f08edec55f5c..e0d9918a4407 100644 --- a/go.sum +++ b/go.sum @@ -229,6 +229,8 @@ github.com/docker/compose/v2 v2.34.0 h1:mUhgA6AiRVO9hEndD2G2oOQi5Y0g/4H8xSPVUc5T github.com/docker/compose/v2 v2.34.0/go.mod h1:TgTD4Ku0vOSB3NZgOXp6HcCE6wDSBjg7r8bjWraV5/4= github.com/docker/compose/v2 v2.35.0 h1:bU23OeFrbGyHYrKijMSEwkOeDg2TLhAGntU2F3hwX1o= github.com/docker/compose/v2 v2.35.0/go.mod h1:S5ejUILn9KTYC6noX3IxznWu3/sb3FxdZqIYbq4seAk= +github.com/docker/compose/v2 v2.35.1 h1:oRt5EE22een6DEAkNNQcuzJGhBS2rcMtEKdbfMhFIgk= +github.com/docker/compose/v2 v2.35.1/go.mod h1:Ydd9ceg7VBOPSVAsDDKfyGGAkjejH3cD91GSmHjuRhI= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= diff --git a/hugo.yaml b/hugo.yaml index c479873e4bf4..f858b1c35c74 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -139,7 +139,7 @@ params: # (Used to show e.g., "latest" and "latest"-1 in engine install examples docker_ce_version_prev: "28.1.0" # Latest Docker Compose version - compose_version: "v2.35.0" + compose_version: "v2.35.1" # Latest BuildKit version buildkit_version: "0.21.0" From dfa115290bb8b10077870149485673b59ff5c3d9 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Tue, 22 Apr 2025 17:13:47 +0300 Subject: [PATCH 324/699] Fix link to Celery docs --- content/manuals/build/building/best-practices.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/build/building/best-practices.md b/content/manuals/build/building/best-practices.md index 68ea0de2672b..eb308bcf862a 100644 --- a/content/manuals/build/building/best-practices.md +++ b/content/manuals/build/building/best-practices.md @@ -147,7 +147,7 @@ Limiting each container to one process is a good rule of thumb, but it's not a hard and fast rule. For example, not only can containers be [spawned with an init process](/manuals/engine/containers/multi-service_container.md), some programs might spawn additional processes of their own accord. For -instance, [Celery](https://docs.celeryproject.org/) can spawn multiple worker +instance, [Celery](https://docs.celeryq.dev/) can spawn multiple worker processes, and [Apache](https://httpd.apache.org/) can create one process per request. From 0c89cc74132d74f7aa4afd0e859da2109d4bef59 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Tue, 22 Apr 2025 12:16:40 -0400 Subject: [PATCH 325/699] security: remove outdated limitation and add suggestion for OATs (#22461) ## Description - PATs are transferred to org owners when converting a user account to an org now - Adds suggestion to use OATs - Preview: https://deploy-preview-22461--docsdocker.netlify.app/admin/organization/convert-account/ ## Related issues or tickets - [ENGDOCS-2567](https://docker.atlassian.net/browse/ENGDOCS-2567) ## Reviews - [ ] Editorial review [ENGDOCS-2567]: https://docker.atlassian.net/browse/ENGDOCS-2567?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- content/manuals/admin/organization/convert-account.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/content/manuals/admin/organization/convert-account.md b/content/manuals/admin/organization/convert-account.md index 00db9570d89f..66791d0396ef 100644 --- a/content/manuals/admin/organization/convert-account.md +++ b/content/manuals/admin/organization/convert-account.md @@ -48,7 +48,13 @@ Consider the following effects of converting your account: - The user account that you add as the first owner will have full administrative access to configure and manage the organization. -- Converting a user account to an organization will delete all of the user's personal access tokens. See [Create an access token](/manuals/security/for-developers/access-tokens.md#create-an-access-token) for steps on creating personal access tokens after converting the user account. +- To transfer a user's personal access tokens (PATs) to your converted organization, +you must designate the user as an organization owner. This will ensure any PATs associated with the user's account are transferred to the organization owner. + +> [!TIP] +> +> To avoid potentially disrupting service of personal access tokens when converting an account or changing ownership, it is recommended to use [organization access tokens](/manuals/security/for-admins/access-tokens.md). Organization access tokens are +associated with an organization, not a single user account. ## Convert an account into an organization From e2f2680e0933e29e5ce3f0afa9c8078ccad7855a Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Wed, 23 Apr 2025 09:32:57 -0400 Subject: [PATCH 326/699] Merge pull request #22462 from sarahsanders-docker/fix-llms fix: move llms page options out of title --- hugo_stats.json | 1 + layouts/partials/content-default.html | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/hugo_stats.json b/hugo_stats.json index c940976a29e3..0ba8fdcc0a2b 100644 --- a/hugo_stats.json +++ b/hugo_stats.json @@ -10,6 +10,7 @@ "-mt-0.5", "-mt-4", "-mt-8", + "-top-16", "-v", "-z-10", ".NET", diff --git a/layouts/partials/content-default.html b/layouts/partials/content-default.html index 0c81432398d6..20fce7bb335c 100644 --- a/layouts/partials/content-default.html +++ b/layouts/partials/content-default.html @@ -3,9 +3,6 @@ {{ partial "breadcrumbs.html" . }}

{{ .Title }} - - {{ partial "md-dropdown.html" . }} -

@@ -14,6 +11,9 @@

{{ .Content }} + + {{ partial "md-dropdown.html" . }} + From 7b9471d4b2dd3a34bf39a2766ec393eb2c4be40b Mon Sep 17 00:00:00 2001 From: Albert Tanure Date: Wed, 23 Apr 2025 23:28:06 +0200 Subject: [PATCH 327/699] Add: Add quickstart.md improvements (#22272) ## Description I did some improvements to the quickstart.md file, adding images and improve some descriptions to be albe to helo learners to find the references mentioned in the file. ## Related issues or tickets No related issues or ticket. ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Co-authored-by: Craig Osterhout <103533812+craig-osterhout@users.noreply.github.com> --- content/manuals/scout/quickstart.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/content/manuals/scout/quickstart.md b/content/manuals/scout/quickstart.md index 86d58151ea4b..7a1da8ae022c 100644 --- a/content/manuals/scout/quickstart.md +++ b/content/manuals/scout/quickstart.md @@ -84,10 +84,9 @@ Learn more about the `docker scout cves` command in the ## Step 4: Fix application vulnerabilities -The fix suggested by Docker Scout is to update -the underlying vulnerable express version to 4.17.3 or later. +After the Docker Scout analysis, a high vulnerability CVE-2022-24999 was found, caused by an outdated version of the **express** package. -1. Update the `package.json` file with the new package version. +The version 4.17.3 of the express package fixes the vulnerability. Therefore, update the `package.json` file to the new version: ```diff "dependencies": { @@ -95,15 +94,14 @@ the underlying vulnerable express version to 4.17.3 or later. + "express": "4.17.3" } ``` - -2. Rebuild the image with a new tag and push it to your Docker Hub repository: + +Rebuild the image with a new tag and push it to your Docker Hub repository: ```console $ docker build --push -t /scout-demo:v2 . ``` -Now, viewing the latest tag of the image in Docker Desktop, the Docker Scout -Dashboard, or CLI, you can see that you have fixed the vulnerability. +Run the `docker scout` command again and verify that HIGH CVE-2022-24999 is no longer present: ```console $ docker scout cves --only-package express @@ -154,7 +152,7 @@ $ docker scout config organization Now you can run the `quickview` command to get an overview of the compliance status for the image you just built. -The image is evaluated against the default policy configurations. +The image is evaluated against the default policy configurations. You'll see output similar to the following: ```console $ docker scout quickview @@ -209,7 +207,7 @@ The classic image store doesn't support manifest lists, which is how the provenance attestations are attached to an image. Open **Settings** in Docker Desktop. Under the **General** section, make sure -that the **Use containerd for pulling and storing images** option is checked. +that the **Use containerd for pulling and storing images** option is checked, then select **Apply & Restart**. Note that changing image stores temporarily hides images and containers of the inactive image store until you switch back. @@ -230,7 +228,9 @@ results through a different lens: the Docker Scout Dashboard. 3. Select **Images** in the left-hand navigation. The images page lists your Scout-enabled repositories. -Select the image in the list to open the **Image details** sidebar. + +Select the row for the image you want to view, anywhere in the row except on a link, to open the **Image details** sidebar. + The sidebar shows a compliance overview for the last pushed tag of a repository. > [!NOTE] @@ -239,13 +239,15 @@ The sidebar shows a compliance overview for the last pushed tag of a repository. > It might take a few minutes before the results appear if this is your > first time using the Docker Scout Dashboard. -Inspect the **Up-to-Date Base Images** policy. +Go back to the image list and select the image version, available in the **Most recent image** column. +Then, at the top right of the page, select the **Update base image** button to inspect the policy. + This policy checks whether base images you use are up-to-date. It currently has a non-compliant status, because the example image uses an old version `alpine` as a base image. -Select the **View fix** button next to the policy name for details about the violation, -and recommendations on how to address it. +Close the **Recommended fixes for base image** modal. In the policy listing, select **View fixes** button, next to the policy name for details about the violation, and recommendations on how to address it. + In this case, the recommended action is to enable [Docker Scout's GitHub integration](./integrations/source-code-management/github.md), which helps keep your base images up-to-date automatically. From d0e601bc89ef444cda0e02597e73c03261d9bbaa Mon Sep 17 00:00:00 2001 From: Monica Chao Date: Thu, 24 Apr 2025 05:24:38 -0500 Subject: [PATCH 328/699] Merge pull request #22474 from chaomonica/SEG-1124 docs: Added section explaining how RAM configurations restricting Docker hub interacts with mirror registries --- .../manuals/docker-hub/image-library/mirror.md | 15 +++++++++++++++ .../registry-access-management.md | 1 + 2 files changed, 16 insertions(+) diff --git a/content/manuals/docker-hub/image-library/mirror.md b/content/manuals/docker-hub/image-library/mirror.md index 427ee68f5f7d..9ab5fdf7b4e6 100644 --- a/content/manuals/docker-hub/image-library/mirror.md +++ b/content/manuals/docker-hub/image-library/mirror.md @@ -45,6 +45,21 @@ Hub can be mirrored. The Registry can be configured as a pull through cache. In this mode a Registry responds to all normal docker pull requests but stores all content locally. +### Using Registry Access Management (RAM) with a registry mirror + +If Docker Hub access is restricted via your Registry Access Management (RAM) configuration, you will not be able to pull images originating from Docker Hub even if the images are available in your registry mirror. + +You will encounter the following error: +```console +Error response from daemon: Access to docker.io has been restricted by your administrators. +``` + +If you are unable to allow access to Docker Hub, you can manually pull from your registry mirror and optionally, retag the image. For example: +```console +docker pull [:]/library/busybox +docker tag [:]/library/busybox:latest busybox:latest +``` + ## How does it work? The first time you request an image from your local registry mirror, it pulls diff --git a/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md b/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md index cf3892b1a54f..75f194954906 100644 --- a/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md +++ b/content/manuals/security/for-admins/hardened-desktop/registry-access-management.md @@ -89,6 +89,7 @@ earlier Linux kernel series). This will be resolved in the updated 5.15 series Linux kernel. - Images pulled by Docker Desktop when Docker Debug or Kubernetes is enabled, are not restricted by default even if Docker Hub is blocked by RAM. +- If Docker Hub access is restricted by RAM, pulls on images originating from Docker Hub are restricted even if the image has been previously cached by a registry mirror. See [Using Registry Access Management (RAM) with a registry mirror](/manuals/docker-hub/image-library/mirror.md). Also, Registry Access Management operates on the level of hosts, not IP addresses. Developers can bypass this restriction within their domain From 9683207107284d1e29ad7ced3752e2ee53d6b3c4 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Thu, 24 Apr 2025 14:55:25 +0300 Subject: [PATCH 329/699] Fix a few typos in the "Environment variables precedence in Compose" manual (#22485) ## Description This pull request fixes a few minor typos in the "Environment variables precedence in Docker Compose" manual. --- .../how-tos/environment-variables/envvars-precedence.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/manuals/compose/how-tos/environment-variables/envvars-precedence.md b/content/manuals/compose/how-tos/environment-variables/envvars-precedence.md index 7ac4474984f4..f5e14549472d 100644 --- a/content/manuals/compose/how-tos/environment-variables/envvars-precedence.md +++ b/content/manuals/compose/how-tos/environment-variables/envvars-precedence.md @@ -83,7 +83,7 @@ Result 1: The local environment takes precedence, but the Compose file is not se Result 2: The `env_file` attribute in the Compose file defines an explicit value for `VALUE` so the container environment is set accordingly. -Result 3: The `environment` attribute in the Compose file defines an explicit value for `VALUE`, so the container environment is set accordingly/ +Result 3: The `environment` attribute in the Compose file defines an explicit value for `VALUE`, so the container environment is set accordingly. Result 4: The image's `ENV` directive declares the variable `VALUE`, and since the Compose file is not set to override this value, this variable is defined by image @@ -91,15 +91,15 @@ Result 5: The `docker compose run` command has the `--env` flag set which an exp Result 6: The `docker compose run` command has the `--env` flag set to replicate the value from the environment. Host OS value takes precedence and is replicated into the container's environment. -Result 7: The `docker compose run` command has the `--env` flag set to replicate the value from the environment. Value from `.env` file is the selected to define the container's environment. +Result 7: The `docker compose run` command has the `--env` flag set to replicate the value from the environment. Value from `.env` file is selected to define the container's environment. Result 8: The `env_file` attribute in the Compose file is set to replicate `VALUE` from the local environment. Host OS value takes precedence and is replicated into the container's environment. -Result 9: The `env_file` attribute in the Compose file is set to replicate `VALUE` from the local environment. Value from `.env` file is the selected to define the container's environment. +Result 9: The `env_file` attribute in the Compose file is set to replicate `VALUE` from the local environment. Value from `.env` file is selected to define the container's environment. Result 10: The `environment` attribute in the Compose file is set to replicate `VALUE` from the local environment. Host OS value takes precedence and is replicated into the container's environment. -Result 11: The `environment` attribute in the Compose file is set to replicate `VALUE` from the local environment. Value from `.env` file is the selected to define the container's environment. +Result 11: The `environment` attribute in the Compose file is set to replicate `VALUE` from the local environment. Value from `.env` file is selected to define the container's environment. Result 12: The `--env` flag has higher precedence than the `environment` and `env_file` attributes and is to set to replicate `VALUE` from the local environment. Host OS value takes precedence and is replicated into the container's environment. From 675c90866e0012a98b03014f27d3a705be59d7ff Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Thu, 24 Apr 2025 14:55:59 +0300 Subject: [PATCH 330/699] Fix a few typos in the "Base images" manual (#22486) ## Description The pull request fixes a few minor typos in the "Base images" manual. --- content/manuals/build/building/base-images.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/manuals/build/building/base-images.md b/content/manuals/build/building/base-images.md index 17770a834eb7..2e11b0ba540b 100644 --- a/content/manuals/build/building/base-images.md +++ b/content/manuals/build/building/base-images.md @@ -22,7 +22,7 @@ For most cases, you don't need to create your own base image. Docker Hub contains a vast library of Docker images that are suitable for use as a base image in your build. [Docker Official Images](../../docker-hub/image-library/trusted-content.md#docker-official-images) -have clear documentation, promote best practices, and are regularly updated +have clear documentation, promote best practices, and are regularly updated. There are also [Docker Verified Publisher](../../docker-hub/image-library/trusted-content.md#verified-publisher-images) images, created by trusted publishing partners, verified by Docker. @@ -77,7 +77,7 @@ To run your new image, use the `docker run` command: $ docker run --rm hello ``` -This example image can only successfully execute as long as the `hello` binary +This example image can only be successfully executed as long as the `hello` binary doesn't have any runtime dependencies. Computer programs tend to depend on certain other programs or resources to exist in the runtime environment. For example: From 633830abc8fffd3f049015494ade591a2cfc3786 Mon Sep 17 00:00:00 2001 From: karman <110832017+karman-docker@users.noreply.github.com> Date: Thu, 24 Apr 2025 11:57:01 +0000 Subject: [PATCH 331/699] update configuration profile section (#22479) ## Description context: https://docker.slack.com/archives/C027X59V596/p1745407376922009 ## Related issues or tickets ## Reviews - [ ] Technical review - [x] Editorial review - [ ] Product review --------- Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- content/manuals/security/for-admins/enforce-sign-in/methods.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/manuals/security/for-admins/enforce-sign-in/methods.md b/content/manuals/security/for-admins/enforce-sign-in/methods.md index 4269aec0fa35..2f590b64c442 100644 --- a/content/manuals/security/for-admins/enforce-sign-in/methods.md +++ b/content/manuals/security/for-admins/enforce-sign-in/methods.md @@ -121,6 +121,8 @@ tampered with by the users. 4. Use a MDM solution to distribute your modified `.mobileconfig` file to your macOS clients. +5. Verify that the profile is added to **Device (Managed)** profiles list (**System Settings** > **General** > **Device Management**) on your macOS clients. + ## plist method (Mac only) > [!NOTE] From 9084d496e66b5d3cdb2796fe8ba914baa9e8bb77 Mon Sep 17 00:00:00 2001 From: Kristiyan Velkov <40764277+kristiyan-velkov@users.noreply.github.com> Date: Thu, 24 Apr 2025 17:24:22 +0300 Subject: [PATCH 332/699] docs: added a guide for Dockerized React.js 19 application (#22375) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description This PR introduces a comprehensive, language-specific guide for containerizing React.js applications using Docker, aimed at helping developers streamline development, testing, and deployment workflows. It includes practical steps and examples to set up CI/CD pipelines using GitHub Actions, aligning with modern DevOps best practices. **What’s Included** - Step-by-step instructions to containerize React.js apps using Docker. - Configuration for a local development environment inside containers. - Guidance on running unit tests inside Docker containers. - Full CI/CD pipeline setup using GitHub Actions for automated builds and deployments. - Deployment instructions for a local Kubernetes cluster to validate production readiness. **Credits** [Krisityan Velkov](https://www.linkedin.com/in/kristiyan-velkov-763130b3/), Docker Captain and experienced Front-end Engineer. --------- Co-authored-by: kristiyan.velkov Co-authored-by: Craig Osterhout <103533812+craig-osterhout@users.noreply.github.com> --- content/guides/reactjs/_index.md | 50 +++ content/guides/reactjs/configure-ci-cd.md | 321 +++++++++++++++ content/guides/reactjs/containerize.md | 473 ++++++++++++++++++++++ content/guides/reactjs/deploy.md | 194 +++++++++ content/guides/reactjs/develop.md | 206 ++++++++++ content/guides/reactjs/run-tests.md | 180 ++++++++ 6 files changed, 1424 insertions(+) create mode 100644 content/guides/reactjs/_index.md create mode 100644 content/guides/reactjs/configure-ci-cd.md create mode 100644 content/guides/reactjs/containerize.md create mode 100644 content/guides/reactjs/deploy.md create mode 100644 content/guides/reactjs/develop.md create mode 100644 content/guides/reactjs/run-tests.md diff --git a/content/guides/reactjs/_index.md b/content/guides/reactjs/_index.md new file mode 100644 index 000000000000..10024e063f5e --- /dev/null +++ b/content/guides/reactjs/_index.md @@ -0,0 +1,50 @@ +--- +title: React.js language-specific guide +linkTitle: React.js +description: Containerize and develop React.js apps using Docker +keywords: getting started, React.js, react.js, docker, language, Dockerfile +summary: | + This guide explains how to containerize React.js applications using Docker. +toc_min: 1 +toc_max: 2 +languages: [js] +params: + time: 20 minutes + +--- + +The React.js language-specific guide shows you how to containerize a React.js application using Docker, following best practices for creating efficient, production-ready containers. + +[React.js](https://react.dev/) is a widely used library for building interactive user interfaces. However, managing dependencies, environments, and deployments efficiently can be complex. Docker simplifies this process by providing a consistent and containerized environment. + +> +> **Acknowledgment** +> +> Docker extends its sincere gratitude to [Kristiyan Velkov](https://www.linkedin.com/in/kristiyan-velkov-763130b3/) for authoring this guide. As a Docker Captain and experienced Front-end engineer, his expertise in Docker, DevOps, and modern web development has made this resource invaluable for the community, helping developers navigate and optimize their Docker workflows. + +--- + +## What will you learn? + +In this guide, you will learn how to: + +- Containerize and run a React.js application using Docker. +- Set up a local development environment for React.js inside a container. +- Run tests for your React.js application within a Docker container. +- Configure a CI/CD pipeline using GitHub Actions for your containerized app. +- Deploy the containerized React.js application to a local Kubernetes cluster for testing and debugging. + +To begin, you’ll start by containerizing an existing React.js application. + +--- + +## Prerequisites + +Before you begin, make sure you're familiar with the following: + +- Basic understanding of [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript) or [TypeScript](https://www.typescriptlang.org/). +- Basic knowledge of [Node.js](https://nodejs.org/en) and [npm](https://docs.npmjs.com/about-npm) for managing dependencies and running scripts. +- Familiarity with [React.js](https://react.dev/) fundamentals. +- Understanding of Docker concepts such as images, containers, and Dockerfiles. If you're new to Docker, start with the [Docker basics](/get-started/docker-concepts/the-basics/what-is-a-container.md) guide. + +Once you've completed the React.js getting started modules, you’ll be ready to containerize your own React.js application using the examples and instructions provided in this guide. diff --git a/content/guides/reactjs/configure-ci-cd.md b/content/guides/reactjs/configure-ci-cd.md new file mode 100644 index 000000000000..bced3a22e841 --- /dev/null +++ b/content/guides/reactjs/configure-ci-cd.md @@ -0,0 +1,321 @@ +--- +title: Configure CI/CD for your React.js application +linkTitle: Configure CI/CD +weight: 60 +keywords: CI/CD, GitHub( Actions), React.js, Next.js +description: Learn how to configure CI/CD using GitHub Actions for your React.js application. + +--- + +## Prerequisites + +Complete all the previous sections of this guide, starting with [Containerize React.js application](containerize.md). + +You must also have: +- A [GitHub](https://github.com/signup) account. +- A [Docker Hub](https://hub.docker.com/signup) account. + +--- + +## Overview + +In this section, you'll set up a **CI/CD pipeline** using [GitHub Actions](https://docs.github.com/en/actions) to automatically: + +- Build your React.js application inside a Docker container. +- Run tests in a consistent environment. +- Push the production-ready image to [Docker Hub](https://hub.docker.com). + +--- + +## Connect your GitHub repository to Docker Hub + +To enable GitHub Actions to build and push Docker images, you’ll securely store your Docker Hub credentials in your new GitHub repository. + +### Step 1: Connect your GitHub repository to Docker Hub + +1. Create a Personal Access Token (PAT) from [Docker Hub](https://hub.docker.com) + 1. Go to your **Docker Hub account → Account Settings → Security**. + 2. Generate a new Access Token with **Read/Write** permissions. + 3. Name it something like `docker-reactjs-sample`. + 4. Copy and save the token — you’ll need it in Step 4. + +2. Create a repository in [Docker Hub](https://hub.docker.com/repositories/) + 1. Go to your **Docker Hub account → Create a repository**. + 2. For the Repository Name, use something descriptive — for example: `reactjs-sample`. + 3. Once created, copy and save the repository name — you’ll need it in Step 4. + +3. Create a new [GitHub repository](https://github.com/new) for your React.js project + +4. Add Docker Hub credentials as GitHub repository secrets + + In your newly created GitHub repository: + + 1. Navigate to: + **Settings → Secrets and variables → Actions → New repository secret**. + + 2. Add the following secrets: + + | Name | Value | + |-------------------|--------------------------------| + | `DOCKER_USERNAME` | Your Docker Hub username | + | `DOCKERHUB_TOKEN` | Your Docker Hub access token (created in Step 1) | + | `DOCKERHUB_PROJECT_NAME` | Your Docker Project Name (created in Step 2) | + + These secrets let GitHub Actions to authenticate securely with Docker Hub during automated workflows. + +5. Connect Your Local Project to GitHub + + Link your local project `docker-reactjs-sample` to the GitHub repository you just created by running the following command from your project root: + + ```console + $ git remote set-url origin https://github.com/{your-username}/{your-repository-name}.git + ``` + + >[!IMPORTANT] + >Replace `{your-username}` and `{your-repository}` with your actual GitHub username and repository name. + + To confirm that your local project is correctly connected to the remote GitHub repository, run: + + ```console + $ git remote -v + ``` + + You should see output similar to: + + ```console + origin https://github.com/{your-username}/{your-repository-name}.git (fetch) + origin https://github.com/{your-username}/{your-repository-name}.git (push) + ``` + + This confirms that your local repository is properly linked and ready to push your source code to GitHub. + +6. Push Your Source Code to GitHub + + Follow these steps to commit and push your local project to your GitHub repository: + + 1. Stage all files for commit. + + ```console + $ git add -A + ``` + This command stages all changes — including new, modified, and deleted files — preparing them for commit. + + + 2. Commit your changes. + + ```console + $ git commit -m "Initial commit" + ``` + This command creates a commit that snapshots the staged changes with a descriptive message. + + 3. Push the code to the `main` branch. + + ```console + $ git push -u origin main + ``` + This command pushes your local commits to the `main` branch of the remote GitHub repository and sets the upstream branch. + +Once completed, your code will be available on GitHub, and any GitHub Actions workflow you’ve configured will run automatically. + +> [!NOTE] +> Learn more about the Git commands used in this step: +> - [Git add](https://git-scm.com/docs/git-add) – Stage changes (new, modified, deleted) for commit +> - [Git commit](https://git-scm.com/docs/git-commit) – Save a snapshot of your staged changes +> - [Git push](https://git-scm.com/docs/git-push) – Upload local commits to your GitHub repository +> - [Git remote](https://git-scm.com/docs/git-remote) – View and manage remote repository URLs + +--- + +### Step 2: Set up the workflow + +Now you'll create a GitHub Actions workflow that builds your Docker image, runs tests, and pushes the image to Docker Hub. + +1. Go to your repository on GitHub and select the **Actions** tab in the top menu. + +2. Select **Set up a workflow yourself** when prompted. + + This opens an inline editor to create a new workflow file. By default, it will be saved to: + `.github/workflows/main.yml` + + +3. Add the following workflow configuration to the new file: + +```yaml +name: CI/CD – React.js Application with Docker + +on: + push: + branches: [main] + pull_request: + branches: [main] + types: [opened, synchronize, reopened] + +jobs: + build-test-push: + name: Build, Test and Push Docker Image + runs-on: ubuntu-latest + + steps: + # 1. Checkout source code + - name: Checkout source code + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetches full history for better caching/context + + # 2. Set up Docker Buildx + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + # 3. Cache Docker layers + - name: Cache Docker layers + uses: actions/cache@v4 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: ${{ runner.os }}-buildx- + + # 4. Cache npm dependencies + - name: Cache npm dependencies + uses: actions/cache@v4 + with: + path: ~/.npm + key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }} + restore-keys: ${{ runner.os }}-npm- + + # 5. Extract metadata + - name: Extract metadata + id: meta + run: | + echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> "$GITHUB_OUTPUT" + echo "SHORT_SHA=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT" + + # 6. Build dev Docker image + - name: Build Docker image for tests + uses: docker/build-push-action@v6 + with: + context: . + file: Dockerfile.dev + tags: ${{ steps.meta.outputs.REPO_NAME }}-dev:latest + load: true # Load to local Docker daemon for testing + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache,mode=max + + # 7. Run Vitest tests + - name: Run Vitest tests and generate report + run: | + docker run --rm \ + --workdir /app \ + --entrypoint "" \ + ${{ steps.meta.outputs.REPO_NAME }}-dev:latest \ + sh -c "npm ci && npx vitest run --reporter=verbose" + env: + CI: true + NODE_ENV: test + timeout-minutes: 10 + + # 8. Login to Docker Hub + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + # 9. Build and push prod image + - name: Build and push production image + uses: docker/build-push-action@v6 + with: + context: . + file: Dockerfile + push: true + platforms: linux/amd64,linux/arm64 + tags: | + ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKERHUB_PROJECT_NAME }}:latest + ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKERHUB_PROJECT_NAME }}:${{ steps.meta.outputs.SHORT_SHA }} + cache-from: type=local,src=/tmp/.buildx-cache +``` + +This workflow performs the following tasks for your React.js application: +- Triggers on every `push` or `pull request` targeting the `main` branch. +- Builds a development Docker image using `Dockerfile.dev`, optimized for testing. +- Executes unit tests using Vitest inside a clean, containerized environment to ensure consistency. +- Halts the workflow immediately if any test fails — enforcing code quality. +- Caches both Docker build layers and npm dependencies for faster CI runs. +- Authenticates securely with Docker Hub using GitHub repository secrets. +- Builds a production-ready image using the `prod` stage in `Dockerfile`. +- Tags and pushes the final image to Docker Hub with both `latest` and short SHA tags for traceability. + +> [!NOTE] +> For more information about `docker/build-push-action`, refer to the [GitHub Action README](https://github.com/docker/build-push-action/blob/master/README.md). + +--- + +### Step 3: Run the workflow + +After you've added your workflow file, it's time to trigger and observe the CI/CD process in action. + +1. Commit and push your workflow file + + Select "Commit changes…" in the GitHub editor. + + - This push will automatically trigger the GitHub Actions pipeline. + +2. Monitor the workflow execution + + 1. Go to the Actions tab in your GitHub repository. + 2. Click into the workflow run to follow each step: **build**, **test**, and (if successful) **push**. + +3. Verify the Docker image on Docker Hub + + - After a successful workflow run, visit your [Docker Hub repositories](https://hub.docker.com/repositories). + - You should see a new image under your repository with: + - Repository name: `${your-repository-name}` + - Tags include: + - `latest` – represents the most recent successful build; ideal for quick testing or deployment. + - `` – a unique identifier based on the commit hash, useful for version tracking, rollbacks, and traceability. + +> [!TIP] Protect your main branch +> To maintain code quality and prevent accidental direct pushes, enable branch protection rules: +> - Navigate to your **GitHub repo → Settings → Branches**. +> - Under Branch protection rules, click **Add rule**. +> - Specify `main` as the branch name. +> - Enable options like: +> - *Require a pull request before merging*. +> - *Require status checks to pass before merging*. +> +> This ensures that only tested and reviewed code is merged into `main` branch. +--- + +## Summary + +In this section, you set up a complete CI/CD pipeline for your containerized React.js application using GitHub Actions. + +Here's what you accomplished: + +- Created a new GitHub repository specifically for your project. +- Generated a secure Docker Hub access token and added it to GitHub as a secret. +- Defined a GitHub Actions workflow to: + - Build your application inside a Docker container. + - Run tests in a consistent, containerized environment. + - Push a production-ready image to Docker Hub if tests pass. +- Triggered and verified the workflow execution through GitHub Actions. +- Confirmed that your image was successfully published to Docker Hub. + +With this setup, your React.js application is now ready for automated testing and deployment across environments — increasing confidence, consistency, and team productivity. + +--- + +## Related resources + +Deepen your understanding of automation and best practices for containerized apps: + +- [Introduction to GitHub Actions](/guides/gha.md) – Learn how GitHub Actions automate your workflows +- [Docker Build GitHub Actions](/manuals/build/ci/github-actions/_index.md) – Set up container builds with GitHub Actions +- [Workflow syntax for GitHub Actions](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions) – Full reference for writing GitHub workflows +- [Compose file reference](/compose/compose-file/) – Full configuration reference for `compose.yaml` +- [Best practices for writing Dockerfiles](/develop/develop-images/dockerfile_best-practices/) – Optimize your image for performance and security + +--- + +## Next steps + +Next, learn how you can locally test and debug your React.js workloads on Kubernetes before deploying. This helps you ensure your application behaves as expected in a production-like environment, reducing surprises during deployment. diff --git a/content/guides/reactjs/containerize.md b/content/guides/reactjs/containerize.md new file mode 100644 index 000000000000..f1d4f6673d50 --- /dev/null +++ b/content/guides/reactjs/containerize.md @@ -0,0 +1,473 @@ +--- +title: Containerize a React.js Application +linkTitle: Containerize +weight: 10 +keywords: react.js, node, image, initialize, build +description: Learn how to containerize a React.js application with Docker by creating an optimized, production-ready image using best practices for performance, security, and scalability. + +--- + + +## Prerequisites + +Before you begin, make sure the following tools are installed and available on your system: + +- You have installed the latest version of [Docker Desktop](/get-started/get-docker.md). +- You have a [git client](https://git-scm.com/downloads). The examples in this section use a command-line based git client, but you can use any client. + +> **New to Docker?** +> Start with the [Docker basics](/get-started/docker-concepts/the-basics/what-is-a-container.md) guide to get familiar with key concepts like images, containers, and Dockerfiles. + +--- + +## Overview + +This guide walks you through the complete process of containerizing a React.js application with Docker. You’ll learn how to create a production-ready Docker image using best practices that improve performance, security, scalability, and deployment efficiency. + +By the end of this guide, you will: + +- Containerize a React.js application using Docker. +- Create and optimize a Dockerfile for production builds. +- Use multi-stage builds to minimize image size. +- Serve the application efficiently with a custom NGINX configuration. +- Follow best practices for building secure and maintainable Docker images. + +--- + +## Get the sample application + +Clone the sample application to use with this guide. Open a terminal, change +directory to a directory that you want to work in, and run the following command +to clone the git repository: + +```console +$ git clone https://github.com/kristiyan-velkov/docker-reactjs-sample +``` +--- + +## Generate a Dockerfile + +Docker provides an interactive CLI tool called `docker init` that helps scaffold the necessary configuration files for containerizing your application. This includes generating a `Dockerfile`, `.dockerignore`, `compose.yaml`, and `README.Docker.md`. + +To begin, navigate to the root of your project directory: + +```console +$ cd docker-reactjs-sample +``` + +Then run the following command: + +```console +$ docker init +``` +You’ll see output similar to: + +```text +Welcome to the Docker Init CLI! + +This utility will walk you through creating the following files with sensible defaults for your project: + - .dockerignore + - Dockerfile + - compose.yaml + - README.Docker.md + +Let's get started! +``` + +The CLI will prompt you with a few questions about your app setup. +For consistency, please use the same responses shown in the example below when prompted: +| Question | Answer | +|------------------------------------------------------------|-----------------| +| What application platform does your project use? | Node | +| What version of Node do you want to use? | 22.14.0-alpine | +| Which package manager do you want to use? | npm | +| Do you want to run "npm run build" before starting server? | yes | +| What directory is your build output to? | dist | +| What command do you want to use to start the app? | npm run dev | +| What port does your server listen on? | 8080 | + +After completion, your project directory will contain the following new files: + +```text +├── docker-reactjs-sample/ +│ ├── Dockerfile +│ ├── .dockerignore +│ ├── compose.yaml +│ └── README.Docker.md +``` + +--- + +## Build the Docker image + +The default Dockerfile generated by `docker init` serves as a solid starting point for general Node.js applications. However, React.js is a front-end library that compiles into static assets, so we need to tailor the Dockerfile to optimize for how React applications are built and served in a production environment. + +### Step 1: Review the generated files + +In this step, you’ll improve the Dockerfile and configuration files by following best practices: + +- Use multi-stage builds to keep the final image clean and small +- Serve the app using NGINX, a fast and secure web server +- Improve performance and security by only including what’s needed + +These updates help ensure your app is easy to deploy, fast to load, and production-ready. + +> [!NOTE] +> A `Dockerfile` is a plain text file that contains step-by-step instructions to build a Docker image. It automates packaging your application along with its dependencies and runtime environment. +> For full details, see the [Dockerfile reference](/reference/dockerfile/). + + +### Step 2: Configure the Dockerfile file + +Copy and replace the contents of your existing `Dockerfile` with the configuration below: + +```dockerfile +# ========================================= +# Stage 1: Build the React.js Application +# ========================================= +ARG NODE_VERSION=22.14.0-alpine +ARG NGINX_VERSION=alpine3.21 + +# Use a lightweight Node.js image for building (customizable via ARG) +FROM node:${NODE_VERSION} AS builder + +# Set the working directory inside the container +WORKDIR /app + +# Copy package-related files first to leverage Docker's caching mechanism +COPY --link package.json package-lock.json ./ + +# Install project dependencies using npm ci (ensures a clean, reproducible install) +RUN --mount=type=cache,target=/root/.npm npm ci + +# Copy the rest of the application source code into the container +COPY --link . . + +# Build the React.js application (outputs to /app/dist) +RUN npm run build + +# ========================================= +# Stage 2: Prepare Nginx to Serve Static Files +# ========================================= + +FROM nginxinc/nginx-unprivileged:${NGINX_VERSION} AS runner + +# Use a built-in non-root user for security best practices +USER nginx + +# Copy custom Nginx config +COPY --link nginx.conf /etc/nginx/nginx.conf + +# Copy the static build output from the build stage to Nginx's default HTML serving directory +COPY --link --from=builder /app/dist /usr/share/nginx/html + +# Expose port 8080 to allow HTTP traffic +# Note: The default NGINX container now listens on port 8080 instead of 80 +EXPOSE 8080 + +# Start Nginx directly with custom config +ENTRYPOINT ["nginx", "-c", "/etc/nginx/nginx.conf"] +CMD ["-g", "daemon off;"] +``` + +### Step 3: Configure the .dockerignore file + +The `.dockerignore` file tells Docker which files and folders to exclude when building the image. + + +> [!NOTE] +>This helps: +>- Reduce image size +>- Speed up the build process +>- Prevent sensitive or unnecessary files (like `.env`, `.git`, or `node_modules`) from being added to the final image. +> +> To learn more, visit the [.dockerignore reference](/reference/dockerfile.md#dockerignore-file). + +Copy and replace the contents of your existing `.dockerignore` with the configuration below: + +```dockerignore +# Ignore dependencies and build output +node_modules/ +dist/ +out/ +.tmp/ +.cache/ + +# Ignore Vite, Webpack, and React-specific build artifacts +.vite/ +.vitepress/ +.eslintcache +.npm/ +coverage/ +jest/ +cypress/ +cypress/screenshots/ +cypress/videos/ +reports/ + +# Ignore environment and config files (sensitive data) +*.env* +*.log + +# Ignore TypeScript build artifacts (if using TypeScript) +*.tsbuildinfo + +# Ignore lockfiles (optional if using Docker for package installation) +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Ignore local development files +.git/ +.gitignore +.vscode/ +.idea/ +*.swp +.DS_Store +Thumbs.db + +# Ignore Docker-related files (to avoid copying unnecessary configs) +Dockerfile +.dockerignore +docker-compose.yml +docker-compose.override.yml + +# Ignore build-specific cache files +*.lock + +``` + +### Step 4: Create the `nginx.conf` file + +To serve your React.js application efficiently inside the container, you’ll configure NGINX with a custom setup. This configuration is optimized for performance, browser caching, gzip compression, and support for client-side routing. + +Create a file named `nginx.conf` in the root of your project directory, and add the following content: + +> [!NOTE] +> To learn more about configuring NGINX, see the [official NGINX documentation](https://nginx.org/en/docs/). + + +```nginx +worker_processes auto; + +# Store PID in /tmp (always writable) +pid /tmp/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # Disable logging to avoid permission issues + access_log off; + error_log /dev/stderr warn; + + # Optimize static file serving + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + keepalive_requests 1000; + + # Gzip compression for optimized delivery + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml; + gzip_min_length 256; + gzip_vary on; + + server { + listen 8080; + server_name localhost; + + # Root directory where React.js build files are placed + root /usr/share/nginx/html; + index index.html; + + # Serve React.js static files with proper caching + location / { + try_files $uri /index.html; + } + + # Serve static assets with long cache expiration + location ~* \.(?:ico|css|js|gif|jpe?g|png|woff2?|eot|ttf|svg|map)$ { + expires 1y; + access_log off; + add_header Cache-Control "public, immutable"; + } + + # Handle React.js client-side routing + location /static/ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + } +} +``` + +### Step 5: Build the React.js application image + +With your custom configuration in place, you're now ready to build the Docker image for your React.js application. + +The updated setup includes: + +- Optimized browser caching and gzip compression +- Secure, non-root logging to avoid permission issues +- Support for React client-side routing by redirecting unmatched routes to `index.html` + +After completing the previous steps, your project directory should now contain the following files: + +```text +├── docker-reactjs-sample/ +│ ├── Dockerfile +│ ├── .dockerignore +│ ├── compose.yaml +│ ├── nginx.conf +│ └── README.Docker.md +``` + +Now that your Dockerfile is configured, you can build the Docker image for your React.js application. + +> [!NOTE] +> The `docker build` command packages your application into an image using the instructions in the Dockerfile. It includes all necessary files from the current directory (called the [build context](/build/concepts/context/#what-is-a-build-context)). + +Run the following command from the root of your project: + +```console +$ docker build --tag docker-reactjs-sample . +``` + +What this command does: +- Uses the Dockerfile in the current directory (.) +- Packages the application and its dependencies into a Docker image +- Tags the image as docker-reactjs-sample so you can reference it later + + +#### Step 6: View local images + +After building your Docker image, you can check which images are available on your local machine using either the Docker CLI or [Docker Desktop](/manuals/desktop/use-desktop/images.md). Since you're already working in the terminal, let's use the Docker CLI. + +To list all locally available Docker images, run the following command: + +```console +$ docker images +``` + +Example Output: + +```shell +REPOSITORY TAG IMAGE ID CREATED SIZE +docker-reactjs-sample latest f39b47a97156 14 seconds ago 75.8MB +``` + +This output provides key details about your images: + +- **Repository** – The name assigned to the image. +- **Tag** – A version label that helps identify different builds (e.g., latest). +- **Image ID** – A unique identifier for the image. +- **Created** – The timestamp indicating when the image was built. +- **Size** – The total disk space used by the image. + +If the build was successful, you should see `docker-reactjs-sample` image listed. + +--- + +## Run the containerized application + +In the previous step, you created a Dockerfile for your React.js application and built a Docker image using the docker build command. Now it’s time to run that image in a container and verify that your application works as expected. + + +Inside the `docker-reactjs-sample` directory, run the following command in a +terminal. + +```console +$ docker compose up --build +``` + +Open a browser and view the application at [http://localhost:8080](http://localhost:8080). You should see a simple React.js web application. + +Press `ctrl+c` in the terminal to stop your application. + +### Run the application in the background + +You can run the application detached from the terminal by adding the `-d` +option. Inside the `docker-reactjs-sample` directory, run the following command +in a terminal. + +```console +$ docker compose up --build -d +``` + +Open a browser and view the application at [http://localhost:8080](http://localhost:8080). You should see a simple web application preview. + + +To confirm that the container is running, use `docker ps` command: + +```console +$ docker ps +``` + +This will list all active containers along with their ports, names, and status. Look for a container exposing port 8080. + +Example Output: + +```shell +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +88bced6ade95 docker-reactjs-sample-server "nginx -c /etc/nginx…" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp docker-reactjs-sample-server-1 +``` + + +To stop the application, run: + +```console +$ docker compose down +``` + + +> [!NOTE] +> For more information about Compose commands, see the [Compose CLI +> reference](/reference/cli/docker/compose/_index.md). + +--- + +## Summary + +In this guide, you learned how to containerize, build, and run a React.js application using Docker. By following best practices, you created a secure, optimized, and production-ready setup. + +What you accomplished: +- Initialized your project using `docker init` to scaffold essential Docker configuration files. +- Replaced the default `Dockerfile` with a multi-stage build that compiles the React.js application and serves the static files using Nginx. +- Replaced the default `.dockerignore` file to exclude unnecessary files and keep the image clean and efficient. +- Built your Docker image using `docker build`. +- Ran the container using `docker compose up`, both in the foreground and in detached mode. +- Verified that the app was running by visiting [http://localhost:8080](http://localhost:8080). +- Learned how to stop the containerized application using `docker compose down`. + +You now have a fully containerized React.js application, running in a Docker container, and ready for deployment across any environment with confidence and consistency. + +--- + +## Related resources + +Explore official references and best practices to sharpen your Docker workflow: + +- [Multi-stage builds](/build/building/multi-stage/) – Learn how to separate build and runtime stages. +- [Best practices for writing Dockerfiles](/develop/develop-images/dockerfile_best-practices/) – Write efficient, maintainable, and secure Dockerfiles. +- [Build context in Docker](/build/concepts/context/) – Learn how context affects image builds. +- [`docker init` CLI reference](/reference/cli/docker/init/) – Scaffold Docker assets automatically. +- [`docker build` CLI reference](/reference/cli/docker/build/) – Build Docker images from a Dockerfile. +- [`docker images` CLI reference](/reference/cli/docker/images/) – Manage and inspect local Docker images. +- [`docker compose up` CLI reference](/reference/cli/docker/compose/up/) – Start and run multi-container applications. +- [`docker compose down` CLI reference](/reference/cli/docker/compose/down/) – Stop and remove containers, networks, and volumes. + +--- + +## Next steps + +With your React.js application now containerized, you're ready to move on to the next step. + +In the next section, you'll learn how to develop your application using Docker containers, enabling a consistent, isolated, and reproducible development environment across any machine. + diff --git a/content/guides/reactjs/deploy.md b/content/guides/reactjs/deploy.md new file mode 100644 index 000000000000..c02301b8d015 --- /dev/null +++ b/content/guides/reactjs/deploy.md @@ -0,0 +1,194 @@ +--- +title: Test your React.js deployment +linkTitle: Test your deployment +weight: 60 +keywords: deploy, kubernetes, react, react.js +description: Learn how to deploy locally to test and debug your Kubernetes deployment + +--- + +## Prerequisites + +Before you begin, make sure you’ve completed the following: +- Complete all the previous sections of this guide, starting with [Containerize React.js application](containerize.md). +- [Enable Kubernetes](/manuals/desktop/features/kubernetes.md#install-and-turn-on-kubernetes) in Docker Desktop. + +> **New to Kubernetes?** +> Visit the [Kubernetes basics tutorial](https://kubernetes.io/docs/tutorials/kubernetes-basics/) to get familiar with how clusters, pods, deployments, and services work. + +--- + +## Overview + +This section guides you through deploying your containerized React.js application locally using [Docker Desktop’s built-in Kubernetes](/desktop/kubernetes/). Running your app in a local Kubernetes cluster allows you to closely simulate a real production environment, enabling you to test, validate, and debug your workloads with confidence before promoting them to staging or production. + +--- + +## Create a Kubernetes YAML file + +Follow these steps to define your deployment configuration: + +1. In the root of your project, create a new file named: reactjs-sample-kubernetes.yaml + +2. Open the file in your IDE or preferred text editor. + +3. Add the following configuration, and be sure to replace `{DOCKER_USERNAME}` and `{DOCKERHUB_PROJECT_NAME}` with your actual Docker Hub username and repository name from the previous [Configure CI/CD for your React.js application](configure-ci-cd.md). + + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: reactjs-sample + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app: reactjs-sample + template: + metadata: + labels: + app: reactjs-sample + spec: + containers: + - name: reactjs-container + image: {DOCKER_USERNAME}/{DOCKERHUB_PROJECT_NAME}:latest + imagePullPolicy: Always + ports: + - containerPort: 8080 +--- +apiVersion: v1 +kind: Service +metadata: + name: reactjs-sample-service + namespace: default +spec: + type: NodePort + selector: + app: reactjs-sample + ports: + - port: 8080 + targetPort: 8080 + nodePort: 30001 +``` + +This manifest defines two key Kubernetes resources, separated by `---`: + +- Deployment + Deploys a single replica of your React.js application inside a pod. The pod uses the Docker image built and pushed by your GitHub Actions CI/CD workflow + (refer to [Configure CI/CD for your React.js application](configure-ci-cd.md)). + The container listens on port `8080`, which is typically used by [Nginx](https://nginx.org/en/docs/) to serve your production React app. + +- Service (NodePort) + Exposes the deployed pod to your local machine. + It forwards traffic from port `30001` on your host to port `8080` inside the container. + This lets you access the application in your browser at [http://localhost:30001](http://localhost:30001). + +> [!NOTE] +> To learn more about Kubernetes objects, see the [Kubernetes documentation](https://kubernetes.io/docs/home/). + +--- + +## Deploy and check your application + +Follow these steps to deploy your containerized React.js app into a local Kubernetes cluster and verify that it’s running correctly. + +### Step 1. Apply the Kubernetes configuration + +In your terminal, navigate to the directory where your `reactjs-sample-kubernetes.yaml` file is located, then deploy the resources using: + +```console + $ kubectl apply -f reactjs-sample-kubernetes.yaml +``` + +If everything is configured properly, you’ll see confirmation that both the Deployment and the Service were created: + +```shell + deployment.apps/reactjs-sample created + service/reactjs-sample-service created +``` + +This output means that both the Deployment and the Service were successfully created and are now running inside your local cluster. + +### Step 2. Check the Deployment status + +Run the following command to check the status of your deployment: + +```console + $ kubectl get deployments +``` + +You should see an output similar to: + +```shell + NAME READY UP-TO-DATE AVAILABLE AGE + reactjs-sample 1/1 1 1 14s +``` + +This confirms that your pod is up and running with one replica available. + +### Step 3. Verify the Service exposure + +Check if the NodePort service is exposing your app to your local machine: + +```console +$ kubectl get services +``` + +You should see something like: + +```shell +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +reactjs-sample-service NodePort 10.100.244.65 8080:30001/TCP 1m +``` + +This output confirms that your app is available via NodePort on port 30001. + +### Step 4. Access your app in the browser + +Open your browser and navigate to [http://localhost:30001](http://localhost:30001). + +You should see your production-ready React.js Sample application running — served by your local Kubernetes cluster. + +### Step 5. Clean up Kubernetes resources + +Once you're done testing, you can delete the deployment and service using: + +```console + $ kubectl delete -f reactjs-sample-kubernetes.yaml +``` + +Expected output: + +```shell + deployment.apps "reactjs-sample" deleted + service "reactjs-sample-service" deleted +``` + +This ensures your cluster stays clean and ready for the next deployment. + +--- + +## Summary + +In this section, you learned how to deploy your React.js application to a local Kubernetes cluster using Docker Desktop. This setup allows you to test and debug your containerized app in a production-like environment before deploying it to the cloud. + +What you accomplished: + +- Created a Kubernetes Deployment and NodePort Service for your React.js app +- Used `kubectl apply` to deploy the application locally +- Verified the app was running and accessible at `http://localhost:30001` +- Cleaned up your Kubernetes resources after testing + +--- + +## Related resources + +Explore official references and best practices to sharpen your Kubernetes deployment workflow: + +- [Kubernetes documentation](https://kubernetes.io/docs/home/) – Learn about core concepts, workloads, services, and more. +- [Deploy on Kubernetes with Docker Desktop](/manuals/desktop/features/kubernetes.md) – Use Docker Desktop’s built-in Kubernetes support for local testing and development. +- [`kubectl` CLI reference](https://kubernetes.io/docs/reference/kubectl/) – Manage Kubernetes clusters from the command line. +- [Kubernetes Deployment resource](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) – Understand how to manage and scale applications using Deployments. +- [Kubernetes Service resource](https://kubernetes.io/docs/concepts/services-networking/service/) – Learn how to expose your application to internal and external traffic. \ No newline at end of file diff --git a/content/guides/reactjs/develop.md b/content/guides/reactjs/develop.md new file mode 100644 index 000000000000..caf711938e5e --- /dev/null +++ b/content/guides/reactjs/develop.md @@ -0,0 +1,206 @@ +--- +title: Use containers for React.js development +linkTitle: Develop your app +weight: 30 +keywords: react.js, development, node +description: Learn how to develop your React.js application locally using containers. + +--- + +## Prerequisites + +Complete [Containerize React.js application](containerize.md). + +--- + +## Overview + +In this section, you'll learn how to set up both production and development environments for your containerized React.js application using Docker Compose. This setup allows you to serve a static production build via Nginx and to develop efficiently inside containers using a live-reloading dev server with Compose Watch. + +You’ll learn how to: +- Configure separate containers for production and development +- Enable automatic file syncing using Compose Watch in development +- Debug and live-preview your changes in real-time without manual rebuilds + +--- + +## Automatically update services (Development Mode) + +Use Compose Watch to automatically sync source file changes into your containerized development environment. This provides a seamless, efficient development experience without needing to restart or rebuild containers manually. + +## Step 1: Create a development Dockerfile + +Create a file named `Dockerfile.dev` in your project root with the following content: + +```dockerfile +# ========================================= +# Stage 1: Develop the React.js Application +# ========================================= +ARG NODE_VERSION=22.14.0-alpine + +# Use a lightweight Node.js image for development +FROM node:${NODE_VERSION} AS dev + +# Set the working directory inside the container +WORKDIR /app + +# Copy package-related files first to leverage Docker's caching mechanism +COPY --link package.json package-lock.json ./ + +# Install project dependencies +RUN --mount=type=cache,target=/root/.npm npm install + +# Copy the rest of the application source code into the container +COPY --link . . + +# Expose the port used by the Vite development server +EXPOSE 5173 + +# Use a default command, can be overridden in Docker compose.yml file +CMD ["npm", "run", "dev"] +``` + +This file sets up a lightweight development environment for your React app using the dev server. + + +### Step 2: Update your `compose.yaml` file + +Open your `compose.yaml` file and define two services: one for production (`react-prod`) and one for development (`react-dev`). + +Here’s an example configuration for a React.js application: + +```yaml +services: + react-prod: + build: + context: . + dockerfile: Dockerfile + image: docker-reactjs-sample + ports: + - "8080:8080" + + react-dev: + build: + context: . + dockerfile: Dockerfile.dev + ports: + - "5173:5173" + develop: + watch: + - action: sync + path: . + target: /app + +``` +- The `react-prod` service builds and serves your static production app using Nginx. +- The `react-dev` service runs your React development server with live reload and hot module replacement. +- `watch` triggers file sync with Compose Watch. + +> [!NOTE] +> For more details, see the official guide: [Use Compose Watch](/manuals/compose/how-tos/file-watch.md). + +### Step 3: Update vite.config.ts to ensure it works properly inside Docker + +To make Vite’s development server work reliably inside Docker, you need to update your vite.config.ts with the correct settings. + +Open the `vite.config.ts` file in your project root and update it as follows: + +```ts +/// + +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +export default defineConfig({ + base: "/", + plugins: [react()], + server: { + host: true, + port: 5173, + strictPort: true, + }, +}); +``` + +> [!NOTE] +> The `server` options in `vite.config.ts` are essential for running Vite inside Docker: +> - `host: true` allows the dev server to be accessible from outside the container. +> - `port: 5173` sets a consistent development port (must match the one exposed in Docker). +> - `strictPort: true` ensures Vite fails clearly if the port is unavailable, rather than switching silently. +> +> For full details, refer to the [Vite server configuration docs](https://vitejs.dev/config/server-options.html). + + +After completing the previous steps, your project directory should now contain the following files: + +```text +├── docker-reactjs-sample/ +│ ├── Dockerfile +│ ├── Dockerfile.dev +│ ├── .dockerignore +│ ├── compose.yaml +│ ├── nginx.conf +│ └── README.Docker.md +``` + +### Step 4: Start Compose Watch + +Run the following command from your project root to start your container in watch mode: + +```console +$ docker compose watch react-dev +``` + +### Step 5: Test Compose Watch with React + +To verify that Compose Watch is working correctly: + +1. Open the `src/App.tsx` file in your text editor. + +2. Locate the following line: + + ```html +

Vite + React

+ ``` + +3. Change it to: + + ```html +

Hello from Docker Compose Watch

+ ``` + +4. Save the file. + +5. Open your browser at [http://localhost:5173](http://localhost:5173). + +You should see the updated text appear instantly, without needing to rebuild the container manually. This confirms that file watching and automatic synchronization are working as expected. + +--- + +## Summary + +In this section, you set up a complete development and production workflow for your React.js application using Docker and Docker Compose. + +Here's what you achieved: +- Created a `Dockerfile.dev` to streamline local development with hot reloading +- Defined separate `react-dev` and `react-prod` services in your `compose.yaml` file +- Enabled real-time file syncing using Compose Watch for a smoother development experience +- Verified that live updates work seamlessly by modifying and previewing a component + +With this setup, you're now equipped to build, run, and iterate on your React.js app entirely within containers—efficiently and consistently across environments. + +--- + +## Related resources + +Deepen your knowledge and improve your containerized development workflow with these guides: + +- [Using Compose Watch](/manuals/compose/how-tos/file-watch.md) – Automatically sync source changes during development +- [Multi-stage builds](/manuals/build/building/multi-stage.md) – Create efficient, production-ready Docker images +- [Dockerfile best practices](/build/building/best-practices/) – Write clean, secure, and optimized Dockerfiles. +- [Compose file reference](/compose/compose-file/) – Learn the full syntax and options available for configuring services in `compose.yaml`. +- [Docker volumes](/storage/volumes/) – Persist and manage data between container runs + +## Next steps + +In the next section, you'll learn how to run unit tests for your React.js application inside Docker containers. This ensures consistent testing across all environments and removes dependencies on local machine setup. diff --git a/content/guides/reactjs/run-tests.md b/content/guides/reactjs/run-tests.md new file mode 100644 index 000000000000..dea7d484c664 --- /dev/null +++ b/content/guides/reactjs/run-tests.md @@ -0,0 +1,180 @@ +--- +title: Run React.js tests in a container +linkTitle: Run your tests +weight: 40 +keywords: react.js, react, test, vitest +description: Learn how to run your React.js tests in a container. + +--- + +## Prerequisites + +Complete all the previous sections of this guide, starting with [Containerize React.js application](containerize.md). + +## Overview + +Testing is a critical part of the development process. In this section, you'll learn how to: + +- Run unit tests using Vitest inside a Docker container. +- Use Docker Compose to run tests in an isolated, reproducible environment. + +You’ll use [Vitest](https://vitest.dev) — a blazing fast test runner designed for Vite — along with [Testing Library](https://testing-library.com/) for assertions. + +--- + +## Run tests during development + +`docker-reactjs-sample` application includes a sample test file at location: + +```console +$ src/App.test.tsx +``` + +This file uses Vitest and React Testing Library to verify the behavior of `App` component. + +### Step 1: Install Vitest and React Testing Library + +If you haven’t already added the necessary testing tools, install them by running: + +```console +$ npm install --save-dev vitest @testing-library/react @testing-library/jest-dom jsdom +``` + +Then, update the scripts section of your `package.json` file to include the following: + +```json +"scripts": { + "test": "vitest run" +} +``` + +--- + +### Step 2: Configure Vitest + +Update `vitest.config.ts` file in your project root with the following configuration: + +```ts {hl_lines="14-18",linenos=true} +/// + +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +export default defineConfig({ + base: "/", + plugins: [react()], + server: { + host: true, + port: 5173, + strictPort: true, + }, + test: { + environment: "jsdom", + setupFiles: "./src/setupTests.ts", + globals: true, + }, +}); +``` + +> [!NOTE] +> The `test` options in `vitest.config.ts` are essential for reliable testing inside Docker: +> - `environment: "jsdom"` simulates a browser-like environment for rendering and DOM interactions. +> - `setupFiles: "./src/setupTests.ts"` loads global configuration or mocks before each test file (optional but recommended). +> - `globals: true` enables global test functions like `describe`, `it`, and `expect` without importing them. +> +> For more details, see the official [Vitest configuration docs](https://vitest.dev/config/). + +### Step 3: Update compose.yaml + +Add a new service named `react-test` to your `compose.yaml` file. This service allows you to run your test suite in an isolated containerized environment. + +```yaml {hl_lines="22-26",linenos=true} +services: + react-dev: + build: + context: . + dockerfile: Dockerfile.dev + ports: + - "5173:5173" + develop: + watch: + - action: sync + path: . + target: /app + + react-prod: + build: + context: . + dockerfile: Dockerfile + image: docker-reactjs-sample + ports: + - "8080:8080" + + react-test: + build: + context: . + dockerfile: Dockerfile.dev + command: ["npm", "run", "test"] + +``` + +The react-test service reuses the same `Dockerfile.dev` used for [development](develop.md) and overrides the default command to run tests with `npm run test`. This setup ensures a consistent test environment that matches your local development configuration. + + +After completing the previous steps, your project directory should contain the following files: + +```text +├── docker-reactjs-sample/ +│ ├── Dockerfile +│ ├── Dockerfile.dev +│ ├── .dockerignore +│ ├── compose.yaml +│ ├── nginx.conf +│ └── README.Docker.md +``` + +### Step 4: Run the tests + +To execute your test suite inside the container, run the following command from your project root: + +```console +$ docker compose run --rm react-test +``` + +This command will: +- Start the `react-test` service defined in your `compose.yaml` file. +- Execute the `npm run test` script using the same environment as development. +- Automatically remove the container after the tests complete [`docker compose run --rm`](/engine/reference/commandline/compose_run) command. + +> [!NOTE] +> For more information about Compose commands, see the [Compose CLI +> reference](/reference/cli/docker/compose/_index.md). + +--- + +## Summary + +In this section, you learned how to run unit tests for your React.js application inside a Docker container using Vitest and Docker Compose. + +What you accomplished: +- Installed and configured Vitest and React Testing Library for testing React components. +- Created a `react-test` service in `compose.yaml` to isolate test execution. +- Reused the development `Dockerfile.dev` to ensure consistency between dev and test environments. +- Ran tests inside the container using `docker compose run --rm react-test`. +- Ensured reliable, repeatable testing across environments without relying on local machine setup. + +--- + +## Related resources + +Explore official references and best practices to sharpen your Docker testing workflow: + +- [Dockerfile reference](/reference/dockerfile/) – Understand all Dockerfile instructions and syntax. +- [Best practices for writing Dockerfiles](/develop/develop-images/dockerfile_best-practices/) – Write efficient, maintainable, and secure Dockerfiles. +- [Compose file reference](/compose/compose-file/) – Learn the full syntax and options available for configuring services in `compose.yaml`. +- [`docker compose run` CLI reference](/reference/cli/docker/compose/run/) – Run one-off commands in a service container. +--- + +## Next steps + +Next, you’ll learn how to set up a CI/CD pipeline using GitHub Actions to automatically build and test your React.js application in a containerized environment. This ensures your code is validated on every push or pull request, maintaining consistency and reliability across your development workflow. From 95cebccd76cd7edbaecc76984956c1bab12a3101 Mon Sep 17 00:00:00 2001 From: Ishaan Mittal Date: Fri, 25 Apr 2025 13:22:07 +0530 Subject: [PATCH 333/699] Merge pull request #22490 from mittal-ishaan/patch-1 Update typo in mac-permission-requirements.md --- .../desktop/setup/install/mac-permission-requirements.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/desktop/setup/install/mac-permission-requirements.md b/content/manuals/desktop/setup/install/mac-permission-requirements.md index 0a9d458bc18b..564f4e5be986 100644 --- a/content/manuals/desktop/setup/install/mac-permission-requirements.md +++ b/content/manuals/desktop/setup/install/mac-permission-requirements.md @@ -16,7 +16,7 @@ This page contains information about the permission requirements for running and It also provides clarity on running containers as `root` as opposed to having `root` access on the host. -Docker Desktop on Windows is designed with security in mind. Administrative rights are only required when absolutely necessary. +Docker Desktop on Mac is designed with security in mind. Administrative rights are only required when absolutely necessary. ## Permission requirements From c6a5827b0386e13aa216cb801cb41a6af7d8e010 Mon Sep 17 00:00:00 2001 From: sarahsanders-docker Date: Fri, 25 Apr 2025 09:26:39 -0400 Subject: [PATCH 334/699] hide page options on mobile --- layouts/partials/content-default.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/layouts/partials/content-default.html b/layouts/partials/content-default.html index 20fce7bb335c..1c96e70c47fc 100644 --- a/layouts/partials/content-default.html +++ b/layouts/partials/content-default.html @@ -11,9 +11,9 @@

{{ .Content }} - + From 2671a073bf9e1f2eb356857df32782bedf5f6399 Mon Sep 17 00:00:00 2001 From: Stefan Scherer Date: Fri, 25 Apr 2025 15:48:03 +0200 Subject: [PATCH 335/699] Update code block examples (#22494) ## Description This updates the code block examples to remove a reference to an old domain name that is no longer used. ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/contribute/components/code-blocks.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/contribute/components/code-blocks.md b/content/contribute/components/code-blocks.md index f5611805ca5c..7df04769a2b2 100644 --- a/content/contribute/components/code-blocks.md +++ b/content/contribute/components/code-blocks.md @@ -98,7 +98,7 @@ Use the `bash` language code block when you want to show a Bash script: ```bash #!/usr/bin/bash -echo "deb https://packages.docker.com/1.12/apt/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list +echo "deb https://download.docker.com/linux/ubuntu noble stable" | sudo tee /etc/apt/sources.list.d/docker.list ``` If you want to show an interactive shell, use `console` instead. @@ -106,7 +106,7 @@ In cases where you use `console`, make sure to add a dollar character for the user sign: ```console -$ echo "deb https://packages.docker.com/1.12/apt/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list +$ echo "deb https://download.docker.com/linux/ubuntu noble stable" | sudo tee /etc/apt/sources.list.d/docker.list ``` ## Go From 4ccf84fd766b8652d8c8bd282f6a70e3ea4cc727 Mon Sep 17 00:00:00 2001 From: Nick Janetakis Date: Sat, 26 Apr 2025 14:04:31 -0400 Subject: [PATCH 336/699] Prevent Hugo from outputting its version By default (without this), it will add this to your home page: Where 0.141.0 is whatever version you generated the site with. --- hugo.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/hugo.yaml b/hugo.yaml index f858b1c35c74..3250af12955a 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -4,6 +4,7 @@ refLinksErrorLevel: ERROR enableGitInfo: true disablePathToLower: true enableInlineShortcodes: true +disableHugoGeneratorInject: true ignoreLogs: - cascade-pattern-with-extension From fcb958a33f2a14ff6934035b898ec107f5cff83e Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Mon, 28 Apr 2025 14:02:41 +0300 Subject: [PATCH 337/699] Fix typos in the Builders manual (#22506) ## Description This pull request fixes a few minor typos in the Builders manual. --- content/manuals/build/builders/_index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/manuals/build/builders/_index.md b/content/manuals/build/builders/_index.md index c926822df0e2..ccb8d9a6202e 100644 --- a/content/manuals/build/builders/_index.md +++ b/content/manuals/build/builders/_index.md @@ -69,11 +69,11 @@ selected when you invoke builds. Even though `docker build` is an alias for `docker buildx build`, there are subtle differences between the two commands. With Buildx, the build client and -the and daemon (BuildKit) are decoupled. This means you can use multiple +the daemon (BuildKit) are decoupled. This means you can use multiple builders from a single client, even remote ones. The `docker build` command always defaults to using the default builder that -comes bundled with the Docker Engine, for ensuring backwards compatibility with +comes bundled with the Docker Engine, to ensure backwards compatibility with older versions of the Docker CLI. The `docker buildx build` command, on the other hand, checks whether you've set a different builder as the default builder before it sends your build to BuildKit. From ad49ff482fb10112f4845da3386faed0eedb662c Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Mon, 28 Apr 2025 15:58:15 +0100 Subject: [PATCH 338/699] ENGDOCS-2589 (#22507) ## Description Freshness to the Compose install pages and Bridge page ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/compose/bridge/_index.md | 1 + content/manuals/compose/install/_index.md | 32 +++++++------------- content/manuals/compose/install/linux.md | 19 ++---------- content/manuals/compose/install/uninstall.md | 18 ++++++----- 4 files changed, 25 insertions(+), 45 deletions(-) diff --git a/content/manuals/compose/bridge/_index.md b/content/manuals/compose/bridge/_index.md index c17ec26aa738..b84dcb8dba60 100644 --- a/content/manuals/compose/bridge/_index.md +++ b/content/manuals/compose/bridge/_index.md @@ -32,6 +32,7 @@ To get started with Compose Bridge, you need to: 2. Sign in to your Docker account. 3. Navigate to the **Features in development** tab in **Settings**. 4. From the **Experimental features** tab, select **Enable Compose Bridge**. +5. Select **Apply & restart**. ## Feedback diff --git a/content/manuals/compose/install/_index.md b/content/manuals/compose/install/_index.md index 8e24ad484bad..750c05b10d18 100644 --- a/content/manuals/compose/install/_index.md +++ b/content/manuals/compose/install/_index.md @@ -14,46 +14,36 @@ aliases: - /compose/install/compose-desktop/ --- -This page contains summary information about the available options for installing Docker Compose. +This page summarizes the different ways you can install Docker Compose, depending on your platform and needs. ## Installation scenarios -### Scenario one: Install Docker Desktop +### Scenario one: Install Docker Desktop (Recommended) -The easiest and recommended way to get Docker Compose is to install Docker Desktop. Docker Desktop -includes Docker Compose along with Docker Engine and Docker CLI which are Compose prerequisites. +The easiest and recommended way to get Docker Compose is to install Docker Desktop. -Docker Desktop is available on: +Docker Desktop includes Docker Compose along with Docker Engine and Docker CLI which are Compose prerequisites. + +Docker Desktop is available for: - [Linux](/manuals/desktop/setup/install/linux/_index.md) - [Mac](/manuals/desktop/setup/install/mac-install.md) - [Windows](/manuals/desktop/setup/install/windows-install.md) -If you have already installed Docker Desktop, you can check which version of Compose you have by selecting **About Docker Desktop** from the Docker menu {{< inline-image src="../../desktop/images/whale-x.svg" alt="whale menu" >}}. - -> [!NOTE] -> -> After Docker Compose V1 was removed in Docker Desktop version [4.23.0](/desktop/release-notes/#4230) as it had reached end-of-life, -> the `docker-compose` command now points directly to the Docker Compose V2 binary, running in standalone mode. -> If you rely on Docker Desktop auto-update, the symlink might be broken and command unavailable, as the update doesn't ask for administrator password. +> [!TIP] > -> This only affects Mac users. To fix this, either recreate the symlink: -> ```console -> $ sudo rm /usr/local/bin/docker-compose -> $ sudo ln -s /Applications/Docker.app/Contents/Resources/cli-plugins/docker-compose /usr/local/bin/docker-compose -> ``` -> Or enable [Automatically check configuration](/manuals/desktop/settings-and-maintenance/settings.md) which will detect and fix it for you. +> If you have already installed Docker Desktop, you can check which version of Compose you have by selecting **About Docker Desktop** from the Docker menu {{< inline-image src="../../desktop/images/whale-x.svg" alt="whale menu" >}}. -### Scenario two: Install the Docker Compose plugin +### Scenario two: Install the Docker Compose plugin (Linux only) > [!IMPORTANT] > -> This install scenario is only available on Linux. +> This method is only available on Linux. If you already have Docker Engine and Docker CLI installed, you can install the Docker Compose plugin from the command line, by either: - [Using Docker's repository](linux.md#install-using-the-repository) - [Downloading and installing manually](linux.md#install-the-plugin-manually) -### Scenario three: Install the Docker Compose standalone +### Scenario three: Install the Docker Compose standalone (Legacy) > [!WARNING] > diff --git a/content/manuals/compose/install/linux.md b/content/manuals/compose/install/linux.md index 4a4f87660fe9..d1b47fc2d139 100644 --- a/content/manuals/compose/install/linux.md +++ b/content/manuals/compose/install/linux.md @@ -23,7 +23,7 @@ To install the Docker Compose plugin on Linux, you can either: > [!NOTE] > -> These instructions assume you already have Docker Engine and Docker CLI installed and now want to install the Docker Compose plugin. For the Docker Compose standalone, see [Install the Docker Compose Standalone](standalone.md). +> These instructions assume you already have Docker Engine and Docker CLI installed and now want to install the Docker Compose plugin. ## Install using the repository @@ -58,14 +58,6 @@ To install the Docker Compose plugin on Linux, you can either: $ docker compose version ``` - Expected output: - - ```text - Docker Compose version vN.N.N - ``` - - Where `vN.N.N` is placeholder text standing in for the latest version. - ### Update Docker Compose To update the Docker Compose plugin, run the following commands: @@ -85,7 +77,7 @@ To update the Docker Compose plugin, run the following commands: ## Install the plugin manually -> [!NOTE] +> [!IMPORTANT] > > This option requires you to manage upgrades manually. It is recommended that you set up Docker's repository for easier maintenance. @@ -121,9 +113,4 @@ To update the Docker Compose plugin, run the following commands: ```console $ docker compose version ``` - - Expected output: - - ```text - Docker Compose version {{% param "compose_version" %}} - ``` + \ No newline at end of file diff --git a/content/manuals/compose/install/uninstall.md b/content/manuals/compose/install/uninstall.md index 8cda6ca42bc9..16585ab8b225 100644 --- a/content/manuals/compose/install/uninstall.md +++ b/content/manuals/compose/install/uninstall.md @@ -4,27 +4,29 @@ keywords: compose, orchestration, uninstall, uninstallation, docker, documentati title: Uninstall Docker Compose --- -Uninstalling Docker Compose depends on the method you have used to install Docker Compose. On this page you can find specific instructions to uninstall Docker Compose. +How you uninstall Docker Compose depends on how it was installed. This guide covers uninstallation instructions for: +- Docker Compose installed via Docker Desktop +- Docker Compose installed as a CLI plugin -## Uninstalling Docker Desktop +## Uninstalling Docker Compose with Docker Desktop If you want to uninstall Docker Compose and you have installed Docker Desktop, see [Uninstall Docker Desktop](/manuals/desktop/uninstall.md). > [!NOTE] > -> Unless you have other Docker instances installed on that specific environment, you would be removing Docker altogether by uninstalling Docker Desktop. +> Unless you have other Docker instances installed on that specific environment, uninstalling Docker Desktop removes all Docker components, including Docker Engine, Docker CLI, and Docker Compose. ## Uninstalling the Docker Compose CLI plugin -To remove the Docker Compose CLI plugin, run: +If you installed Docker Compose via a package manager, run: -Ubuntu, Debian: +On Ubuntu or Debian: ```console $ sudo apt-get remove docker-compose-plugin ``` -RPM-based distributions: +On RPM-based distributions: ```console $ sudo yum remove docker-compose-plugin @@ -32,7 +34,7 @@ RPM-based distributions: ### Manually installed -If you used `curl` to install Docker Compose CLI plugin, to uninstall it, run: +If you installed Docker Compose manually (using curl), remove it by deleting the binary: ```console $ rm $DOCKER_CONFIG/cli-plugins/docker-compose @@ -40,7 +42,7 @@ If you used `curl` to install Docker Compose CLI plugin, to uninstall it, run: ### Remove for all users -Or, if you have installed Docker Compose for all users, run: +If installed for all users, remove it from the system directory: ```console $ rm /usr/local/lib/docker/cli-plugins/docker-compose From eda11f93319b605ecf29212263c7399ff9c0d264 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Mon, 28 Apr 2025 15:58:30 +0100 Subject: [PATCH 339/699] ENGDOCS-2586 (#22496) ## Description Freshness on some Compose sections ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Co-authored-by: Sarah Sanders --- content/manuals/compose/_index.md | 6 +- content/manuals/compose/gettingstarted.md | 4 +- .../intro/compose-application-model.md | 6 +- content/manuals/compose/intro/history.md | 18 ++-- content/manuals/compose/releases/migrate.md | 87 +++++++++---------- .../manuals/compose/releases/release-notes.md | 6 +- .../compose/support-and-feedback/faq.md | 6 +- .../compose/support-and-feedback/feedback.md | 2 +- .../samples-for-compose.md | 20 +---- 9 files changed, 66 insertions(+), 89 deletions(-) diff --git a/content/manuals/compose/_index.md b/content/manuals/compose/_index.md index 71c95c12a21c..8f16cd62fedd 100644 --- a/content/manuals/compose/_index.md +++ b/content/manuals/compose/_index.md @@ -40,8 +40,8 @@ grid: description: Explore general FAQs and find out how to give feedback. icon: help link: /compose/faq -- title: Migrate to Compose V2 - description: Learn how to migrate from Compose V1 to V2 +- title: Migrate to Compose v2 + description: Learn how to migrate from Compose v1 to v2 icon: folder_delete link: /compose/releases/migrate/ aliases: @@ -55,7 +55,7 @@ aliases: Docker Compose is a tool for defining and running multi-container applications. It is the key to unlocking a streamlined and efficient development and deployment experience. -Compose simplifies the control of your entire application stack, making it easy to manage services, networks, and volumes in a single, comprehensible YAML configuration file. Then, with a single command, you create and start all the services +Compose simplifies the control of your entire application stack, making it easy to manage services, networks, and volumes in a single YAML configuration file. Then, with a single command, you create and start all the services from your configuration file. Compose works in all environments; production, staging, development, testing, as diff --git a/content/manuals/compose/gettingstarted.md b/content/manuals/compose/gettingstarted.md index 5475e9e1139e..70edc888e4ac 100644 --- a/content/manuals/compose/gettingstarted.md +++ b/content/manuals/compose/gettingstarted.md @@ -16,13 +16,13 @@ Using the Flask framework, the application features a hit counter in Redis, prov The concepts demonstrated here should be understandable even if you're not familiar with Python. -This is a non-normative example that just highlights the key things you can do with Compose. +This is a non-normative example that demonstrates core Compose functionality. ## Prerequisites Make sure you have: -- Installed the latest version of Docker Compose +- [Installed the latest version of Docker Compose](/manuals/compose/install/_index.md) - A basic understanding of Docker concepts and how Docker works ## Step 1: Set up diff --git a/content/manuals/compose/intro/compose-application-model.md b/content/manuals/compose/intro/compose-application-model.md index 510c35cb8bc3..127e99501a9d 100644 --- a/content/manuals/compose/intro/compose-application-model.md +++ b/content/manuals/compose/intro/compose-application-model.md @@ -23,7 +23,7 @@ Services store and share persistent data into [volumes](/reference/compose-file/ Some services require configuration data that is dependent on the runtime or platform. For this, the Specification defines a dedicated [configs](/reference/compose-file/configs.md) concept. From a service container point of view, configs are comparable to volumes, in that they are files mounted into the container. But the actual definition involves distinct platform resources and services, which are abstracted by this type. -A [secret](/reference/compose-file/secrets.md) is a specific flavor of configuration data for sensitive data that should not be exposed without security considerations. Secrets are made available to services as files mounted into their containers, but the platform-specific resources to provide sensitive data are specific enough to deserve a distinct concept and definition within the Compose specification. +A [secret](/reference/compose-file/secrets.md) is a specific flavor of configuration data for sensitive data that should not be exposed without security considerations. Secrets are made available to services as files mounted into their containers, but the platform-specific resources to provide sensitive data are specific enough to deserve a distinct concept and definition within the Compose Specification. > [!NOTE] > @@ -77,7 +77,7 @@ If you want to monitor the output of your running containers and debug issues, y $ docker compose logs ``` -To lists all the services along with their current status: +To list all the services along with their current status: ```console $ docker compose ps @@ -148,7 +148,7 @@ networks: back-tier: {} ``` -The `docker compose up` command starts the `frontend` and `backend` services, create the necessary networks and volumes, and injects the configuration and secret into the frontend service. +The `docker compose up` command starts the `frontend` and `backend` services, creates the necessary networks and volumes, and injects the configuration and secret into the frontend service. `docker compose ps` provides a snapshot of the current state of your services, making it easy to see which containers are running, their status, and the ports they are using: diff --git a/content/manuals/compose/intro/history.md b/content/manuals/compose/intro/history.md index a5829db706e7..862cb9eb12b3 100644 --- a/content/manuals/compose/intro/history.md +++ b/content/manuals/compose/intro/history.md @@ -1,7 +1,7 @@ --- title: History and development of Docker Compose linkTitle: History and development -description: History of Compose V1 and Compose YAML schema versioning +description: History of Compose v1 and Compose YAML schema versioning keywords: compose, compose yaml, swarm, migration, compatibility, docker compose vs docker-compose weight: 30 aliases: @@ -10,14 +10,14 @@ aliases: This page provides: - A brief history of the development of the Docker Compose CLI - - A clear explanation of the major versions and file formats that make up Compose V1 and Compose V2 - - The main differences between Compose V1 and Compose V2 + - A clear explanation of the major versions and file formats that make up Compose v1 and Compose v2 + - The main differences between Compose V1 and Compose v2 ## Introduction -![Image showing the main differences between Compose V1 and Compose V2](../images/v1-versus-v2.png) +![Image showing the main differences between Compose v1 and Compose v2](../images/v1-versus-v2.png) -The image above shows that the currently supported version of the Docker Compose CLI is Compose V2 which is defined by the [Compose Specification](/reference/compose-file/_index.md). +The previous image shows that the currently supported version of the Docker Compose CLI is Compose v2 which is defined by the [Compose Specification](/reference/compose-file/_index.md). It also provides a quick snapshot of the differences in file formats, command-line syntax, and top-level elements. This is covered in more detail in the following sections. @@ -27,7 +27,7 @@ Version one of the Docker Compose command-line binary was first released in 2014 Typically, Compose V1 projects include a top-level `version` element in the `compose.yaml` file, with values ranging from `2.0` to `3.8`, which refer to the specific [file formats](#compose-file-format-versioning). Version two of the Docker Compose command-line binary was announced in 2020, is written in Go, and is invoked with `docker compose`. -Compose V2 ignores the `version` top-level element in the `compose.yaml` file. +Compose v2 ignores the `version` top-level element in the `compose.yaml` file. ### Compose file format versioning @@ -39,12 +39,12 @@ Three major versions of the Compose file format for Compose V1 were released: - Compose file format 3.x with Compose 1.10.0 in 2017 Compose file format 1 is substantially different to all the following formats as it lacks a top-level `services` key. -Its usage is historical and files written in this format don't run with Compose V2. +Its usage is historical and files written in this format don't run with Compose v2. Compose file format 2.x and 3.x are very similar to each other, but the latter introduced many new options targeted at Swarm deployments. To address confusion around Compose CLI versioning, Compose file format versioning, and feature parity depending on whether Swarm mode was in use, file format 2.x and 3.x were merged into the [Compose Specification](/reference/compose-file/_index.md). -Compose V2 uses the Compose Specification for project definition. Unlike the prior file formats, the Compose Specification is rolling and makes the `version` top-level element optional. Compose V2 also makes use of optional specifications - [Deploy](/reference/compose-file/deploy.md), [Develop](/reference/compose-file/develop.md) and [Build](/reference/compose-file/build.md). +Compose v2 uses the Compose Specification for project definition. Unlike the prior file formats, the Compose Specification is rolling and makes the `version` top-level element optional. Compose v2 also makes use of optional specifications - [Deploy](/reference/compose-file/deploy.md), [Develop](/reference/compose-file/develop.md), and [Build](/reference/compose-file/build.md). -To make [migration](/manuals/compose/releases/migrate.md) easier, Compose V2 has backwards compatibility for certain elements that have been deprecated or changed between Compose file format 2.x/3.x and the Compose Specification. +To make [migration](/manuals/compose/releases/migrate.md) easier, Compose v2 has backwards compatibility for certain elements that have been deprecated or changed between Compose file format 2.x/3.x and the Compose Specification. diff --git a/content/manuals/compose/releases/migrate.md b/content/manuals/compose/releases/migrate.md index 5732e6349c00..1fc0ef126697 100644 --- a/content/manuals/compose/releases/migrate.md +++ b/content/manuals/compose/releases/migrate.md @@ -1,7 +1,7 @@ --- -title: Migrate to Compose V2 +title: Migrate to Compose v2 weight: 20 -description: How to migrate from Compose V1 to V2 +description: How to migrate from Compose v1 to v2 keywords: compose, upgrade, migration, v1, v2, docker compose vs docker-compose aliases: - /compose/compose-v2/ @@ -9,26 +9,25 @@ aliases: - /compose/migrate/ --- -From July 2023 Compose V1 stopped receiving updates. It’s also no longer available in new releases of Docker Desktop. +From July 2023, Compose v1 stopped receiving updates. It’s also no longer available in new releases of Docker Desktop. -Compose V2, which was first released in 2020, is included with all currently supported versions of Docker Desktop. It offers an improved CLI experience, improved build performance with BuildKit, and continued new-feature development. +Compose v2, which was first released in 2020, is included with all currently supported versions of Docker Desktop. It offers an improved CLI experience, improved build performance with BuildKit, and continued new-feature development. -## How do I switch to Compose V2? +## How do I switch to Compose v2? -The easiest and recommended way is to make sure you have the latest version of [Docker Desktop](/manuals/desktop/release-notes.md), which bundles the Docker Engine and Docker CLI platform including Compose V2. +The easiest and recommended way is to make sure you have the latest version of [Docker Desktop](/manuals/desktop/release-notes.md), which bundles the Docker Engine and Docker CLI platform including Compose v2. -With Docker Desktop, Compose V2 is always accessible as `docker compose`. -Additionally, the **Use Compose V2** setting is turned on by default, which provides an alias from `docker-compose`. +With Docker Desktop, Compose v2 is always accessible as `docker compose`. -For manual installs on Linux, you can get Compose V2 by either: +For manual installs on Linux, you can get Compose v2 by either: - [Using Docker's repository](/manuals/compose/install/linux.md#install-using-the-repository) (recommended) - [Downloading and installing manually](/manuals/compose/install/linux.md#install-the-plugin-manually) -## What are the differences between Compose V1 and Compose V2? +## What are the differences between Compose v1 and Compose v2? ### `docker-compose` vs `docker compose` -Unlike Compose V1, Compose V2 integrates into the Docker CLI platform and the recommended command-line syntax is `docker compose`. +Unlike Compose v1, Compose v2 integrates into the Docker CLI platform and the recommended command-line syntax is `docker compose`. The Docker CLI platform provides a consistent and predictable set of options and flags, such as the `DOCKER_HOST` environment variable or the `--context` command-line flag. @@ -37,49 +36,49 @@ For example, `docker --log-level=debug --tls compose up` enables debug logging f > [!TIP] > -> Update scripts to use Compose V2 by replacing the hyphen (`-`) with a space, using `docker compose` instead of `docker-compose`. +> Update scripts to use Compose v2 by replacing the hyphen (`-`) with a space, using `docker compose` instead of `docker-compose`. ### Service container names Compose generates container names based on the project name, service name, and scale/replica count. -In Compose V1, an underscore (`_`) was used as the word separator. -In Compose V2, a hyphen (`-`) is used as the word separator. +In Compose v1, an underscore (`_`) was used as the word separator. +In Compose v2, a hyphen (`-`) is used as the word separator. Underscores aren't valid characters in DNS hostnames. -By using a hyphen instead, Compose V2 ensures service containers can be accessed over the network via consistent, predictable hostnames. +By using a hyphen instead, Compose v2 ensures service containers can be accessed over the network via consistent, predictable hostnames. -For example, running the Compose command `-p myproject up --scale=1 svc` results in a container named `myproject_svc_1` with Compose V1 and a container named `myproject-svc-1` with Compose V2. +For example, running the Compose command `-p myproject up --scale=1 svc` results in a container named `myproject_svc_1` with Compose v1 and a container named `myproject-svc-1` with Compose v2. > [!TIP] > ->In Compose V2, the global `--compatibility` flag or `COMPOSE_COMPATIBILITY` environment variable preserves the Compose V1 behavior to use underscores (`_`) as the word separator. -As this option must be specified for every Compose V2 command run, it's recommended that you only use this as a temporary measure while transitioning to Compose V2. +> In Compose v2, the global `--compatibility` flag or `COMPOSE_COMPATIBILITY` environment variable preserves the Compose v1 behavior to use underscores (`_`) as the word separator. +As this option must be specified for every Compose v2 command run, it's recommended that you only use this as a temporary measure while transitioning to Compose v2. ### Command-line flags and subcommands -Compose V2 supports almost all Compose V1 flags and subcommands, so in most cases, it can be used as a drop-in replacement in scripts. +Compose v2 supports almost all Compose V1 flags and subcommands, so in most cases, it can be used as a drop-in replacement in scripts. -#### Unsupported in V2 +#### Unsupported in v2 -The following were deprecated in Compose V1 and aren't supported in Compose V2: +The following were deprecated in Compose v1 and aren't supported in Compose v2: * `docker-compose scale`. Use `docker compose up --scale` instead. * `docker-compose rm --all` -#### Different in V2 +#### Different in v2 -The following behave differently between Compose V1 and V2: +The following behave differently between Compose v1 and v2: -| | Compose V1 | Compose V2 | +| | Compose v1 | Compose v2 | |-------------------------|------------------------------------------------------------------|-------------------------------------------------------------------------------| -| `--compatibility` | Deprecated. Migrates YAML fields based on legacy schema version. | Uses `_` as word separator for container names instead of `-` to match V1. | +| `--compatibility` | Deprecated. Migrates YAML fields based on legacy schema version. | Uses `_` as word separator for container names instead of `-` to match v1. | | `ps --filter KEY-VALUE` | Undocumented. Allows filtering by arbitrary service properties. | Only allows filtering by specific properties, e.g. `--filter=status=running`. | ### Environment variables -Environment variable behavior in Compose V1 wasn't formally documented and behaved inconsistently in some edge cases. +Environment variable behavior in Compose v1 wasn't formally documented and behaved inconsistently in some edge cases. -For Compose V2, the [Environment variables](/manuals/compose/how-tos/environment-variables/_index.md) section covers both [precedence](/manuals/compose/how-tos/environment-variables/envvars-precedence.md) as well as [`.env` file interpolation](/manuals/compose/how-tos/environment-variables/variable-interpolation.md) and includes many examples covering tricky situations such as escaping nested quotes. +For Compose v2, the [Environment variables](/manuals/compose/how-tos/environment-variables/_index.md) section covers both [precedence](/manuals/compose/how-tos/environment-variables/envvars-precedence.md) as well as [`.env` file interpolation](/manuals/compose/how-tos/environment-variables/variable-interpolation.md) and includes many examples covering tricky situations such as escaping nested quotes. Check if: - Your project uses multiple levels of environment variable overrides, for example `.env` file and `--env` CLI flags. @@ -89,17 +88,17 @@ Check if: > [!TIP] > -> Run `docker compose config` on the project to preview the configuration after Compose V2 has performed interpolation to +> Run `docker compose config` on the project to preview the configuration after Compose v2 has performed interpolation to verify that values appear as expected. > -> Maintaining backwards compatibility with Compose V1 is typically achievable by ensuring that literal values (no +> Maintaining backwards compatibility with Compose v1 is typically achievable by ensuring that literal values (no interpolation) are single-quoted and values that should have interpolation applied are double-quoted. -## What does this mean for my projects that use Compose V1? +## What does this mean for my projects that use Compose v1? -For most projects, switching to Compose V2 requires no changes to the Compose YAML or your development workflow. +For most projects, switching to Compose v2 requires no changes to the Compose YAML or your development workflow. -It's recommended that you adapt to the new preferred way of running Compose V2, which is to use `docker compose` instead of `docker-compose`. +It's recommended that you adapt to the new preferred way of running Compose v2, which is to use `docker compose` instead of `docker-compose`. This provides additional flexibility and removes the requirement for a `docker-compose` compatibility alias. However, Docker Desktop continues to support a `docker-compose` alias to redirect commands to `docker compose` for convenience and improved compatibility with third-party tools and scripts. @@ -108,28 +107,28 @@ However, Docker Desktop continues to support a `docker-compose` alias to redirec ### Migrating running projects -In both V1 and V2, running `up` on a Compose project recreates service containers as necessary to reach the desired state based on comparing the actual state in the Docker Engine to the resolved project configuration including Compose YAML, environment variables, and command-line flags. +In both v1 and v2, running up on a Compose project recreates service containers as needed. It compares the actual state in the Docker Engine to the resolved project configuration, which includes the Compose YAML, environment variables, and command-line flags. -Because Compose V1 and V2 [name service containers differently](#service-container-names), running `up` using V2 the first time on a project with running services originally launched by V1, results in service containers being recreated with updated names. +Because Compose v1 and v2 [name service containers differently](#service-container-names), running `up` using v2 the first time on a project with running services originally launched by v1, results in service containers being recreated with updated names. -Note that even if `--compatibility` flag is used to preserve the V1 naming style, Compose still needs to recreate service containers originally launched by V1 the first time `up` is run by V2 to migrate the internal state. +Note that even if `--compatibility` flag is used to preserve the v1 naming style, Compose still needs to recreate service containers originally launched by v1 the first time `up` is run by v2 to migrate the internal state. -### Using Compose V2 with Docker-in-Docker +### Using Compose v2 with Docker-in-Docker -Compose V2 is now included in the [Docker official image on Docker Hub](https://hub.docker.com/_/docker). +Compose v2 is now included in the [Docker official image on Docker Hub](https://hub.docker.com/_/docker). -Additionally, a new [docker/compose-bin image on Docker Hub](https://hub.docker.com/r/docker/compose-bin) packages the latest version of Compose V2 for use in multi-stage builds. +Additionally, a new [docker/compose-bin image on Docker Hub](https://hub.docker.com/r/docker/compose-bin) packages the latest version of Compose v2 for use in multi-stage builds. -## Can I still use Compose V1 if I want to? +## Can I still use Compose v1 if I want to? -Yes. You can still download and install Compose V1 packages, but you won't get support from Docker if anything breaks. +Yes. You can still download and install Compose v1 packages, but you won't get support from Docker if anything breaks. >[!WARNING] > -> The final Compose V1 release, version 1.29.2, was May 10, 2021. These packages haven't received any security updates since then. Use at your own risk. +> The final Compose v1 release, version 1.29.2, was May 10, 2021. These packages haven't received any security updates since then. Use at your own risk. ## Additional Resources -- [docker-compose V1 on PyPI](https://pypi.org/project/docker-compose/1.29.2/) -- [docker/compose V1 on Docker Hub](https://hub.docker.com/r/docker/compose) -- [docker-compose V1 source on GitHub](https://github.com/docker/compose/releases/tag/1.29.2) +- [docker-compose v1 on PyPI](https://pypi.org/project/docker-compose/1.29.2/) +- [docker/compose v1 on Docker Hub](https://hub.docker.com/r/docker/compose) +- [docker-compose v1 source on GitHub](https://github.com/docker/compose/releases/tag/1.29.2) diff --git a/content/manuals/compose/releases/release-notes.md b/content/manuals/compose/releases/release-notes.md index c8e6064da395..2884e93cafcc 100644 --- a/content/manuals/compose/releases/release-notes.md +++ b/content/manuals/compose/releases/release-notes.md @@ -27,16 +27,13 @@ For more detailed information, see the [release notes in the Compose repo](https - Dependencies upgrade: bump docker engine and cli to v28.0.4 - Dependencies upgrade: bump buildx to v0.22.0 - - - ## 2.35.0 {{< release-date date="2025-04-10" >}} ### Bug fixes and enhancements -- Added support for Docker Model Runner to easily integrate AI models into your Compose applications +- Added support for [Docker Model Runner](/manuals/desktop/features/model-runner.md) to easily integrate AI models into your Compose applications - Added `build --print` command to help debug complex build configurations by showing the equivalent bake file - Added `volume.type=image` to provide more flexible volume management for container images - Added `--quiet` options to the `run` command for cleaner output when running containers @@ -51,7 +48,6 @@ For more detailed information, see the [release notes in the Compose repo](https - Dependencies upgrade: bump buildx to v0.23.0 - Dependencies upgrade: bump buildkit to v0.21.0 - ## 2.34.0 {{< release-date date="2025-03-14" >}} diff --git a/content/manuals/compose/support-and-feedback/faq.md b/content/manuals/compose/support-and-feedback/faq.md index d22e922198f0..52a113bb04fc 100644 --- a/content/manuals/compose/support-and-feedback/faq.md +++ b/content/manuals/compose/support-and-feedback/faq.md @@ -11,9 +11,9 @@ aliases: ### What is the difference between `docker compose` and `docker-compose` -Version one of the Docker Compose command-line binary was first released in 2014. It was written in Python, and is invoked with `docker-compose`. Typically, Compose V1 projects include a top-level version element in the compose.yaml file, with values ranging from 2.0 to 3.8, which refer to the specific file formats. +Version one of the Docker Compose command-line binary was first released in 2014. It was written in Python, and is invoked with `docker-compose`. Typically, Compose v1 projects include a top-level version element in the `compose.yaml` file, with values ranging from 2.0 to 3.8, which refer to the specific file formats. -Version two of the Docker Compose command-line binary was announced in 2020, is written in Go, and is invoked with `docker compose`. Compose V2 ignores the version top-level element in the compose.yaml file. +Version two of the Docker Compose command-line binary was announced in 2020, is written in Go, and is invoked with `docker compose`. Compose v2 ignores the version top-level element in the compose.yaml file. For further information, see [History and development of Compose](/manuals/compose/intro/history.md). @@ -91,7 +91,7 @@ any JSON file should be valid YAML. To use a JSON file with Compose, specify the filename to use, for example: ```console -$ docker compose -f docker-compose.json up +$ docker compose -f compose.json up ``` ### Should I include my code with `COPY`/`ADD` or a volume? diff --git a/content/manuals/compose/support-and-feedback/feedback.md b/content/manuals/compose/support-and-feedback/feedback.md index bfc6e06ae637..04466f8a4e59 100644 --- a/content/manuals/compose/support-and-feedback/feedback.md +++ b/content/manuals/compose/support-and-feedback/feedback.md @@ -21,4 +21,4 @@ To report bugs or problems, visit [Docker Compose on GitHub](https://github.com/ ### Feedback via Community Slack channels -You can also provide feedback through the #docker-compose [Docker Community Slack](https://dockr.ly/comm-slack) channel. +You can also provide feedback through the `#docker-compose` [Docker Community Slack](https://dockr.ly/comm-slack) channel. diff --git a/content/manuals/compose/support-and-feedback/samples-for-compose.md b/content/manuals/compose/support-and-feedback/samples-for-compose.md index 7372e25b0c5f..cbeb84380e40 100644 --- a/content/manuals/compose/support-and-feedback/samples-for-compose.md +++ b/content/manuals/compose/support-and-feedback/samples-for-compose.md @@ -17,30 +17,12 @@ if you have not already done so. The samples should help you to: - Define services based on Docker images using - [Compose files](/reference/compose-file/_index.md): `compose.yaml` and - `docker-stack.yml` + [Compose files](/reference/compose-file/_index.md) - Understand the relationship between `compose.yaml` and [Dockerfiles](/reference/dockerfile/) - Learn how to make calls to your application services from Compose files - Learn how to deploy applications and services to a [swarm](/manuals/engine/swarm/_index.md) -## Samples tailored to demo Compose - -These samples focus specifically on Docker Compose: - -- [Quickstart: Compose and ELK](https://github.com/docker/awesome-compose/tree/master/elasticsearch-logstash-kibana/README.md) - Shows - how to use Docker Compose to set up and run ELK - Elasticsearch-Logstash-Kibana. - -- [Quickstart: Compose and Django](https://github.com/docker/awesome-compose/tree/master/official-documentation-samples/django/README.md) - Shows - how to use Docker Compose to set up and run a simple Django/PostgreSQL app. - -- [Quickstart: Compose and Rails](https://github.com/docker/awesome-compose/tree/master/official-documentation-samples/rails/README.md) - Shows - how to use Docker Compose to set up and run a Rails/PostgreSQL app. - -- [Quickstart: Compose and WordPress](https://github.com/docker/awesome-compose/tree/master/official-documentation-samples/wordpress/README.md) - Shows - how to use Docker Compose to set up and run WordPress in an isolated - environment with Docker containers. - ## Awesome Compose samples The Awesome Compose samples provide a starting point on how to integrate different frameworks and technologies using Docker Compose. All samples are available in the [Awesome-compose GitHub repo](https://github.com/docker/awesome-compose) and are ready to run with `docker compose up`. From a7be08a1588081f1784ab069d8fd8083e65b56ef Mon Sep 17 00:00:00 2001 From: george Date: Mon, 28 Apr 2025 18:07:19 +0200 Subject: [PATCH 340/699] DD 4.41.0 release notes (#22468) Docker Desktop 4.41.0 release notes --- content/manuals/desktop/release-notes.md | 58 ++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/content/manuals/desktop/release-notes.md b/content/manuals/desktop/release-notes.md index 275183a50ed0..2016a004a079 100644 --- a/content/manuals/desktop/release-notes.md +++ b/content/manuals/desktop/release-notes.md @@ -29,6 +29,64 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo > > If you're experiencing malware detection issues on Mac, follow the steps documented in [docker/for-mac#7527](https://github.com/docker/for-mac/issues/7527). +## 4.41.0 + +{{< release-date date="2025-04-28" >}} + +{{< desktop-install-v2 all=true beta_win_arm=true version="4.41.0" build_path="/190950/" >}} + +### New + +- Docker Model Runner is now available on Windows machines with NVIDIA GPUs. +- You can now push models to Docker Hub with Docker Model Runner. +- Added support for Docker Model Runner's model management and chat interface in Docker Desktop for Mac and Windows (on hardware supporting Docker Model Runner). Users can now view, interact with, and manage local AI models through a new dedicated interface. +- Docker Compose and Testcontainers Java and Go now support Docker Model Runner. +- Introducing Docker Desktop in the Microsoft App Store. +- MacOS QEMU Virtualization option deprecation. + +### Upgrades + +- [Docker Engine v28.1.1](https://docs.docker.com/engine/release-notes/28.1/#2811) +- [Docker Compose v2.35.1](https://github.com/docker/compose/releases/tag/v2.35.1) +- [Docker Buildx v0.23.0](https://github.com/docker/buildx/releases/tag/v0.23.0) +- [Docker Scout CLI v1.17.1](https://github.com/docker/scout-cli/releases/tag/v1.17.1) +- [Compose Bridge v0.0.19](https://github.com/docker/compose-bridge-binaries/releases/tag/v0.0.19) + +### Bug fixes and enhancements + +#### For all platforms + +- Fixed a bug in DockerVMM that caused an excessive number of open file handles on the host. +- Fixed an issue where Docker Desktop failed to start if the `admin-settings.json` file didn't contain the optional `configurationFileVersion` configuration. +- Fixed a bug that was causing outgoing UDP connections to be eagerly closed. +- Enhanced log reading experience with advanced search capabilities and container-level filtering, enabling quicker debugging and troubleshooting. +- Improved error messages when downloading Registry Access Management configuration. +- If Docker can't bind an ICMPv4 socket, it now logs an error and continues rather than quits. +- Enabled the memory protection keys mechanism in the Docker Desktop Linux VM, allowing containers like Oracle database images to run correctly. +- Fixed a problem with containers accessing `/proc/sys/kernel/shm*` sysctls when [Enhanced Container Isolation](/manuals/security/for-admins/hardened-desktop/enhanced-container-isolation/_index.md) is enabled on Mac, Windows Hyper-V, or Linux. +- Added kernel module `nft_fib_inet`, required for running firewalld in a Linux container. + +#### For Mac + +- Fixed a bug that caused high CPU usage. Fixes [docker/for-mac#7643](https://github.com/docker/for-mac/issues/7643). +- Fixed multi-arch build issue with Rosetta on M3 Macs. +- Fixed an issue where absence of `/Library/Application Support/com.docker.docker/` directory can cause failure to apply RAM policy restrictions. + +#### For Windows + +- The Windows `.exe` installer now includes improved handling of locked files. Fixes [docker/for-win#14299](https://github.com/docker/for-win/issues/14299) and [docker/for-win#14316](https://github.com/docker/for-win/issues/14316). +- Fixed `Docker Desktop.exe` not showing version information after installation. Fixes [docker/for-win#14703](https://github.com/docker/for-win/issues/14703). + +### Known issues + +#### For all platforms + +- If you have enforced sign-in using `desktop.plist` and also have a `registry.json`, sign-in will fail if the user belongs to an organization listed in `desktop.plist` but not to any organizations specified in `registry.json`. To resolve this, remove the `registry.json` file. + +#### For Windows + +- If multiple organizations are specified in the `allowedOrgs` Windows registry key using space-separated format, sign-in will fail and user will be logged out. As a workaround, specify each organization on a separate line in the registry key value. + ## 4.40.0 {{< release-date date="2025-03-31" >}} From 75e9bc4f53f493fd5c3f33d3c8a97572cf71d1a3 Mon Sep 17 00:00:00 2001 From: Guillaume Lours <705411+glours@users.noreply.github.com> Date: Mon, 28 Apr 2025 18:07:41 +0200 Subject: [PATCH 341/699] add Compose how-to page for Docker Model Runner support with Compose (#22392) ## Description Add how-to page explaining how to use Docker Model Runner with Compose ## Related issues or tickets https://docker.atlassian.net/browse/APCLI-1068 ## Reviews - [x] Technical review - [x] Editorial review - [ ] Product review --------- Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> Co-authored-by: aevesdocker --- .../manuals/compose/how-tos/model-runner.md | 66 +++++++++++++++++++ data/summary.yaml | 2 + 2 files changed, 68 insertions(+) create mode 100644 content/manuals/compose/how-tos/model-runner.md diff --git a/content/manuals/compose/how-tos/model-runner.md b/content/manuals/compose/how-tos/model-runner.md new file mode 100644 index 000000000000..22b4e37e0c98 --- /dev/null +++ b/content/manuals/compose/how-tos/model-runner.md @@ -0,0 +1,66 @@ +--- +title: Use Docker Model Runner +description: Learn how to integrate Docker Model Runner with Docker Compose to build AI-powered applications +keywords: compose, docker compose, model runner, ai, llm, artificial intelligence, machine learning +weight: 111 +params: + sidebar: + badge: + color: green + text: New +--- + +{{< summary-bar feature_name="Compose model runner" >}} + +Docker Model Runner can be integrated with Docker Compose to run AI models as part of your multi-container applications. +This lets you define and run AI-powered applications alongside your other services. + +## Prerequisites + +- Docker Compose v2.35 or later +- Docker Desktop 4.41 or later +- Docker Desktop for Mac with Apple Silicon or Docker Desktop for Windows with NVIDIA GPU +- [Docker Model Runner enabled in Docker Desktop](/manuals/desktop/features/model-runner.md#enable-docker-model-runner) + +## Provider services + +Compose introduces a new service type called `provider` that allows you to declare platform capabilities required by your application. For AI models, you can use the `model` type to declare model dependencies. + +Here's an example of how to define a model provider: + +```yaml +services: + chat: + image: my-chat-app + depends_on: + - ai-runner + + ai-runner: + provider: + type: model + options: + model: ai/smollm2 +``` + +Notice the dedicated `provider` attribute in the `ai-runner` service. +This attribute specifies that the service is a model provider and lets you define options such as the name of the model to be used. + +There is also a `depends_on` attribute in the `chat` service. +This attribute specifies that the `chat` service depends on the `ai-runner` service. +This means that the `ai-runner` service will be started before the `chat` service to allow injection of model information to the `chat` service. + +## How it works + +During the `docker compose up` process, Docker Model Runner automatically pulls and runs the specified model. +It also sends Compose the model tag name and the URL to access the model runner. + +This information is then passed to services which declare a dependency on the model provider. +In the example above, the `chat` service receives 2 environment variables prefixed by the service name: + - `AI-RUNNER_URL` with the URL to access the model runner + - `AI-RUNNER_MODEL` with the model name which could be passed with the URL to request the model. + +This lets the `chat` service to interact with the model and use it for its own purposes. + +## Reference + +- [Docker Model Runner documentation](/manuals/desktop/features/model-runner.md) diff --git a/data/summary.yaml b/data/summary.yaml index 4fe1f4f08607..0ce7eb522363 100644 --- a/data/summary.yaml +++ b/data/summary.yaml @@ -105,6 +105,8 @@ Compose mac address: requires: Docker Compose [2.23.2](/manuals/compose/releases/release-notes.md#2232) and later Compose menu: requires: Docker Compose [2.26.0](/manuals/compose/releases/release-notes.md#2260) and later +Compose model runner: + requires: Docker Compose [2.35.0](/manuals/compose/releases/release-notes.md#2300) and later, and Docker Desktop 4.41 and later Compose OCI artifact: requires: Docker Compose [2.34.0](/manuals/compose/releases/release-notes.md#2340) and later Compose replace file: From b193ebe8507805c4cb93daa8e5f5591d8640d7d4 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Mon, 28 Apr 2025 17:08:09 +0100 Subject: [PATCH 342/699] ENGDOCS-2573 (#22467) ## Description Enhanced logs experience ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/desktop/use-desktop/container.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/content/manuals/desktop/use-desktop/container.md b/content/manuals/desktop/use-desktop/container.md index 830d30f6f231..2a4ff86a54eb 100644 --- a/content/manuals/desktop/use-desktop/container.md +++ b/content/manuals/desktop/use-desktop/container.md @@ -35,7 +35,7 @@ From here, you can use the quick action buttons to perform various actions such ### Logs -Select **Logs** to see logs from the container. You can also: +Select **Logs** to view output from the container in real time. While viewing logs, you can: - Use `Cmd + f`/`Ctrl + f` to open the search bar and find specific entries. Search matches are highlighted in yellow. @@ -43,12 +43,16 @@ Select **Logs** to see logs from the container. You can also: respectively. - Use the **Copy** icon in the top right-hand corner to copy all the logs to your clipboard. -- Automatically copy any logs content by highlighting a few lines or a section - of the logs. +- Show timestamps - Use the **Clear terminal** icon in the top right-hand corner to clear the logs terminal. - Select and view external links that may be in your logs. +You can refine your view by: + +- Filtering logs for specific containers, if you're running a multi-container application. +- Using regular expressions or exact match search terms + ### Inspect Select **Inspect** to view low-level information about the container. It displays the local path, version number of the image, SHA-256, port mapping, and other details. From 8b9bf56df81a0d6bb766ed4e3c61f13196a3d861 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Mon, 28 Apr 2025 17:08:23 +0100 Subject: [PATCH 343/699] ENGDOCS-2575 (#22475) ## Description Adds new way to download the DD for Windows installer ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/desktop/setup/install/windows-install.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/manuals/desktop/setup/install/windows-install.md b/content/manuals/desktop/setup/install/windows-install.md index 7a19b8fe8bb8..259eab642863 100644 --- a/content/manuals/desktop/setup/install/windows-install.md +++ b/content/manuals/desktop/setup/install/windows-install.md @@ -31,6 +31,7 @@ aliases: This page provides download links, system requirements, and step-by-step installation instructions for Docker Desktop on Windows. {{< button text="Docker Desktop for Windows - x86_64" url="https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-win-amd64" >}} +{{< button text="Docker Desktop for Windows - x86_64 on the Microsoft Store" url="https://apps.microsoft.com/detail/xp8cbj40xlbwkx?hl=en-GB&gl=GB" >}} {{< button text="Docker Desktop for Windows - Arm (Beta)" url="https://desktop.docker.com/win/main/arm64/Docker%20Desktop%20Installer.exe?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-win-arm64" >}} _For checksums, see [Release notes](/manuals/desktop/release-notes.md)_ From ef5c24df4dac339d2fde28db616c91a345ef2f99 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Mon, 28 Apr 2025 17:08:50 +0100 Subject: [PATCH 344/699] ENGDOCS-2576 (#22476) ## Description Adds QEMU deprecation date ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/desktop/features/vmm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/desktop/features/vmm.md b/content/manuals/desktop/features/vmm.md index fc9be6f8456a..5e977f7c6aab 100644 --- a/content/manuals/desktop/features/vmm.md +++ b/content/manuals/desktop/features/vmm.md @@ -43,7 +43,7 @@ The Apple Virtualization framework is a stable and well-established option for m > [!NOTE] > -> QEMU will be deprecated in a future release. +> QEMU will be deprecated on July 14, 2025. For more information, see the [blog announcement](https://www.docker.com/blog/docker-desktop-for-mac-qemu-virtualization-option-to-be-deprecated-in-90-days/) QEMU is a legacy virtualization option for Apple Silicon Macs, primarily supported for older use cases. From 1e394dd3cc86737031854dddc184a6101b77da0c Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Mon, 28 Apr 2025 17:09:07 +0100 Subject: [PATCH 345/699] ENGDOCS-2572 (#22466) ## Description - Add Windows NVIDIA GPU support for DMR - Add new `push` and `logs` functionality - Update enable Gordon process to reflect GUI updates - Known issues cleanup ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Co-authored-by: Sarah Sanders --- .../manuals/desktop/features/gordon/_index.md | 2 + .../manuals/desktop/features/model-runner.md | 58 +++++++++++++++---- data/summary.yaml | 2 +- 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/content/manuals/desktop/features/gordon/_index.md b/content/manuals/desktop/features/gordon/_index.md index 22f15e89738e..4c4295ab8abd 100644 --- a/content/manuals/desktop/features/gordon/_index.md +++ b/content/manuals/desktop/features/gordon/_index.md @@ -97,6 +97,8 @@ If you have concerns about data collection or usage, you can 9. Select **Apply & restart**. +You can also enable Ask Gordon from the **Ask Gordon** tab if you have selected the **Access experimental features** setting. Simply select the **Enable Ask Gordon** button, and then accept the Docker AI terms of service agreement. + ## Using Ask Gordon The primary interfaces to Docker's AI capabilities are through the **Ask diff --git a/content/manuals/desktop/features/model-runner.md b/content/manuals/desktop/features/model-runner.md index daec14150b43..267f42cdb8b4 100644 --- a/content/manuals/desktop/features/model-runner.md +++ b/content/manuals/desktop/features/model-runner.md @@ -17,10 +17,15 @@ The Docker Model Runner plugin lets you: - [Pull models from Docker Hub](https://hub.docker.com/u/ai) - Run AI models directly from the command line - Manage local models (add, list, remove) -- Interact with models using a submitted prompt or in chat mode +- Interact with models using a submitted prompt or in chat mode in the CLI or Docker Desktop Dashboard +- Push models to Docker Hub Models are pulled from Docker Hub the first time they're used and stored locally. They're loaded into memory only at runtime when a request is made, and unloaded when not in use to optimize resources. Since models can be large, the initial pull may take some time — but after that, they're cached locally for faster access. You can interact with the model using [OpenAI-compatible APIs](#what-api-endpoints-are-available). +> [!TIP] +> +> Using Testcontainers? [Testcontainers for Java](https://java.testcontainers.org/modules/docker_model_runner/) and [Go](https://golang.testcontainers.org/modules/dockermodelrunner/) now support Docker Model Runner. + ## Enable Docker Model Runner 1. Navigate to the **Features in development** tab in settings. @@ -31,6 +36,8 @@ Models are pulled from Docker Hub the first time they're used and stored locally 6. Navigate to **Features in development**. 7. From the **Beta** tab, check the **Enable Docker Model Runner** setting. +You can now use the `docker model` command in the CLI and view and interact with your local models in the **Models** tab in the Docker Desktop Dashboard. + ## Available commands ### Model runner status @@ -84,6 +91,8 @@ Downloaded: 257.71 MB Model ai/smollm2 pulled successfully ``` +The models also display in the Docker Desktop Dashboard. + ### List available models Lists all models currently pulled to your local environment. @@ -118,7 +127,7 @@ Hello! How can I assist you today? #### Interactive chat ```console -docker model run ai/smollm2 +$ docker model run ai/smollm2 ``` Output: @@ -131,6 +140,41 @@ Hi there! It's SmolLM, AI assistant. How can I help you today? Chat session ended. ``` +> [!TIP] +> +> You can also use chat mode in the Docker Desktop Dashboard when you select the model in the **Models** tab. + +### Upload a model to Docker Hub + +Use the following command to push your model to Docker Hub: + +```console +$ docker model push / +``` + +### Tag a model + +You can specify a particular version or variant of the model: + +```console +$ docker model tag +``` + +If no tag is provided, Docker defaults to `latest`. + +### View the logs + +Fetch logs from Docker Model Runner to monitor activity or debug issues. + +```console +$ docker model logs +``` + +The following flags are accepted: + +- `-f`/`--follow`: View logs with real-time streaming +- `--no-engines`: Exclude inference engine logs from the output + ### Remove a model Removes a downloaded model from your system. @@ -308,20 +352,10 @@ Once linked, re-run the command. Currently, Docker Model Runner doesn't include safeguards to prevent you from launching models that exceed their system’s available resources. Attempting to run a model that is too large for the host machine may result in severe slowdowns or render the system temporarily unusable. This issue is particularly common when running LLMs models without sufficient GPU memory or system RAM. -### `model run` drops into chat even if pull fails - -If a model image fails to pull successfully, for example due to network issues or lack of disk space, the `docker model run` command will still drop you into the chat interface, even though the model isn’t actually available. This can lead to confusion, as the chat will not function correctly without a running model. - -You can manually retry the `docker model pull` command to ensure the image is available before running it again. - ### No consistent digest support in Model CLI The Docker Model CLI currently lacks consistent support for specifying models by image digest. As a temporary workaround, you should refer to models by name instead of digest. -### Misleading pull progress after failed initial attempt - -In some cases, if an initial `docker model pull` fails partway through, a subsequent successful pull may misleadingly report “0 bytes” downloaded even though data is being fetched in the background. This can give the impression that nothing is happening, when in fact the model is being retrieved. Despite the incorrect progress output, the pull typically completes as expected. - ## Share feedback Thanks for trying out Docker Model Runner. Give feedback or report any bugs you may find through the **Give feedback** link next to the **Enable Docker Model Runner** setting. diff --git a/data/summary.yaml b/data/summary.yaml index 0ce7eb522363..3f5953caf82b 100644 --- a/data/summary.yaml +++ b/data/summary.yaml @@ -147,7 +147,7 @@ Docker GitHub Copilot: Docker Model Runner: availability: Beta requires: Docker Desktop 4.40 and later - for: Docker Desktop for Mac with Apple Silicon + for: Docker Desktop for Mac with Apple Silicon or Windows with NVIDIA GPUs Docker Projects: availability: Beta Docker Init: From 744ff18368779ddca4358c303a98e6d50289775d Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Mon, 28 Apr 2025 17:29:06 +0100 Subject: [PATCH 346/699] 4.41-follow-ups (#22508) ## Description ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/desktop/features/model-runner.md | 4 ++-- content/manuals/desktop/release-notes.md | 14 +++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/content/manuals/desktop/features/model-runner.md b/content/manuals/desktop/features/model-runner.md index 267f42cdb8b4..c0d63a8f2482 100644 --- a/content/manuals/desktop/features/model-runner.md +++ b/content/manuals/desktop/features/model-runner.md @@ -24,7 +24,7 @@ Models are pulled from Docker Hub the first time they're used and stored locally > [!TIP] > -> Using Testcontainers? [Testcontainers for Java](https://java.testcontainers.org/modules/docker_model_runner/) and [Go](https://golang.testcontainers.org/modules/dockermodelrunner/) now support Docker Model Runner. +> Using Testcontainers or Docker Compose? [Testcontainers for Java](https://java.testcontainers.org/modules/docker_model_runner/) and [Go](https://golang.testcontainers.org/modules/dockermodelrunner/), and [Docker Compose](/manuals/compose/how-tos/model-runner.md) now support Docker Model Runner. ## Enable Docker Model Runner @@ -144,7 +144,7 @@ Chat session ended. > > You can also use chat mode in the Docker Desktop Dashboard when you select the model in the **Models** tab. -### Upload a model to Docker Hub +### Push a model to Docker Hub Use the following command to push your model to Docker Hub: diff --git a/content/manuals/desktop/release-notes.md b/content/manuals/desktop/release-notes.md index 2016a004a079..7f5f82093860 100644 --- a/content/manuals/desktop/release-notes.md +++ b/content/manuals/desktop/release-notes.md @@ -37,12 +37,11 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo ### New -- Docker Model Runner is now available on Windows machines with NVIDIA GPUs. -- You can now push models to Docker Hub with Docker Model Runner. +- Docker Model Runner is now available on x86 Windows machines with NVIDIA GPUs. +- You can now [push models](/manuals/desktop/features/model-runner.md#push-a-model-to-docker-hub) to Docker Hub with Docker Model Runner. - Added support for Docker Model Runner's model management and chat interface in Docker Desktop for Mac and Windows (on hardware supporting Docker Model Runner). Users can now view, interact with, and manage local AI models through a new dedicated interface. -- Docker Compose and Testcontainers Java and Go now support Docker Model Runner. -- Introducing Docker Desktop in the Microsoft App Store. -- MacOS QEMU Virtualization option deprecation. +- [Docker Compose](/manuals/compose/how-tos/model-runner.md) and Testcontainers [Java](https://java.testcontainers.org/modules/docker_model_runner/) and [Go](https://golang.testcontainers.org/modules/dockermodelrunner/) now support Docker Model Runner. +- Introducing Docker Desktop in the [Microsoft App Store](https://apps.microsoft.com/detail/xp8cbj40xlbwkx?hl=en-GB&gl=GB). ### Upgrades @@ -52,6 +51,10 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo - [Docker Scout CLI v1.17.1](https://github.com/docker/scout-cli/releases/tag/v1.17.1) - [Compose Bridge v0.0.19](https://github.com/docker/compose-bridge-binaries/releases/tag/v0.0.19) +### Security + +- Fixed [CVE-2025-3224](https://www.cve.org/CVERecord?id=CVE-2025-3224) allowing an attacker with access to a user machine to perform an elevation of privilege when Docker Desktop updates. + ### Bug fixes and enhancements #### For all platforms @@ -65,6 +68,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo - Enabled the memory protection keys mechanism in the Docker Desktop Linux VM, allowing containers like Oracle database images to run correctly. - Fixed a problem with containers accessing `/proc/sys/kernel/shm*` sysctls when [Enhanced Container Isolation](/manuals/security/for-admins/hardened-desktop/enhanced-container-isolation/_index.md) is enabled on Mac, Windows Hyper-V, or Linux. - Added kernel module `nft_fib_inet`, required for running firewalld in a Linux container. +- MacOS QEMU Virtualization option is being deprecated on July 14, 2025. #### For Mac From 0e48c4beefc3767c94a6f95ef71f3d95be55f87c Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Tue, 29 Apr 2025 15:37:45 +0300 Subject: [PATCH 347/699] Fix a typo in the Build drivers manual (#22515) ## Description This pull request fixes a minor typo in the Build drivers manual. --- content/manuals/build/builders/drivers/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/build/builders/drivers/_index.md b/content/manuals/build/builders/drivers/_index.md index 52204e5f4708..de4f772c6411 100644 --- a/content/manuals/build/builders/drivers/_index.md +++ b/content/manuals/build/builders/drivers/_index.md @@ -10,7 +10,7 @@ aliases: --- Build drivers are configurations for how and where the BuildKit backend runs. -Driver settings are customizable and allows fine-grained control of the builder. +Driver settings are customizable and allow fine-grained control of the builder. Buildx supports the following drivers: - `docker`: uses the BuildKit library bundled into the Docker daemon. From 6f4e98652e33adafa64feed1bc0f2a7467b71aba Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Tue, 29 Apr 2025 14:07:12 +0100 Subject: [PATCH 348/699] ai-section (#22514) ## Description ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/_index.md | 16 ++++++++++++++++ .../{desktop/features => ai}/gordon/_index.md | 3 +++ .../features => ai}/gordon/images/delete.webp | Bin .../features => ai}/gordon/images/gordon.webp | Bin .../features => ai}/gordon/images/toolbox.webp | Bin .../features => ai}/gordon/mcp/_index.md | 8 +++++--- .../gordon/mcp/built-in-tools.md | 2 ++ .../gordon/mcp/gordon-mcp-server.md | 2 ++ .../{desktop/features => ai}/gordon/mcp/yaml.md | 2 ++ .../{desktop/features => ai}/model-runner.md | 3 +++ content/manuals/compose/how-tos/model-runner.md | 4 ++-- .../manuals/compose/releases/release-notes.md | 2 +- content/manuals/desktop/_index.md | 2 +- content/manuals/desktop/release-notes.md | 6 +++--- content/manuals/desktop/use-desktop/_index.md | 2 +- .../settings-management/_index.md | 2 +- data/redirects.yml | 2 +- 17 files changed, 43 insertions(+), 13 deletions(-) rename content/manuals/{desktop/features => ai}/gordon/_index.md (99%) rename content/manuals/{desktop/features => ai}/gordon/images/delete.webp (100%) rename content/manuals/{desktop/features => ai}/gordon/images/gordon.webp (100%) rename content/manuals/{desktop/features => ai}/gordon/images/toolbox.webp (100%) rename content/manuals/{desktop/features => ai}/gordon/mcp/_index.md (88%) rename content/manuals/{desktop/features => ai}/gordon/mcp/built-in-tools.md (99%) rename content/manuals/{desktop/features => ai}/gordon/mcp/gordon-mcp-server.md (95%) rename content/manuals/{desktop/features => ai}/gordon/mcp/yaml.md (99%) rename content/manuals/{desktop/features => ai}/model-runner.md (99%) diff --git a/content/manuals/_index.md b/content/manuals/_index.md index d7f80dbc4907..ac033af064fc 100644 --- a/content/manuals/_index.md +++ b/content/manuals/_index.md @@ -10,6 +10,7 @@ params: sidebar: groups: - Open source + - AI - Products - Platform notoc: true @@ -30,6 +31,15 @@ params: description: Run containers programmatically in your preferred programming language. icon: /assets/icons/Testcontainers.svg link: /testcontainers/ + ai: + - title: Ask Gordon + description: streamline your workflow and get the most out of the Docker ecosystem with your personal AI assistant. + icon: note_add + link: /ai/gordon/ + - title: Docker Model Runner + description: View and manage your local models + icon: view_in_ar + link: /model-runner/ products: - title: Docker Desktop description: Your command center for container development. @@ -91,6 +101,12 @@ Open source development and containerization technologies. {{< grid items=open-source >}} +## AI + +All the Docker AI tools in one easy-to-access location. + +{{< grid items=ai >}} + ## Products End-to-end developer solutions for innovative teams. diff --git a/content/manuals/desktop/features/gordon/_index.md b/content/manuals/ai/gordon/_index.md similarity index 99% rename from content/manuals/desktop/features/gordon/_index.md rename to content/manuals/ai/gordon/_index.md index 4c4295ab8abd..4c82e2116254 100644 --- a/content/manuals/desktop/features/gordon/_index.md +++ b/content/manuals/ai/gordon/_index.md @@ -7,6 +7,9 @@ params: badge: color: blue text: Beta + group: AI +aliases: + - /desktop/features/gordon/ --- {{< summary-bar feature_name="Ask Gordon" >}} diff --git a/content/manuals/desktop/features/gordon/images/delete.webp b/content/manuals/ai/gordon/images/delete.webp similarity index 100% rename from content/manuals/desktop/features/gordon/images/delete.webp rename to content/manuals/ai/gordon/images/delete.webp diff --git a/content/manuals/desktop/features/gordon/images/gordon.webp b/content/manuals/ai/gordon/images/gordon.webp similarity index 100% rename from content/manuals/desktop/features/gordon/images/gordon.webp rename to content/manuals/ai/gordon/images/gordon.webp diff --git a/content/manuals/desktop/features/gordon/images/toolbox.webp b/content/manuals/ai/gordon/images/toolbox.webp similarity index 100% rename from content/manuals/desktop/features/gordon/images/toolbox.webp rename to content/manuals/ai/gordon/images/toolbox.webp diff --git a/content/manuals/desktop/features/gordon/mcp/_index.md b/content/manuals/ai/gordon/mcp/_index.md similarity index 88% rename from content/manuals/desktop/features/gordon/mcp/_index.md rename to content/manuals/ai/gordon/mcp/_index.md index 07c405e96ae0..41274bfa9cba 100644 --- a/content/manuals/desktop/features/gordon/mcp/_index.md +++ b/content/manuals/ai/gordon/mcp/_index.md @@ -6,15 +6,17 @@ grid: - title: Built-in tools description: Use the built-in tools. icon: construction - link: /desktop/features/gordon/mcp/built-in-tools + link: /ai/gordon/mcp/built-in-tools - title: MCP configuration description: Configure MCP tools on a per-project basis. icon: manufacturing - link: /desktop/features/gordon/mcp/yaml + link: /ai/gordon/mcp/yaml - title: MCP Server description: Use Gordon as an MCP server icon: dns - link: /desktop/features/gordon/mcp/gordon-mcp-server/ + link: /ai/gordon/mcp/gordon-mcp-server/ +aliases: + - /desktop/features/gordon/mcp/ --- ## What is MCP? diff --git a/content/manuals/desktop/features/gordon/mcp/built-in-tools.md b/content/manuals/ai/gordon/mcp/built-in-tools.md similarity index 99% rename from content/manuals/desktop/features/gordon/mcp/built-in-tools.md rename to content/manuals/ai/gordon/mcp/built-in-tools.md index 94152901feeb..9fd76880ac10 100644 --- a/content/manuals/desktop/features/gordon/mcp/built-in-tools.md +++ b/content/manuals/ai/gordon/mcp/built-in-tools.md @@ -2,6 +2,8 @@ title: Built-in tools description: How to use Gordon's built-in tools keywords: ai, mcp, gordon +aliases: + - /desktop/features/gordon/mcp/built-in-tools/ --- Gordon comes with an integrated toolbox providing access to various system tools diff --git a/content/manuals/desktop/features/gordon/mcp/gordon-mcp-server.md b/content/manuals/ai/gordon/mcp/gordon-mcp-server.md similarity index 95% rename from content/manuals/desktop/features/gordon/mcp/gordon-mcp-server.md rename to content/manuals/ai/gordon/mcp/gordon-mcp-server.md index 5e72cc2bff56..39a163ca87d8 100644 --- a/content/manuals/desktop/features/gordon/mcp/gordon-mcp-server.md +++ b/content/manuals/ai/gordon/mcp/gordon-mcp-server.md @@ -2,6 +2,8 @@ title: Gordon as an MCP server description: How to use Gordon as an MCP server keywords: ai, mcp, gordon +aliases: + - /desktop/features/gordon/mcp/gordon-mcp-server/ --- ## Gordon as an MCP server diff --git a/content/manuals/desktop/features/gordon/mcp/yaml.md b/content/manuals/ai/gordon/mcp/yaml.md similarity index 99% rename from content/manuals/desktop/features/gordon/mcp/yaml.md rename to content/manuals/ai/gordon/mcp/yaml.md index 9ba4829cb67d..326c5d6071a2 100644 --- a/content/manuals/desktop/features/gordon/mcp/yaml.md +++ b/content/manuals/ai/gordon/mcp/yaml.md @@ -2,6 +2,8 @@ title: YAML configuration description: Learn how to use MCP servers with Gordon keywords: ai, mcp, gordon +aliases: + - /desktop/features/gordon/mcp/yaml/ --- Docker has partnered with Anthropic to build container images for the [reference diff --git a/content/manuals/desktop/features/model-runner.md b/content/manuals/ai/model-runner.md similarity index 99% rename from content/manuals/desktop/features/model-runner.md rename to content/manuals/ai/model-runner.md index c0d63a8f2482..a74f6730f3d7 100644 --- a/content/manuals/desktop/features/model-runner.md +++ b/content/manuals/ai/model-runner.md @@ -5,9 +5,12 @@ params: badge: color: blue text: Beta + group: AI weight: 20 description: Learn how to use Docker Model Runner to manage and run AI models. keywords: Docker, ai, model runner, docker deskotp, llm +aliases: + - /desktop/features/model-runner/ --- {{< summary-bar feature_name="Docker Model Runner" >}} diff --git a/content/manuals/compose/how-tos/model-runner.md b/content/manuals/compose/how-tos/model-runner.md index 22b4e37e0c98..36d27b2b7eba 100644 --- a/content/manuals/compose/how-tos/model-runner.md +++ b/content/manuals/compose/how-tos/model-runner.md @@ -20,7 +20,7 @@ This lets you define and run AI-powered applications alongside your other servic - Docker Compose v2.35 or later - Docker Desktop 4.41 or later - Docker Desktop for Mac with Apple Silicon or Docker Desktop for Windows with NVIDIA GPU -- [Docker Model Runner enabled in Docker Desktop](/manuals/desktop/features/model-runner.md#enable-docker-model-runner) +- [Docker Model Runner enabled in Docker Desktop](/manuals/ai/model-runner.md#enable-docker-model-runner) ## Provider services @@ -63,4 +63,4 @@ This lets the `chat` service to interact with the model and use it for its own p ## Reference -- [Docker Model Runner documentation](/manuals/desktop/features/model-runner.md) +- [Docker Model Runner documentation](/manuals/ai/model-runner.md) diff --git a/content/manuals/compose/releases/release-notes.md b/content/manuals/compose/releases/release-notes.md index 2884e93cafcc..b90bed1afe75 100644 --- a/content/manuals/compose/releases/release-notes.md +++ b/content/manuals/compose/releases/release-notes.md @@ -33,7 +33,7 @@ For more detailed information, see the [release notes in the Compose repo](https ### Bug fixes and enhancements -- Added support for [Docker Model Runner](/manuals/desktop/features/model-runner.md) to easily integrate AI models into your Compose applications +- Added support for [Docker Model Runner](/manuals/ai/model-runner.md) to easily integrate AI models into your Compose applications - Added `build --print` command to help debug complex build configurations by showing the equivalent bake file - Added `volume.type=image` to provide more flexible volume management for container images - Added `--quiet` options to the `run` command for cleaner output when running containers diff --git a/content/manuals/desktop/_index.md b/content/manuals/desktop/_index.md index 2a9c655f586a..c5e18105331f 100644 --- a/content/manuals/desktop/_index.md +++ b/content/manuals/desktop/_index.md @@ -60,7 +60,7 @@ Docker Desktop integrates with your preferred development tools and languages, a - [Docker Scout](../scout/_index.md) - [Docker Build](/manuals/build/_index.md) - [Docker Compose](/manuals/compose/_index.md) -- [Ask Gordon](/manuals/desktop/features/gordon/_index.md) +- [Ask Gordon](/manuals/ai/gordon/_index.md) - [Docker Extensions](../extensions/_index.md) - [Docker Content Trust](/manuals/engine/security/trust/_index.md) - [Kubernetes](https://github.com/kubernetes/kubernetes/) diff --git a/content/manuals/desktop/release-notes.md b/content/manuals/desktop/release-notes.md index 7f5f82093860..0d93505b5385 100644 --- a/content/manuals/desktop/release-notes.md +++ b/content/manuals/desktop/release-notes.md @@ -38,7 +38,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo ### New - Docker Model Runner is now available on x86 Windows machines with NVIDIA GPUs. -- You can now [push models](/manuals/desktop/features/model-runner.md#push-a-model-to-docker-hub) to Docker Hub with Docker Model Runner. +- You can now [push models](/manuals/ai/model-runner.md#push-a-model-to-docker-hub) to Docker Hub with Docker Model Runner. - Added support for Docker Model Runner's model management and chat interface in Docker Desktop for Mac and Windows (on hardware supporting Docker Model Runner). Users can now view, interact with, and manage local AI models through a new dedicated interface. - [Docker Compose](/manuals/compose/how-tos/model-runner.md) and Testcontainers [Java](https://java.testcontainers.org/modules/docker_model_runner/) and [Go](https://golang.testcontainers.org/modules/dockermodelrunner/) now support Docker Model Runner. - Introducing Docker Desktop in the [Microsoft App Store](https://apps.microsoft.com/detail/xp8cbj40xlbwkx?hl=en-GB&gl=GB). @@ -99,7 +99,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo ### New -- You can now pull, run, and manage AI models from Docker Hub directly in Docker Desktop with [Docker Model Runner (Beta)](/manuals/desktop/features/model-runner.md). Currently available for Docker Desktop for Mac with Apple Silicon. +- You can now pull, run, and manage AI models from Docker Hub directly in Docker Desktop with [Docker Model Runner (Beta)](/manuals/ai/model-runner.md). Currently available for Docker Desktop for Mac with Apple Silicon. ### Upgrades @@ -210,7 +210,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo - The new [`update` command](/reference/cli/docker/desktop/update.md) has been added to the Docker Desktop CLI (Mac only). - [Bake](/manuals//build/bake/_index.md) is now generally available, with support for entitlements and composable attributes. - You can now create [multi-node Kubernetes clusters](/manuals/desktop/settings-and-maintenance/settings.md#kubernetes) in Docker Desktop. -- [Ask Gordon](/manuals/desktop/features/gordon.md) is more widely available. It is still in Beta. +- [Ask Gordon](/manuals/ai/gordon/_index.md) is more widely available. It is still in Beta. ### Upgrades diff --git a/content/manuals/desktop/use-desktop/_index.md b/content/manuals/desktop/use-desktop/_index.md index c2685690380c..b12be1c3ef6e 100644 --- a/content/manuals/desktop/use-desktop/_index.md +++ b/content/manuals/desktop/use-desktop/_index.md @@ -16,7 +16,7 @@ It provides a centralized interface to manage your [containers](container.md), [ In addition, the Docker Desktop Dashboard lets you: -- Use [Ask Gordon](/manuals/desktop/features/gordon/_index.md), a personal AI assistant embedded in Docker Desktop and the Docker CLI. It's designed to streamline your workflow and help you make the most of the Docker ecosystem. +- Use [Ask Gordon](/manuals/ai/gordon/_index.md), a personal AI assistant embedded in Docker Desktop and the Docker CLI. It's designed to streamline your workflow and help you make the most of the Docker ecosystem. - Navigate to the **Settings** menu to configure your Docker Desktop settings. Select the **Settings** icon in the Dashboard header. - Access the **Troubleshoot** menu to debug and perform restart operations. Select the **Troubleshoot** icon in the Dashboard header. - Be notified of new releases, installation progress updates, and more in the **Notifications center**. Select the bell icon in the bottom-right corner of the Docker Desktop Dashboard to access the notification center. diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md index a09f0ed2ba07..48fc13100a01 100644 --- a/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md @@ -46,7 +46,7 @@ Using the `admin-settings.json` file, you can: - Turn off Docker Extensions - Turn off Docker Scout SBOM indexing - Turn off beta and experimental features -- Turn off Docker AI ([Ask Gordon](../../../../desktop/features/gordon/_index.md)) +- Turn off Docker AI ([Ask Gordon](/manuals/ai/gordon/_index.md)) - Turn off Docker Desktop's onboarding survey - Control whether developers can use the Docker terminal - Control the file sharing implementation for your developers on macOS diff --git a/data/redirects.yml b/data/redirects.yml index 5a9ab2b671d6..522b02e8f380 100644 --- a/data/redirects.yml +++ b/data/redirects.yml @@ -297,6 +297,6 @@ # Desktop DMR -"/desktop/features/model-runner/": +"/ai/model-runner/": - /go/model-runner/ \ No newline at end of file From d71c3052c6b80a0493a0127763fa77de69993be7 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Tue, 29 Apr 2025 14:10:50 +0100 Subject: [PATCH 349/699] rn-fix (#22513) ## Description Small RN fix ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/desktop/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/desktop/release-notes.md b/content/manuals/desktop/release-notes.md index 0d93505b5385..986e9ba778ef 100644 --- a/content/manuals/desktop/release-notes.md +++ b/content/manuals/desktop/release-notes.md @@ -85,7 +85,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo #### For all platforms -- If you have enforced sign-in using `desktop.plist` and also have a `registry.json`, sign-in will fail if the user belongs to an organization listed in `desktop.plist` but not to any organizations specified in `registry.json`. To resolve this, remove the `registry.json` file. +- If you have enforced sign-in using `desktop.plist` (on macOS) or Registry key (on Windows) and also have a `registry.json`, sign-in will fail if the user belongs to an organization listed in `desktop.plist`/ registry key but not to any organizations specified in `registry.json`. To resolve this, remove the `registry.json` file. #### For Windows From 00a32403b39b712e11494d897666d01b1327ec2c Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Tue, 29 Apr 2025 14:36:32 +0100 Subject: [PATCH 350/699] Revert "ai-section" (#22517) Reverts docker/docs#22514 --- content/manuals/_index.md | 16 ---------------- content/manuals/compose/how-tos/model-runner.md | 4 ++-- .../manuals/compose/releases/release-notes.md | 2 +- content/manuals/desktop/_index.md | 2 +- .../{ai => desktop/features}/gordon/_index.md | 3 --- .../features}/gordon/images/delete.webp | Bin .../features}/gordon/images/gordon.webp | Bin .../features}/gordon/images/toolbox.webp | Bin .../features}/gordon/mcp/_index.md | 8 +++----- .../features}/gordon/mcp/built-in-tools.md | 2 -- .../features}/gordon/mcp/gordon-mcp-server.md | 2 -- .../{ai => desktop/features}/gordon/mcp/yaml.md | 2 -- .../{ai => desktop/features}/model-runner.md | 3 --- content/manuals/desktop/release-notes.md | 6 +++--- content/manuals/desktop/use-desktop/_index.md | 2 +- .../settings-management/_index.md | 2 +- data/redirects.yml | 2 +- 17 files changed, 13 insertions(+), 43 deletions(-) rename content/manuals/{ai => desktop/features}/gordon/_index.md (99%) rename content/manuals/{ai => desktop/features}/gordon/images/delete.webp (100%) rename content/manuals/{ai => desktop/features}/gordon/images/gordon.webp (100%) rename content/manuals/{ai => desktop/features}/gordon/images/toolbox.webp (100%) rename content/manuals/{ai => desktop/features}/gordon/mcp/_index.md (88%) rename content/manuals/{ai => desktop/features}/gordon/mcp/built-in-tools.md (99%) rename content/manuals/{ai => desktop/features}/gordon/mcp/gordon-mcp-server.md (95%) rename content/manuals/{ai => desktop/features}/gordon/mcp/yaml.md (99%) rename content/manuals/{ai => desktop/features}/model-runner.md (99%) diff --git a/content/manuals/_index.md b/content/manuals/_index.md index ac033af064fc..d7f80dbc4907 100644 --- a/content/manuals/_index.md +++ b/content/manuals/_index.md @@ -10,7 +10,6 @@ params: sidebar: groups: - Open source - - AI - Products - Platform notoc: true @@ -31,15 +30,6 @@ params: description: Run containers programmatically in your preferred programming language. icon: /assets/icons/Testcontainers.svg link: /testcontainers/ - ai: - - title: Ask Gordon - description: streamline your workflow and get the most out of the Docker ecosystem with your personal AI assistant. - icon: note_add - link: /ai/gordon/ - - title: Docker Model Runner - description: View and manage your local models - icon: view_in_ar - link: /model-runner/ products: - title: Docker Desktop description: Your command center for container development. @@ -101,12 +91,6 @@ Open source development and containerization technologies. {{< grid items=open-source >}} -## AI - -All the Docker AI tools in one easy-to-access location. - -{{< grid items=ai >}} - ## Products End-to-end developer solutions for innovative teams. diff --git a/content/manuals/compose/how-tos/model-runner.md b/content/manuals/compose/how-tos/model-runner.md index 36d27b2b7eba..22b4e37e0c98 100644 --- a/content/manuals/compose/how-tos/model-runner.md +++ b/content/manuals/compose/how-tos/model-runner.md @@ -20,7 +20,7 @@ This lets you define and run AI-powered applications alongside your other servic - Docker Compose v2.35 or later - Docker Desktop 4.41 or later - Docker Desktop for Mac with Apple Silicon or Docker Desktop for Windows with NVIDIA GPU -- [Docker Model Runner enabled in Docker Desktop](/manuals/ai/model-runner.md#enable-docker-model-runner) +- [Docker Model Runner enabled in Docker Desktop](/manuals/desktop/features/model-runner.md#enable-docker-model-runner) ## Provider services @@ -63,4 +63,4 @@ This lets the `chat` service to interact with the model and use it for its own p ## Reference -- [Docker Model Runner documentation](/manuals/ai/model-runner.md) +- [Docker Model Runner documentation](/manuals/desktop/features/model-runner.md) diff --git a/content/manuals/compose/releases/release-notes.md b/content/manuals/compose/releases/release-notes.md index b90bed1afe75..2884e93cafcc 100644 --- a/content/manuals/compose/releases/release-notes.md +++ b/content/manuals/compose/releases/release-notes.md @@ -33,7 +33,7 @@ For more detailed information, see the [release notes in the Compose repo](https ### Bug fixes and enhancements -- Added support for [Docker Model Runner](/manuals/ai/model-runner.md) to easily integrate AI models into your Compose applications +- Added support for [Docker Model Runner](/manuals/desktop/features/model-runner.md) to easily integrate AI models into your Compose applications - Added `build --print` command to help debug complex build configurations by showing the equivalent bake file - Added `volume.type=image` to provide more flexible volume management for container images - Added `--quiet` options to the `run` command for cleaner output when running containers diff --git a/content/manuals/desktop/_index.md b/content/manuals/desktop/_index.md index c5e18105331f..2a9c655f586a 100644 --- a/content/manuals/desktop/_index.md +++ b/content/manuals/desktop/_index.md @@ -60,7 +60,7 @@ Docker Desktop integrates with your preferred development tools and languages, a - [Docker Scout](../scout/_index.md) - [Docker Build](/manuals/build/_index.md) - [Docker Compose](/manuals/compose/_index.md) -- [Ask Gordon](/manuals/ai/gordon/_index.md) +- [Ask Gordon](/manuals/desktop/features/gordon/_index.md) - [Docker Extensions](../extensions/_index.md) - [Docker Content Trust](/manuals/engine/security/trust/_index.md) - [Kubernetes](https://github.com/kubernetes/kubernetes/) diff --git a/content/manuals/ai/gordon/_index.md b/content/manuals/desktop/features/gordon/_index.md similarity index 99% rename from content/manuals/ai/gordon/_index.md rename to content/manuals/desktop/features/gordon/_index.md index 4c82e2116254..4c4295ab8abd 100644 --- a/content/manuals/ai/gordon/_index.md +++ b/content/manuals/desktop/features/gordon/_index.md @@ -7,9 +7,6 @@ params: badge: color: blue text: Beta - group: AI -aliases: - - /desktop/features/gordon/ --- {{< summary-bar feature_name="Ask Gordon" >}} diff --git a/content/manuals/ai/gordon/images/delete.webp b/content/manuals/desktop/features/gordon/images/delete.webp similarity index 100% rename from content/manuals/ai/gordon/images/delete.webp rename to content/manuals/desktop/features/gordon/images/delete.webp diff --git a/content/manuals/ai/gordon/images/gordon.webp b/content/manuals/desktop/features/gordon/images/gordon.webp similarity index 100% rename from content/manuals/ai/gordon/images/gordon.webp rename to content/manuals/desktop/features/gordon/images/gordon.webp diff --git a/content/manuals/ai/gordon/images/toolbox.webp b/content/manuals/desktop/features/gordon/images/toolbox.webp similarity index 100% rename from content/manuals/ai/gordon/images/toolbox.webp rename to content/manuals/desktop/features/gordon/images/toolbox.webp diff --git a/content/manuals/ai/gordon/mcp/_index.md b/content/manuals/desktop/features/gordon/mcp/_index.md similarity index 88% rename from content/manuals/ai/gordon/mcp/_index.md rename to content/manuals/desktop/features/gordon/mcp/_index.md index 41274bfa9cba..07c405e96ae0 100644 --- a/content/manuals/ai/gordon/mcp/_index.md +++ b/content/manuals/desktop/features/gordon/mcp/_index.md @@ -6,17 +6,15 @@ grid: - title: Built-in tools description: Use the built-in tools. icon: construction - link: /ai/gordon/mcp/built-in-tools + link: /desktop/features/gordon/mcp/built-in-tools - title: MCP configuration description: Configure MCP tools on a per-project basis. icon: manufacturing - link: /ai/gordon/mcp/yaml + link: /desktop/features/gordon/mcp/yaml - title: MCP Server description: Use Gordon as an MCP server icon: dns - link: /ai/gordon/mcp/gordon-mcp-server/ -aliases: - - /desktop/features/gordon/mcp/ + link: /desktop/features/gordon/mcp/gordon-mcp-server/ --- ## What is MCP? diff --git a/content/manuals/ai/gordon/mcp/built-in-tools.md b/content/manuals/desktop/features/gordon/mcp/built-in-tools.md similarity index 99% rename from content/manuals/ai/gordon/mcp/built-in-tools.md rename to content/manuals/desktop/features/gordon/mcp/built-in-tools.md index 9fd76880ac10..94152901feeb 100644 --- a/content/manuals/ai/gordon/mcp/built-in-tools.md +++ b/content/manuals/desktop/features/gordon/mcp/built-in-tools.md @@ -2,8 +2,6 @@ title: Built-in tools description: How to use Gordon's built-in tools keywords: ai, mcp, gordon -aliases: - - /desktop/features/gordon/mcp/built-in-tools/ --- Gordon comes with an integrated toolbox providing access to various system tools diff --git a/content/manuals/ai/gordon/mcp/gordon-mcp-server.md b/content/manuals/desktop/features/gordon/mcp/gordon-mcp-server.md similarity index 95% rename from content/manuals/ai/gordon/mcp/gordon-mcp-server.md rename to content/manuals/desktop/features/gordon/mcp/gordon-mcp-server.md index 39a163ca87d8..5e72cc2bff56 100644 --- a/content/manuals/ai/gordon/mcp/gordon-mcp-server.md +++ b/content/manuals/desktop/features/gordon/mcp/gordon-mcp-server.md @@ -2,8 +2,6 @@ title: Gordon as an MCP server description: How to use Gordon as an MCP server keywords: ai, mcp, gordon -aliases: - - /desktop/features/gordon/mcp/gordon-mcp-server/ --- ## Gordon as an MCP server diff --git a/content/manuals/ai/gordon/mcp/yaml.md b/content/manuals/desktop/features/gordon/mcp/yaml.md similarity index 99% rename from content/manuals/ai/gordon/mcp/yaml.md rename to content/manuals/desktop/features/gordon/mcp/yaml.md index 326c5d6071a2..9ba4829cb67d 100644 --- a/content/manuals/ai/gordon/mcp/yaml.md +++ b/content/manuals/desktop/features/gordon/mcp/yaml.md @@ -2,8 +2,6 @@ title: YAML configuration description: Learn how to use MCP servers with Gordon keywords: ai, mcp, gordon -aliases: - - /desktop/features/gordon/mcp/yaml/ --- Docker has partnered with Anthropic to build container images for the [reference diff --git a/content/manuals/ai/model-runner.md b/content/manuals/desktop/features/model-runner.md similarity index 99% rename from content/manuals/ai/model-runner.md rename to content/manuals/desktop/features/model-runner.md index a74f6730f3d7..c0d63a8f2482 100644 --- a/content/manuals/ai/model-runner.md +++ b/content/manuals/desktop/features/model-runner.md @@ -5,12 +5,9 @@ params: badge: color: blue text: Beta - group: AI weight: 20 description: Learn how to use Docker Model Runner to manage and run AI models. keywords: Docker, ai, model runner, docker deskotp, llm -aliases: - - /desktop/features/model-runner/ --- {{< summary-bar feature_name="Docker Model Runner" >}} diff --git a/content/manuals/desktop/release-notes.md b/content/manuals/desktop/release-notes.md index 986e9ba778ef..e02079e4b2d0 100644 --- a/content/manuals/desktop/release-notes.md +++ b/content/manuals/desktop/release-notes.md @@ -38,7 +38,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo ### New - Docker Model Runner is now available on x86 Windows machines with NVIDIA GPUs. -- You can now [push models](/manuals/ai/model-runner.md#push-a-model-to-docker-hub) to Docker Hub with Docker Model Runner. +- You can now [push models](/manuals/desktop/features/model-runner.md#push-a-model-to-docker-hub) to Docker Hub with Docker Model Runner. - Added support for Docker Model Runner's model management and chat interface in Docker Desktop for Mac and Windows (on hardware supporting Docker Model Runner). Users can now view, interact with, and manage local AI models through a new dedicated interface. - [Docker Compose](/manuals/compose/how-tos/model-runner.md) and Testcontainers [Java](https://java.testcontainers.org/modules/docker_model_runner/) and [Go](https://golang.testcontainers.org/modules/dockermodelrunner/) now support Docker Model Runner. - Introducing Docker Desktop in the [Microsoft App Store](https://apps.microsoft.com/detail/xp8cbj40xlbwkx?hl=en-GB&gl=GB). @@ -99,7 +99,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo ### New -- You can now pull, run, and manage AI models from Docker Hub directly in Docker Desktop with [Docker Model Runner (Beta)](/manuals/ai/model-runner.md). Currently available for Docker Desktop for Mac with Apple Silicon. +- You can now pull, run, and manage AI models from Docker Hub directly in Docker Desktop with [Docker Model Runner (Beta)](/manuals/desktop/features/model-runner.md). Currently available for Docker Desktop for Mac with Apple Silicon. ### Upgrades @@ -210,7 +210,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo - The new [`update` command](/reference/cli/docker/desktop/update.md) has been added to the Docker Desktop CLI (Mac only). - [Bake](/manuals//build/bake/_index.md) is now generally available, with support for entitlements and composable attributes. - You can now create [multi-node Kubernetes clusters](/manuals/desktop/settings-and-maintenance/settings.md#kubernetes) in Docker Desktop. -- [Ask Gordon](/manuals/ai/gordon/_index.md) is more widely available. It is still in Beta. +- [Ask Gordon](/manuals/desktop/features/gordon.md) is more widely available. It is still in Beta. ### Upgrades diff --git a/content/manuals/desktop/use-desktop/_index.md b/content/manuals/desktop/use-desktop/_index.md index b12be1c3ef6e..c2685690380c 100644 --- a/content/manuals/desktop/use-desktop/_index.md +++ b/content/manuals/desktop/use-desktop/_index.md @@ -16,7 +16,7 @@ It provides a centralized interface to manage your [containers](container.md), [ In addition, the Docker Desktop Dashboard lets you: -- Use [Ask Gordon](/manuals/ai/gordon/_index.md), a personal AI assistant embedded in Docker Desktop and the Docker CLI. It's designed to streamline your workflow and help you make the most of the Docker ecosystem. +- Use [Ask Gordon](/manuals/desktop/features/gordon/_index.md), a personal AI assistant embedded in Docker Desktop and the Docker CLI. It's designed to streamline your workflow and help you make the most of the Docker ecosystem. - Navigate to the **Settings** menu to configure your Docker Desktop settings. Select the **Settings** icon in the Dashboard header. - Access the **Troubleshoot** menu to debug and perform restart operations. Select the **Troubleshoot** icon in the Dashboard header. - Be notified of new releases, installation progress updates, and more in the **Notifications center**. Select the bell icon in the bottom-right corner of the Docker Desktop Dashboard to access the notification center. diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md index 48fc13100a01..a09f0ed2ba07 100644 --- a/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md @@ -46,7 +46,7 @@ Using the `admin-settings.json` file, you can: - Turn off Docker Extensions - Turn off Docker Scout SBOM indexing - Turn off beta and experimental features -- Turn off Docker AI ([Ask Gordon](/manuals/ai/gordon/_index.md)) +- Turn off Docker AI ([Ask Gordon](../../../../desktop/features/gordon/_index.md)) - Turn off Docker Desktop's onboarding survey - Control whether developers can use the Docker terminal - Control the file sharing implementation for your developers on macOS diff --git a/data/redirects.yml b/data/redirects.yml index 522b02e8f380..5a9ab2b671d6 100644 --- a/data/redirects.yml +++ b/data/redirects.yml @@ -297,6 +297,6 @@ # Desktop DMR -"/ai/model-runner/": +"/desktop/features/model-runner/": - /go/model-runner/ \ No newline at end of file From cdcf7ef9458e6b06f232cc5de91bfd748875aad8 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Tue, 29 Apr 2025 15:06:17 +0100 Subject: [PATCH 351/699] Merge pull request #22518 from aevesdocker/ai-section-2 ai section --- content/manuals/_index.md | 16 ++++++++++++++++ .../{desktop/features => ai}/gordon/_index.md | 3 +++ .../features => ai}/gordon/images/delete.webp | Bin .../features => ai}/gordon/images/gordon.webp | Bin .../features => ai}/gordon/images/toolbox.webp | Bin .../features => ai}/gordon/mcp/_index.md | 8 +++++--- .../gordon/mcp/built-in-tools.md | 2 ++ .../gordon/mcp/gordon-mcp-server.md | 2 ++ .../{desktop/features => ai}/gordon/mcp/yaml.md | 2 ++ .../{desktop/features => ai}/model-runner.md | 3 +++ content/manuals/compose/how-tos/model-runner.md | 4 ++-- .../manuals/compose/releases/release-notes.md | 2 +- content/manuals/desktop/_index.md | 2 +- content/manuals/desktop/release-notes.md | 6 +++--- content/manuals/desktop/use-desktop/_index.md | 2 +- .../settings-management/_index.md | 2 +- data/redirects.yml | 2 +- 17 files changed, 43 insertions(+), 13 deletions(-) rename content/manuals/{desktop/features => ai}/gordon/_index.md (99%) rename content/manuals/{desktop/features => ai}/gordon/images/delete.webp (100%) rename content/manuals/{desktop/features => ai}/gordon/images/gordon.webp (100%) rename content/manuals/{desktop/features => ai}/gordon/images/toolbox.webp (100%) rename content/manuals/{desktop/features => ai}/gordon/mcp/_index.md (88%) rename content/manuals/{desktop/features => ai}/gordon/mcp/built-in-tools.md (99%) rename content/manuals/{desktop/features => ai}/gordon/mcp/gordon-mcp-server.md (95%) rename content/manuals/{desktop/features => ai}/gordon/mcp/yaml.md (99%) rename content/manuals/{desktop/features => ai}/model-runner.md (99%) diff --git a/content/manuals/_index.md b/content/manuals/_index.md index d7f80dbc4907..ac033af064fc 100644 --- a/content/manuals/_index.md +++ b/content/manuals/_index.md @@ -10,6 +10,7 @@ params: sidebar: groups: - Open source + - AI - Products - Platform notoc: true @@ -30,6 +31,15 @@ params: description: Run containers programmatically in your preferred programming language. icon: /assets/icons/Testcontainers.svg link: /testcontainers/ + ai: + - title: Ask Gordon + description: streamline your workflow and get the most out of the Docker ecosystem with your personal AI assistant. + icon: note_add + link: /ai/gordon/ + - title: Docker Model Runner + description: View and manage your local models + icon: view_in_ar + link: /model-runner/ products: - title: Docker Desktop description: Your command center for container development. @@ -91,6 +101,12 @@ Open source development and containerization technologies. {{< grid items=open-source >}} +## AI + +All the Docker AI tools in one easy-to-access location. + +{{< grid items=ai >}} + ## Products End-to-end developer solutions for innovative teams. diff --git a/content/manuals/desktop/features/gordon/_index.md b/content/manuals/ai/gordon/_index.md similarity index 99% rename from content/manuals/desktop/features/gordon/_index.md rename to content/manuals/ai/gordon/_index.md index 4c4295ab8abd..6cd19cd555be 100644 --- a/content/manuals/desktop/features/gordon/_index.md +++ b/content/manuals/ai/gordon/_index.md @@ -7,6 +7,9 @@ params: badge: color: blue text: Beta + group: AI +aliases: + - /desktop/features/gordon/ --- {{< summary-bar feature_name="Ask Gordon" >}} diff --git a/content/manuals/desktop/features/gordon/images/delete.webp b/content/manuals/ai/gordon/images/delete.webp similarity index 100% rename from content/manuals/desktop/features/gordon/images/delete.webp rename to content/manuals/ai/gordon/images/delete.webp diff --git a/content/manuals/desktop/features/gordon/images/gordon.webp b/content/manuals/ai/gordon/images/gordon.webp similarity index 100% rename from content/manuals/desktop/features/gordon/images/gordon.webp rename to content/manuals/ai/gordon/images/gordon.webp diff --git a/content/manuals/desktop/features/gordon/images/toolbox.webp b/content/manuals/ai/gordon/images/toolbox.webp similarity index 100% rename from content/manuals/desktop/features/gordon/images/toolbox.webp rename to content/manuals/ai/gordon/images/toolbox.webp diff --git a/content/manuals/desktop/features/gordon/mcp/_index.md b/content/manuals/ai/gordon/mcp/_index.md similarity index 88% rename from content/manuals/desktop/features/gordon/mcp/_index.md rename to content/manuals/ai/gordon/mcp/_index.md index 07c405e96ae0..af49c24ed450 100644 --- a/content/manuals/desktop/features/gordon/mcp/_index.md +++ b/content/manuals/ai/gordon/mcp/_index.md @@ -6,15 +6,17 @@ grid: - title: Built-in tools description: Use the built-in tools. icon: construction - link: /desktop/features/gordon/mcp/built-in-tools + link: /ai/gordon/mcp/built-in-tools - title: MCP configuration description: Configure MCP tools on a per-project basis. icon: manufacturing - link: /desktop/features/gordon/mcp/yaml + link: /ai/gordon/mcp/yaml - title: MCP Server description: Use Gordon as an MCP server icon: dns - link: /desktop/features/gordon/mcp/gordon-mcp-server/ + link: /ai/gordon/mcp/gordon-mcp-server/ +aliases: + - /desktop/features/gordon/mcp/ --- ## What is MCP? diff --git a/content/manuals/desktop/features/gordon/mcp/built-in-tools.md b/content/manuals/ai/gordon/mcp/built-in-tools.md similarity index 99% rename from content/manuals/desktop/features/gordon/mcp/built-in-tools.md rename to content/manuals/ai/gordon/mcp/built-in-tools.md index 94152901feeb..9fd76880ac10 100644 --- a/content/manuals/desktop/features/gordon/mcp/built-in-tools.md +++ b/content/manuals/ai/gordon/mcp/built-in-tools.md @@ -2,6 +2,8 @@ title: Built-in tools description: How to use Gordon's built-in tools keywords: ai, mcp, gordon +aliases: + - /desktop/features/gordon/mcp/built-in-tools/ --- Gordon comes with an integrated toolbox providing access to various system tools diff --git a/content/manuals/desktop/features/gordon/mcp/gordon-mcp-server.md b/content/manuals/ai/gordon/mcp/gordon-mcp-server.md similarity index 95% rename from content/manuals/desktop/features/gordon/mcp/gordon-mcp-server.md rename to content/manuals/ai/gordon/mcp/gordon-mcp-server.md index 5e72cc2bff56..39a163ca87d8 100644 --- a/content/manuals/desktop/features/gordon/mcp/gordon-mcp-server.md +++ b/content/manuals/ai/gordon/mcp/gordon-mcp-server.md @@ -2,6 +2,8 @@ title: Gordon as an MCP server description: How to use Gordon as an MCP server keywords: ai, mcp, gordon +aliases: + - /desktop/features/gordon/mcp/gordon-mcp-server/ --- ## Gordon as an MCP server diff --git a/content/manuals/desktop/features/gordon/mcp/yaml.md b/content/manuals/ai/gordon/mcp/yaml.md similarity index 99% rename from content/manuals/desktop/features/gordon/mcp/yaml.md rename to content/manuals/ai/gordon/mcp/yaml.md index 9ba4829cb67d..326c5d6071a2 100644 --- a/content/manuals/desktop/features/gordon/mcp/yaml.md +++ b/content/manuals/ai/gordon/mcp/yaml.md @@ -2,6 +2,8 @@ title: YAML configuration description: Learn how to use MCP servers with Gordon keywords: ai, mcp, gordon +aliases: + - /desktop/features/gordon/mcp/yaml/ --- Docker has partnered with Anthropic to build container images for the [reference diff --git a/content/manuals/desktop/features/model-runner.md b/content/manuals/ai/model-runner.md similarity index 99% rename from content/manuals/desktop/features/model-runner.md rename to content/manuals/ai/model-runner.md index c0d63a8f2482..1f8aab071af9 100644 --- a/content/manuals/desktop/features/model-runner.md +++ b/content/manuals/ai/model-runner.md @@ -5,9 +5,12 @@ params: badge: color: blue text: Beta + group: AI weight: 20 description: Learn how to use Docker Model Runner to manage and run AI models. keywords: Docker, ai, model runner, docker deskotp, llm +aliases: + - /desktop/features/model-runner/ --- {{< summary-bar feature_name="Docker Model Runner" >}} diff --git a/content/manuals/compose/how-tos/model-runner.md b/content/manuals/compose/how-tos/model-runner.md index 22b4e37e0c98..36d27b2b7eba 100644 --- a/content/manuals/compose/how-tos/model-runner.md +++ b/content/manuals/compose/how-tos/model-runner.md @@ -20,7 +20,7 @@ This lets you define and run AI-powered applications alongside your other servic - Docker Compose v2.35 or later - Docker Desktop 4.41 or later - Docker Desktop for Mac with Apple Silicon or Docker Desktop for Windows with NVIDIA GPU -- [Docker Model Runner enabled in Docker Desktop](/manuals/desktop/features/model-runner.md#enable-docker-model-runner) +- [Docker Model Runner enabled in Docker Desktop](/manuals/ai/model-runner.md#enable-docker-model-runner) ## Provider services @@ -63,4 +63,4 @@ This lets the `chat` service to interact with the model and use it for its own p ## Reference -- [Docker Model Runner documentation](/manuals/desktop/features/model-runner.md) +- [Docker Model Runner documentation](/manuals/ai/model-runner.md) diff --git a/content/manuals/compose/releases/release-notes.md b/content/manuals/compose/releases/release-notes.md index 2884e93cafcc..b90bed1afe75 100644 --- a/content/manuals/compose/releases/release-notes.md +++ b/content/manuals/compose/releases/release-notes.md @@ -33,7 +33,7 @@ For more detailed information, see the [release notes in the Compose repo](https ### Bug fixes and enhancements -- Added support for [Docker Model Runner](/manuals/desktop/features/model-runner.md) to easily integrate AI models into your Compose applications +- Added support for [Docker Model Runner](/manuals/ai/model-runner.md) to easily integrate AI models into your Compose applications - Added `build --print` command to help debug complex build configurations by showing the equivalent bake file - Added `volume.type=image` to provide more flexible volume management for container images - Added `--quiet` options to the `run` command for cleaner output when running containers diff --git a/content/manuals/desktop/_index.md b/content/manuals/desktop/_index.md index 2a9c655f586a..c5e18105331f 100644 --- a/content/manuals/desktop/_index.md +++ b/content/manuals/desktop/_index.md @@ -60,7 +60,7 @@ Docker Desktop integrates with your preferred development tools and languages, a - [Docker Scout](../scout/_index.md) - [Docker Build](/manuals/build/_index.md) - [Docker Compose](/manuals/compose/_index.md) -- [Ask Gordon](/manuals/desktop/features/gordon/_index.md) +- [Ask Gordon](/manuals/ai/gordon/_index.md) - [Docker Extensions](../extensions/_index.md) - [Docker Content Trust](/manuals/engine/security/trust/_index.md) - [Kubernetes](https://github.com/kubernetes/kubernetes/) diff --git a/content/manuals/desktop/release-notes.md b/content/manuals/desktop/release-notes.md index e02079e4b2d0..986e9ba778ef 100644 --- a/content/manuals/desktop/release-notes.md +++ b/content/manuals/desktop/release-notes.md @@ -38,7 +38,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo ### New - Docker Model Runner is now available on x86 Windows machines with NVIDIA GPUs. -- You can now [push models](/manuals/desktop/features/model-runner.md#push-a-model-to-docker-hub) to Docker Hub with Docker Model Runner. +- You can now [push models](/manuals/ai/model-runner.md#push-a-model-to-docker-hub) to Docker Hub with Docker Model Runner. - Added support for Docker Model Runner's model management and chat interface in Docker Desktop for Mac and Windows (on hardware supporting Docker Model Runner). Users can now view, interact with, and manage local AI models through a new dedicated interface. - [Docker Compose](/manuals/compose/how-tos/model-runner.md) and Testcontainers [Java](https://java.testcontainers.org/modules/docker_model_runner/) and [Go](https://golang.testcontainers.org/modules/dockermodelrunner/) now support Docker Model Runner. - Introducing Docker Desktop in the [Microsoft App Store](https://apps.microsoft.com/detail/xp8cbj40xlbwkx?hl=en-GB&gl=GB). @@ -99,7 +99,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo ### New -- You can now pull, run, and manage AI models from Docker Hub directly in Docker Desktop with [Docker Model Runner (Beta)](/manuals/desktop/features/model-runner.md). Currently available for Docker Desktop for Mac with Apple Silicon. +- You can now pull, run, and manage AI models from Docker Hub directly in Docker Desktop with [Docker Model Runner (Beta)](/manuals/ai/model-runner.md). Currently available for Docker Desktop for Mac with Apple Silicon. ### Upgrades @@ -210,7 +210,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo - The new [`update` command](/reference/cli/docker/desktop/update.md) has been added to the Docker Desktop CLI (Mac only). - [Bake](/manuals//build/bake/_index.md) is now generally available, with support for entitlements and composable attributes. - You can now create [multi-node Kubernetes clusters](/manuals/desktop/settings-and-maintenance/settings.md#kubernetes) in Docker Desktop. -- [Ask Gordon](/manuals/desktop/features/gordon.md) is more widely available. It is still in Beta. +- [Ask Gordon](/manuals/ai/gordon/_index.md) is more widely available. It is still in Beta. ### Upgrades diff --git a/content/manuals/desktop/use-desktop/_index.md b/content/manuals/desktop/use-desktop/_index.md index c2685690380c..b12be1c3ef6e 100644 --- a/content/manuals/desktop/use-desktop/_index.md +++ b/content/manuals/desktop/use-desktop/_index.md @@ -16,7 +16,7 @@ It provides a centralized interface to manage your [containers](container.md), [ In addition, the Docker Desktop Dashboard lets you: -- Use [Ask Gordon](/manuals/desktop/features/gordon/_index.md), a personal AI assistant embedded in Docker Desktop and the Docker CLI. It's designed to streamline your workflow and help you make the most of the Docker ecosystem. +- Use [Ask Gordon](/manuals/ai/gordon/_index.md), a personal AI assistant embedded in Docker Desktop and the Docker CLI. It's designed to streamline your workflow and help you make the most of the Docker ecosystem. - Navigate to the **Settings** menu to configure your Docker Desktop settings. Select the **Settings** icon in the Dashboard header. - Access the **Troubleshoot** menu to debug and perform restart operations. Select the **Troubleshoot** icon in the Dashboard header. - Be notified of new releases, installation progress updates, and more in the **Notifications center**. Select the bell icon in the bottom-right corner of the Docker Desktop Dashboard to access the notification center. diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md index a09f0ed2ba07..48fc13100a01 100644 --- a/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md @@ -46,7 +46,7 @@ Using the `admin-settings.json` file, you can: - Turn off Docker Extensions - Turn off Docker Scout SBOM indexing - Turn off beta and experimental features -- Turn off Docker AI ([Ask Gordon](../../../../desktop/features/gordon/_index.md)) +- Turn off Docker AI ([Ask Gordon](/manuals/ai/gordon/_index.md)) - Turn off Docker Desktop's onboarding survey - Control whether developers can use the Docker terminal - Control the file sharing implementation for your developers on macOS diff --git a/data/redirects.yml b/data/redirects.yml index 5a9ab2b671d6..522b02e8f380 100644 --- a/data/redirects.yml +++ b/data/redirects.yml @@ -297,6 +297,6 @@ # Desktop DMR -"/desktop/features/model-runner/": +"/ai/model-runner/": - /go/model-runner/ \ No newline at end of file From 9362a99260f5fb9c8e20fd22b133e3a2dd9603bf Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Tue, 29 Apr 2025 10:29:01 -0400 Subject: [PATCH 352/699] security: settings reporting reference table (#22444) ## Description - Adds a section to understand compliance status w/ a reference table of possible status combinations - Preview: https://deploy-preview-22444--docsdocker.netlify.app/security/for-admins/hardened-desktop/settings-management/compliance-reporting/#understand-compliance-status ## Related issues or tickets - https://docker.atlassian.net/browse/ENGDOCS-2561 ## Reviews - [ ] Editorial review - [ ] Product review --------- Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- .../compliance-reporting.md | 52 ++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/compliance-reporting.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/compliance-reporting.md index ffa67066c87d..f7304b448455 100644 --- a/content/manuals/security/for-admins/hardened-desktop/settings-management/compliance-reporting.md +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/compliance-reporting.md @@ -59,6 +59,54 @@ and non-compliant users. 7. Select a username to view more details about their compliance status, and for steps to resolve non-compliant users. +## Understand compliance status + +Docker evaluates compliance status based on: + +- Compliance status: Whether a user has fetched and applied the latest settings. This is the primary label shown on the reporting page. +- Domain status: Whether the user's email matches a verified domain. +- Settings status: Whether a settings policy is applied to the user. + +The combination of these statuses determines what actions you need to take. + +### Compliance status reference + +This reference explains how each status is determined in the reporting dashboard +based on user domain and settings data. The Admin Console displays the +highest-priority applicable status according to the following rules. + +**Compliance status** + +| Compliance status | What it means | +|-------------------|---------------| +| Uncontrolled domain | The user's email domain is not verified. | +| No policy assigned | The user does not have any policy assigned to them. | +| Non-compliant | The user fetched the correct policy, but hasn't applied it. | +| Outdated | The user fetched a previous version of the policy. | +| Unknown | The user hasn't fetched any policy yet, or their compliance can't be determined. | +| Compliant | The user fetched and applied the latest assigned policy. | + +**Domain status** + +This reflects how the user’s email domain is evaluated based on the organization’s domain setup. + +| Domain status | What it means | +|---------------|---------------| +| Verified | The user’s email domain is verified. | +| Guest user | The user's email domain is not verified. | +| Domainless | Your organization has no verified domains, and the user's domain is unknown. | +| Unknown user | Your organization has verified domains, but the user's domain is unknown. | + +**Settings status** + +This shows whether and how the user is assigned a settings policy. + +| Settings status | What it means | +|-----------------|---------------| +| Global policy | The user is assigned your organzation's default policy. | +| User policy | The user is assigned a specific custom policy. | +| No policy assigned | The user is not assigned to any policy. | + ## Resolve compliance status To resolve compliance status, you must view a user's compliance status details @@ -80,8 +128,8 @@ Desktop settings reporting dashboard. Select a compliant user to open their compliance status details. Compliant users have the following status details: - **Compliance status**: Compliant -- **Domain status**: Verified domain -- **Settings status**: Compliant +- **Domain status**: Verified +- **Settings status**: Global policy or user policy - **User is compliant** indicator No resolution steps are needed for compliant users. From 4aec810107757735676494d55f6f0ee5607065f6 Mon Sep 17 00:00:00 2001 From: Mathieu Champlon Date: Wed, 30 Apr 2025 08:51:03 +0200 Subject: [PATCH 353/699] Merge pull request #22512 from mat007/cve-2025-3911 Add CVE-2025-3911 to release notes of Docker Desktop 4.41 --- content/manuals/desktop/release-notes.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/manuals/desktop/release-notes.md b/content/manuals/desktop/release-notes.md index 986e9ba778ef..5e0114aa26eb 100644 --- a/content/manuals/desktop/release-notes.md +++ b/content/manuals/desktop/release-notes.md @@ -51,9 +51,10 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo - [Docker Scout CLI v1.17.1](https://github.com/docker/scout-cli/releases/tag/v1.17.1) - [Compose Bridge v0.0.19](https://github.com/docker/compose-bridge-binaries/releases/tag/v0.0.19) -### Security +### Security - Fixed [CVE-2025-3224](https://www.cve.org/CVERecord?id=CVE-2025-3224) allowing an attacker with access to a user machine to perform an elevation of privilege when Docker Desktop updates. +- Fixed [CVE-2025-3911](https://www.cve.org/CVERecord?id=CVE-2025-3911) allowing an attacker with read access to a user's machine to obtain sensitive information from Docker Desktop log files, including environment variables configured for running containers. ### Bug fixes and enhancements From 949937278bcc76a970bb6795cac769b5f9f3ac1f Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Wed, 30 Apr 2025 11:47:48 +0100 Subject: [PATCH 354/699] MR-link-fix (#22524) ## Description redirect fix ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- data/redirects.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/redirects.yml b/data/redirects.yml index 522b02e8f380..aedd6f60ea0b 100644 --- a/data/redirects.yml +++ b/data/redirects.yml @@ -297,6 +297,6 @@ # Desktop DMR -"/ai/model-runner/": +"/model-runner/": - /go/model-runner/ \ No newline at end of file From 95fed9774b48b7bc393faf071843714f094807ce Mon Sep 17 00:00:00 2001 From: Bruno Sousa <107440821+bsousaa@users.noreply.github.com> Date: Wed, 30 Apr 2025 11:53:28 +0100 Subject: [PATCH 355/699] Add CVE-2025-4095 to release notes of Docker Desktop 4.41 (#22521) ## Description Add CVE-2025-4095 to release notes of Docker Desktop 4.41 ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- content/manuals/desktop/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/manuals/desktop/release-notes.md b/content/manuals/desktop/release-notes.md index 5e0114aa26eb..46534cf4ec07 100644 --- a/content/manuals/desktop/release-notes.md +++ b/content/manuals/desktop/release-notes.md @@ -54,6 +54,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo ### Security - Fixed [CVE-2025-3224](https://www.cve.org/CVERecord?id=CVE-2025-3224) allowing an attacker with access to a user machine to perform an elevation of privilege when Docker Desktop updates. +- Fixed [CVE-2025-4095](https://www.cve.org/CVERecord?id=CVE-2025-4095) where Registry Access Management (RAM) policies were not enforced when using a MacOS configuration profile, allowing users to pull images from unapproved registries. - Fixed [CVE-2025-3911](https://www.cve.org/CVERecord?id=CVE-2025-3911) allowing an attacker with read access to a user's machine to obtain sensitive information from Docker Desktop log files, including environment variables configured for running containers. ### Bug fixes and enhancements From c16bef1182abb4e720b964488b9f30962a1c04f3 Mon Sep 17 00:00:00 2001 From: george Date: Wed, 30 Apr 2025 16:53:16 +0200 Subject: [PATCH 356/699] Merge pull request #22529 from gabolaev/4.41.1 add 4.41.1 notes --- content/manuals/desktop/release-notes.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/content/manuals/desktop/release-notes.md b/content/manuals/desktop/release-notes.md index 46534cf4ec07..6e6df443d5c9 100644 --- a/content/manuals/desktop/release-notes.md +++ b/content/manuals/desktop/release-notes.md @@ -29,6 +29,22 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo > > If you're experiencing malware detection issues on Mac, follow the steps documented in [docker/for-mac#7527](https://github.com/docker/for-mac/issues/7527). +## 4.41.1 + +{{< release-date date="2025-04-30" >}} + +{{< desktop-install-v2 all=true beta_win_arm=true version="4.41.1" build_path="/191279/" >}} + +### Bug fixes and enhancements + +#### For all platforms + +- Fixed an issue where Docker Desktop failed to start when a proxy configuration was specified in the `admin-settings.json` file. + +#### For Windows + +- Fixed possible conflict with 3rd party tools (for example, Ollama) by avoiding placing `llama.cpp` DLLs in a directory included in the system `PATH`. + ## 4.41.0 {{< release-date date="2025-04-28" >}} From 68fc43e2ef559a63b5eca5185da2781d0d90bcd6 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Wed, 30 Apr 2025 12:13:45 -0400 Subject: [PATCH 357/699] billing: pay by ach transfer (#22473) ## Description - Adds pay by bank account as payment method option - Adds new section on verifying bank account - Preview: https://deploy-preview-22473--docsdocker.netlify.app/billing/payment-method/ ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- _vale/Docker/Acronyms.yml | 1 + content/manuals/billing/cycle.md | 10 ++ content/manuals/billing/faqs.md | 1 + content/manuals/billing/payment-method.md | 123 ++++++++++++++----- content/manuals/subscription/change.md | 5 + content/manuals/subscription/manage-seats.md | 5 + 6 files changed, 115 insertions(+), 30 deletions(-) diff --git a/_vale/Docker/Acronyms.yml b/_vale/Docker/Acronyms.yml index 08a81fb0731c..476d8937d5b9 100644 --- a/_vale/Docker/Acronyms.yml +++ b/_vale/Docker/Acronyms.yml @@ -8,6 +8,7 @@ first: '\b([A-Z]{2,5})\b' second: '(?:\b[A-Z][a-z]+ )+\(([A-Z]{2,5})s?\)' # ... with the exception of these: exceptions: + - ACH - AGPL - AI - API diff --git a/content/manuals/billing/cycle.md b/content/manuals/billing/cycle.md index a8f5b2e09c5f..e3e98563ff5c 100644 --- a/content/manuals/billing/cycle.md +++ b/content/manuals/billing/cycle.md @@ -39,6 +39,11 @@ To change your billing cycle: 5. Select **Continue to payment**. 6. Verify payment information and select **Upgrade subscription**. +> [!NOTE] +> +> If you choose to pay using a US bank account, you must verify the account. For +> more information, see [Verify a bank account](manuals/billing/payment-method.md#verify-a-bank-account). + The billing plans and usage page will now reflect your new annual plan details. {{< /tab >}} @@ -73,6 +78,11 @@ To change your organization's billing cycle: 5. Select **Continue to payment**. 6. Verify payment information and select **Upgrade subscription**. +> [!NOTE] +> +> If you choose to pay using a US bank account, you must verify the account. For +> more information, see [Verify a bank account](manuals/billing/payment-method.md#verify-a-bank-account). + {{< /tab >}} {{< tab name="Legacy Docker plan" >}} diff --git a/content/manuals/billing/faqs.md b/content/manuals/billing/faqs.md index 4bc962db7c13..d9212c8b50f7 100644 --- a/content/manuals/billing/faqs.md +++ b/content/manuals/billing/faqs.md @@ -17,6 +17,7 @@ weight: 60 - Diners - UnionPay - Link +- ACH transfer with a [verified](manuals/billing/payment-method.md#verify-a-bank-account) US bank account ### What currency is supported? diff --git a/content/manuals/billing/payment-method.md b/content/manuals/billing/payment-method.md index cfe74510ffb5..f4c2ad3e2a96 100644 --- a/content/manuals/billing/payment-method.md +++ b/content/manuals/billing/payment-method.md @@ -17,14 +17,18 @@ You can add a payment method or update your account's existing payment method at The following payment methods are supported: -- Visa -- MasterCard -- American Express -- Discover -- JCB -- Diners -- UnionPay -- Link +- Cards + - Visa + - MasterCard + - American Express + - Discover + - JCB + - Diners + - UnionPay +- Wallets + - Stripe Link +- Bank accounts + - ACH transfer with a [verified](manuals/billing/payment-method.md#verify-a-bank-account) US bank account All currency, for example the amount listed on your billing invoice, is in United States dollar (USD). @@ -44,15 +48,26 @@ To add a payment method: 3. Select **Payment methods** from the left-hand menu. 4. Select **Add payment method**. 5. Enter your new payment information: - - If you are adding a card, fill out the card information form. - - If you are adding a Link payment, select **Secure, 1-click checkout with Link** - and enter your Link **email address** and **phone number**. If you are not - an existing Link customer, you must fill out the card information form to - store a card for Link payments. + - If you are adding a card: + - Select **Card** and fill out the card information form. + - If you are adding a Link payment: + - Select **Secure, 1-click checkout with Link** and enter your Link **email address** and **phone number**. + - If you are not an existing Link customer, you must fill out the card information form to store a card for Link payments. + - If you are adding a bank account: + - Select **US bank account**. + - Verify your **Email** and **Full name**. + - If your bank is listed, select your bank's name. + - If your bank is not listed, select **Search for your bank**. + - To verify your bank account, see [Verify a bank account](manuals/billing/payment-method.md#verify-a-bank-account). 6. Select **Add payment method**. 7. Optional. You can set a new default payment method by selecting the **Set as default** action. 8. Optional. You can remove non-default payment methods by selecting the **Delete** action. +> [!NOTE] +> +> If you want to set a US bank account as your default payment method, you must +> verify the account first. + {{< /tab >}} {{< tab name="Legacy Docker plan" >}} @@ -64,11 +79,11 @@ To add a payment method: 4. Select the **Payment methods and billing history** link. 5. In the **Payment method** section, select **Add payment method**. 6. Enter your new payment information: - - If you are adding a card, fill out the card information form. - - IIf you are adding a Link payment, select **Secure, 1-click checkout with Link** - and enter your Link **email address** and **phone number**. If you are not - an existing Link customer, you must fill out the card information form to - store a card for Link payments. + - If you are adding a card: + - Select **Card** and fill out the card information form. + - If you are adding a Link payment: + - Select **Secure, 1-click checkout with Link** and enter your Link **email address** and **phone number**. + - If you are not an existing Link customer, you must fill out the card information form to store a card for Link payments. 7. Select **Add**. 8. Select the **Actions** icon, then select **Make default** to ensure that your new payment method applies to all purchases and subscriptions. 9. Optional. You can remove non-default payment methods by selecting the **Actions** icon. Then, select **Delete**. @@ -93,14 +108,26 @@ To add a payment method: 4. Select **Payment methods** from the left-hand menu. 5. Select **Add payment method**. 6. Enter your new payment information: - - If you are adding a card, fill out the card information form. - - If you are adding a Link payment, select **Secure, 1-click checkout with Link** - and enter your Link **email address** and **phone number**. If you are not - an existing Link customer, you must fill out the card information form to - store a card for Link payments. + - If you are adding a card: + - Select **Card** and fill out the card information form. + - If you are adding a Link payment: + - Select **Secure, 1-click checkout with Link** and enter your Link **email address** and **phone number**. + - If you are not an existing Link customer, you must fill out the card information form to store a card for Link payments. + - If you are adding a bank account: + - Select **US bank account**. + - Verify your **Email** and **Full name**. + - If your bank is listed, select your bank's name. + - If your bank is not listed, select **Search for your bank**. + - To verify your bank account, see [Verify a bank account](manuals/billing/payment-method.md#verify-a-bank-account). 7. Select **Add payment method**. -8. Optional. You can set a new default payment method by selecting the **Set as default** action. -9. Optional. You can remove non-default payment methods by selecting the **Delete** action. +8. Select **Add payment method**. +9. Optional. You can set a new default payment method by selecting the **Set as default** action. +10. Optional. You can remove non-default payment methods by selecting the **Delete** action. + +> [!NOTE] +> +> If you want to set a US bank account as your default payment method, you must +> verify the account first. {{< /tab >}} {{< tab name="Legacy Docker plan" >}} @@ -114,11 +141,11 @@ To add a payment method: 5. Select the **Payment methods and billing history** link. 6. In the **Payment Method** section, select **Add payment method**. 7. Enter your new payment information: - - If you are adding a card, fill out the card information form. - - If you are adding a Link payment, select **Secure, 1-click checkout with Link** - and enter your Link **email address** and **phone number**. If you are not - an existing Link customer, you must fill out the card information form to - store a card for Link payments. + - If you are adding a card: + - Select **Card** and fill out the card information form. + - If you are adding a Link payment: + - Select **Secure, 1-click checkout with Link** and enter your Link **email address** and **phone number**. + - If you are not an existing Link customer, you must fill out the card information form to store a card for Link payments. 8. Select **Add payment method**. 9. Select the **Actions** icon, then select **Make default** to ensure that your new payment method applies to all purchases and subscriptions. 10. Optional. You can remove non-default payment methods by selecting the **Actions** icon. Then, select **Delete**. @@ -126,6 +153,42 @@ To add a payment method: {{< /tab >}} {{< /tabs >}} +## Verify a bank account + +There are two ways to verify a bank account as a payment method: + +- Instant verification: Docker supports several major banks for instant verification. +- Manual verification: All other banks must be verified manually. + +### Instant verification + +To verify your bank account instantly, you must sign in to your bank account +from the Docker billing flow: + +1. Choose **US bank account** as your payment method. +2. Verify your **Email** and **Full name**. +3. If your bank is listed, select your bank's name or select **Search for your bank**. +4. Sign in to your bank and review the terms and conditions. This agreement +allows Docker to debit payments from your connected bank account. +5. Select **Agree and continue**. +6. Select an account to link and verify, and select **Connect account**. + +When the account is verified, you will see a success message in the pop-up modal. + +### Manual verification + +To verify your bank account manually, you must enter the micro-deposit amount from your bank statement: + +1. Choose **US bank account** as your payment method. +2. Verify your **Email** and **First and last name**. +3. Select **Enter bank details manually instead**. +4. Enter your bank details: **Routing number** and **Account number**. +5. Select **Submit**. +6. You will receive an email with instructions on how to manually verify. + +Manual verification uses micro-deposits. You should see a small deposit +(e.g. $-0.01) in your bank account in 1-2 business days. Open your manual verification email and enter the amount of this deposit to verify your account. + ## Failed payments > [!NOTE] diff --git a/content/manuals/subscription/change.md b/content/manuals/subscription/change.md index b2e6a5d6033e..5844598f1ba2 100644 --- a/content/manuals/subscription/change.md +++ b/content/manuals/subscription/change.md @@ -46,6 +46,11 @@ To upgrade your Docker subscription: 5. Select **Upgrade**. 6. Follow the on-screen instructions to complete your upgrade. +> [!NOTE] +> +> If you choose to pay using a US bank account, you must verify the account. For +> more information, see [Verify a bank account](manuals/billing/payment-method.md#verify-a-bank-account). + {{< /tab >}} {{< tab name="Legacy Docker plan" >}} diff --git a/content/manuals/subscription/manage-seats.md b/content/manuals/subscription/manage-seats.md index f0ec03e90269..bfe663080969 100644 --- a/content/manuals/subscription/manage-seats.md +++ b/content/manuals/subscription/manage-seats.md @@ -36,6 +36,11 @@ To add seats to your subscription: 4. Select **Add seats**. 5. Follow the on-screen instructions to complete adding seats. +> [!NOTE] +> +> If you choose to pay using a US bank account, you must verify the account. For +> more information, see [Verify a bank account](manuals/billing/payment-method.md#verify-a-bank-account). + You can now add more members to your organization. For more information, see [Manage organization members](../admin/organization/members.md). {{< /tab >}} From 001f6681924cd5be97197341eb51e561c7a15615 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Thu, 1 May 2025 11:11:10 +0300 Subject: [PATCH 358/699] Merge pull request #22528 from duffuniverse/fix-typos-in-build-dependent-images-manual Fix typos in the Build dependent images manual --- content/manuals/compose/how-tos/dependent-images.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/manuals/compose/how-tos/dependent-images.md b/content/manuals/compose/how-tos/dependent-images.md index 238f27efb40a..d62668548acf 100644 --- a/content/manuals/compose/how-tos/dependent-images.md +++ b/content/manuals/compose/how-tos/dependent-images.md @@ -9,12 +9,12 @@ weight: 50 To reduce push/pull time and image weight, a common practice for Compose applications is to have services share base layers as much as possible. You will typically select the same operating system base image for -all services. But you also can get one step further sharing image layers when your images share the same +all services. But you can also get one step further by sharing image layers when your images share the same system packages. The challenge to address is then to avoid repeating the exact same Dockerfile instruction in all services. For illustration, this page assumes you want all your services to be built with an `alpine` base -image and install system package `openssl`. +image and install the system package `openssl`. ## Multi-stage Dockerfile @@ -161,4 +161,4 @@ Bake can also be selected as the default builder by editing your `$HOME/.docker/ } ... } -``` \ No newline at end of file +``` From b116a7c74cae1150bd5ceb1476daab50ea58f090 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Thu, 1 May 2025 11:38:21 +0300 Subject: [PATCH 359/699] Fix typos in the "Pre-defined environment variables in Compose" manual (#22492) ## Description This pull request fixes stale Compose CLI documentation URLs and a few minor typos. --- .../compose/how-tos/environment-variables/envvars.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/manuals/compose/how-tos/environment-variables/envvars.md b/content/manuals/compose/how-tos/environment-variables/envvars.md index 88410e4ce6d9..67d5929673fa 100644 --- a/content/manuals/compose/how-tos/environment-variables/envvars.md +++ b/content/manuals/compose/how-tos/environment-variables/envvars.md @@ -50,7 +50,7 @@ Compose can set the project name in different ways. The level of precedence (fro 1. The `-p` command line flag 2. `COMPOSE_PROJECT_NAME` -3. The top level `name:` variable from the config file (or the last `name:` from +3. The top-level `name:` variable from the config file (or the last `name:` from a series of config files specified using `-f`) 4. The `basename` of the project directory containing the config file (or containing the first config file specified using `-f`) @@ -78,7 +78,7 @@ Specifies the path to a Compose file. Specifying multiple Compose files is suppo ``` The path separator can also be customized using [`COMPOSE_PATH_SEPARATOR`](#compose_path_separator). -See also the [command-line options overview](/reference/cli/docker/compose/_index.md#command-options-overview-and-help) and [using `-f` to specify name and path of one or more Compose files](/reference/cli/docker/compose/_index.md#use--f-to-specify-name-and-path-of-one-or-more-compose-files). +See also the [command-line options overview](/reference/cli/docker/compose/_index.md#command-options-overview-and-help) and [using `-f` to specify name and path of one or more Compose files](/reference/cli/docker/compose/_index.md#use--f-to-specify-the-name-and-path-of-one-or-more-compose-files). ### COMPOSE\_PROFILES @@ -86,18 +86,18 @@ Specifies one or more profiles to be enabled when `docker compose up` is run. Services with matching profiles are started as well as any services for which no profile has been defined. -For example, calling `docker compose up`with `COMPOSE_PROFILES=frontend` selects services with the +For example, calling `docker compose up` with `COMPOSE_PROFILES=frontend` selects services with the `frontend` profile as well as any services without a profile specified. If specifying multiple profiles, use a comma as a separator. -This following example enables all services matching both the `frontend` and `debug` profiles and services without a profile. +The following example enables all services matching both the `frontend` and `debug` profiles and services without a profile. ```console COMPOSE_PROFILES=frontend,debug ``` -See also [Using profiles with Compose](../profiles.md) and the [`--profile` command-line option](/reference/cli/docker/compose/_index.md#use---profile-to-specify-one-or-more-active-profiles). +See also [Using profiles with Compose](../profiles.md) and the [`--profile` command-line option](/reference/cli/docker/compose/_index.md#use-profiles-to-enable-optional-services). ### COMPOSE\_CONVERT\_WINDOWS\_PATHS @@ -179,7 +179,7 @@ When enabled, Compose displays a navigation menu where you can choose to open th - Supported values: - `true` or `1`, to enable - `false` or `0`, to disable -- Defaults to: `1` if you obtained Docker Compose through Docker Desktop, otherwise default is `0` +- Defaults to: `1` if you obtained Docker Compose through Docker Desktop, otherwise the default is `0` ### COMPOSE\_EXPERIMENTAL From 11f970ed5efc525f53f10526806a971adc7c3fd1 Mon Sep 17 00:00:00 2001 From: Eduardo Diaz Date: Thu, 1 May 2025 10:41:59 +0200 Subject: [PATCH 360/699] Update oci-artifact.md (#22489) ## Description Included the -y option to bypass interactive confirmation in the OCI artifact documentation ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- content/manuals/compose/how-tos/oci-artifact.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/manuals/compose/how-tos/oci-artifact.md b/content/manuals/compose/how-tos/oci-artifact.md index 33ce8042fc22..0791df4e6f6b 100644 --- a/content/manuals/compose/how-tos/oci-artifact.md +++ b/content/manuals/compose/how-tos/oci-artifact.md @@ -141,3 +141,9 @@ Do you want to continue? [y/N]: y Your compose stack "oci://registry.example.com/stack:latest" is stored in "~/Library/Caches/docker-compose/964e715660d6f6c3b384e05e7338613795f7dcd3613890cfa57e3540353b9d6d" ``` + +The `docker compose publish` command supports non-interactive execution, letting you skip the confirmation prompt by including the `-y` (or `--yes`) flag: + +```console +$ docker compose publish -y username/my-compose-app:latest +``` From ac01a44a48d0426342f8cb06032bb3791f6f5153 Mon Sep 17 00:00:00 2001 From: Gen Whitt <107279666+genwhittTTD@users.noreply.github.com> Date: Sun, 4 May 2025 17:11:25 -0400 Subject: [PATCH 361/699] edits to some headings x 2 (#22563) ## Description Update to additional headings: just one. General comment: best to steer away from gerunds (-ing ending) in headings. Most of the headings are not that, so, consistency is best. ## Related issues or tickets Issue 22559, second PR on that issues. ## Reviews To Sarah Sanders for review. --- data/engine-cli/docker_image_build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/engine-cli/docker_image_build.yaml b/data/engine-cli/docker_image_build.yaml index 2c7c1f28d455..eb62cfecb37c 100644 --- a/data/engine-cli/docker_image_build.yaml +++ b/data/engine-cli/docker_image_build.yaml @@ -51,7 +51,7 @@ long: |- file to exclude files and directories that you don't require in your build from being sent as part of the build context. - #### Accessing paths outside the build context + #### Access paths outside the build context The legacy builder will error out if you try to access files outside of the build context using relative paths in your Dockerfile. From 0530b659ceb500f433214cebb290efdfc43ad135 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Mon, 5 May 2025 16:57:06 +0100 Subject: [PATCH 362/699] ENGDOCS-2593 (#22523) ## Description ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- .../ai/mcp-catalog-and-toolkit/_index.md | 43 +++++++++ .../ai/mcp-catalog-and-toolkit/catalog.md | 94 +++++++++++++++++++ .../ai/mcp-catalog-and-toolkit/toolkit.md | 53 +++++++++++ 3 files changed, 190 insertions(+) create mode 100644 content/manuals/ai/mcp-catalog-and-toolkit/_index.md create mode 100644 content/manuals/ai/mcp-catalog-and-toolkit/catalog.md create mode 100644 content/manuals/ai/mcp-catalog-and-toolkit/toolkit.md diff --git a/content/manuals/ai/mcp-catalog-and-toolkit/_index.md b/content/manuals/ai/mcp-catalog-and-toolkit/_index.md new file mode 100644 index 000000000000..ef550dacb32f --- /dev/null +++ b/content/manuals/ai/mcp-catalog-and-toolkit/_index.md @@ -0,0 +1,43 @@ +--- +title: Docker MCP Catalog and Toolkit +linkTitle: MCP Catalog and Toolkit +params: + sidebar: + group: AI + badge: + color: green + text: New +weight: 30 +description: Learn about Docker's MCP catalog on Docker Hub and how to use it with the MCP Toolkit extension +keywords: Docker, ai, mcp servers, ai agents, extension, docker desktop, llm, docker hub +grid: + - title: MCP Catalog + description: Learn about the benefits of the MCP Catalog, how you can use it, and how you can contribute + icon: hub + link: /ai/mcp-catalog-and-toolkit/catalog/ + - title: MCP Toolkit + description: Learn about how to use the MCP Toolkit extension on Docker Desktop + icon: manufacturing + link: /ai/mcp-catalog-and-toolkit/toolkit/ +--- + +The Model Context Protocol (MCP) is a modern standard that transforms AI agents from passive responders into action-oriented systems. By standardizing how tools are described, discovered, and invoked, MCP enables agents to securely query APIs, access data, and execute services across diverse environments. + +As agents move into production, MCP solves common integration challenges — interoperability, reliability, and security — by providing a consistent, decoupled, and scalable interface between agents and tools. Just as containers redefined software deployment, MCP is reshaping how AI systems interact with the world. + +## What is Docker MCP Catalog and Toolkit? + +Docker MCP Catalog and Toolkit is a comprehensive solution for securely building, sharing, and running MCP tools. It simplifies the developer experience across four key areas: + +- Discovery: A central catalog with verified, versioned tools +- Credential Management: OAuth-based and secure by default +- Execution: Tools run in isolated, containerized environments +- Portability: Use MCP tools across Claude, Cursor, VS Code, and more — no code changes needed + +With Docker Hub and the Docker Desktop extension, you can: + +- Launch MCP servers in seconds +- Add tools via CLI or GUI +- Rely on Docker’s pull-based infrastructure for trusted delivery + +{{< grid >}} diff --git a/content/manuals/ai/mcp-catalog-and-toolkit/catalog.md b/content/manuals/ai/mcp-catalog-and-toolkit/catalog.md new file mode 100644 index 000000000000..388f3925d707 --- /dev/null +++ b/content/manuals/ai/mcp-catalog-and-toolkit/catalog.md @@ -0,0 +1,94 @@ +--- +title: Docker MCP Catalog +description: Learn about the benefits of the MCP Catalog, how you can use it, and how you can contribute +keywords: docker hub, mcp, mcp servers, ai agents, calatog, docker +--- + +The [Docker MCP Catalog](https://hub.docker.com/catalogs/mcp) is a centralized, trusted registry for discovering, sharing, and running MCP-compatible tools. Seamlessly integrated into Docker Hub, it offers verified, versioned, and curated MCP servers packaged as Docker images. + +The catalog also solves common MCP server challenges: + +- Environment conflicts: Tools often need specific runtimes that may clash with existing setups. +- Lack of isolation: Traditional setups risk exposing the host system. +- Setup complexity: Manual installation and configuration result in slow adoption. +- Inconsistency across platforms: Tools may behave unpredictably on different OSes. + +With Docker, each MCP server runs as a self-contained container so it is portable, isolated, and consistent. You can launch tools instantly using Docker CLI or Docker Desktop, without worrying about dependencies or compatibility. + +## Key features + +- Over 100 verified MCP servers in one place +- Publisher verification and versioned releases +- Pull-based distribution using Docker’s infrastructure +- Tools provided by partners such as New Relic, Stripe, Grafana, and more + +## How it works + +Each tool in the MCP Catalog is packaged as a Docker image with metadata. Developers can: + +- Discover tools via Docker Hub under the mcp/ namespace. +- Connect tools to their preferred agents with simple configuration through the [MCP Toolkit](toolkit.md) +- Pull and run tools using Docker Desktop or the CLI. + +Each catalog entry provides: + +- Tool description and metadata +- Version history +- Example configuration for agent integration + +## Example: How to use an MCP server from Docker Hub + +The following example uses the Puppeteer MCP server to take a screenshot of a website and invert the colors using Claude Desktop. + +{{< tabs >}} +{{< tab name="Using the MCP Toolkit (Recommended)" >}} + +1. Make sure you have [installed the Docker Desktop Docker MCP Toolkit extension](toolkit.md). +2. From the extension, search for the Puppeteer MCP server in the **MCP Servers** tab, and toggle it on to enable. +3. From the **MCP Clients** tab, select the **Connect** button for Claude Desktop. +4. Within Claude Desktop, submit the following prompt using the Sonnet 3.5 model: + + ```text + Take a screenshot of docs.docker.com and then invert the colors + ``` + +{{< /tab >}} +{{< tab name="Manually set it up" >}} + +1. Update the `claude_desktop_config.json` file to include the following configuration: + + ```json + { + "mcpServers": { + "puppeteer": { + "command": "docker", + "args": [ + "run", + "-i", + "--rm", + "-e", + "DOCKER_CONTAINER", + "mcp/puppeteer" + ], + "env": { + "DOCKER_CONTAINER": "true" + } + } + } + } + ``` +2. Restart Claude Desktop to apply the changed config file. +3. Submit the following prompt using the Sonnet 3.5 model: + + ```text + Take a screenshot of docs.docker.com and then invert the colors + ``` + +Once you've given your consent to use the new tools, Claude spins up the Puppeteer MCP server inside a container, navigates to the target URL, captures and modify the page, and returns the screenshot. + +{{< /tab >}} +{{< /tabs >}} + +## Contribute an MCP server to the catalog + +If you would like to add you MCP server to the Docker MCP Catalog, fill out the Docker [MCP submission form](https://www.docker.com/products/mcp-catalog-and-toolkit/#get_updates). \ No newline at end of file diff --git a/content/manuals/ai/mcp-catalog-and-toolkit/toolkit.md b/content/manuals/ai/mcp-catalog-and-toolkit/toolkit.md new file mode 100644 index 000000000000..3af9971dbab9 --- /dev/null +++ b/content/manuals/ai/mcp-catalog-and-toolkit/toolkit.md @@ -0,0 +1,53 @@ +--- +title: MCP Toolkit +description: +keywords: +--- + +The Docker MCP Toolkit is a Docker Desktop extension local that enables seamless setup, management, and execution of containerized MCP servers and their connections to AI agents. It removes the friction from tool usage by offering secure defaults, one-click setup, and support for a growing ecosystem of LLM-based clients. It is the fastest path from MCP tool discovery to local execution. + +## Key features + +- Cross-LLM compatibility: Works out of the box with Claude Desktop, Cursor, Continue.dev, and [Gordon](/manuals/ai/gordon/_index.md). +- Integrated tool discovery: Browse and launch MCP servers that are available in the Docker MCP Catalog, directly from Docker Desktop. +- No manual setup: Skip dependency management, runtime setup, and manual server configuration. + +## How it works + +The **MCP Servers** tab lists all available servers from the Docker MCP Catalog. Each entry includes: + +- Tool name and description +- Partner/publisher +- Number of callable tools and what they are + +To enable an MCP server, simply use the toggle switch to toggle it on. + +> [!NOTE] +> +> Some MCP servers requires secrets or tokens to be configured before it can be enabled. Instructions on how to do this can be found on each MCP servers' repository. + +The **MCP Clients** tab lets you connect your enabled MCP servers to supported agents. Connection is as simple as selecting **Connect**, so you can switch between LLM providers without altering your MCP server integrations or security configurations. + +## Installation + +To install the Docker MCP Toolkit extension: + +1. In the Docker Desktop Dashboard, select the **Extensions** view, and then select **Manage**. +2. Select the **Browse** tab and search for **Docker MCP Toolkit**. +3. On the **Docker MCP Toolkit** result, select install. + +The extension then appears under the **My extensions** tab. + +### Example + +The following example assumes you have already installed and set up Claude Desktop. + +1. In the Docker MCP Toolkit extension, search for the Puppeteer MCP server in the **MCP Servers** tab, and toggle it on to enable. +2. From the **MCP Clients** tab, select the **Connect** button for Claude Desktop. +3. Within Claude Desktop, submit the following prompt using the Sonnet 3.5 model: + + ```text + Take a screenshot of docs.docker.com and then invert the colors + ``` + +Once you've given your consent to use the new tools, Claude spins up the Puppeteer MCP server inside a container, navigates to the target URL, captures and modify the page, and returns the screenshot. \ No newline at end of file From 75437971154af71a96899c2157c50db861912f48 Mon Sep 17 00:00:00 2001 From: Nicolas Beck Date: Mon, 5 May 2025 19:19:23 +0200 Subject: [PATCH 363/699] docs(ci): clarify credentials setup for DBC CI/CD (#22587) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description This PR updates the Docker Build Cloud CI documentation to clarify the setup of credentials for CI/CD pipelines. The changes include: - Renaming the section to “Setting up credentials for CI/CD” and integrating guidance on both access tokens and the required username (`DOCKER_USER`). - Explaining when to use an organization access token (OAT) versus a personal access token (PAT), and which value to use for `DOCKER_USER` in each case. - Updating the build timeout note from 2 hours to 90 minutes. ## Related issues or tickets N/A – Documentation improvement and clarification. ## Reviews - [ ] Technical review — Confirm technical accuracy of credential setup and variable usage. - [ ] Editorial review — Check for clarity, consistency, and adherence to Docker copy guidelines. - [ ] Product review — Ensure the documentation aligns with product requirements and user needs. --- content/manuals/build-cloud/ci.md | 63 +++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/content/manuals/build-cloud/ci.md b/content/manuals/build-cloud/ci.md index 71a709f30328..f51931381830 100644 --- a/content/manuals/build-cloud/ci.md +++ b/content/manuals/build-cloud/ci.md @@ -29,30 +29,53 @@ See [Loading build results](./usage/#loading-build-results) for details. > [!NOTE] > -> Builds on Docker Build Cloud have a timeout limit of two hours. Builds that -> run for longer than two hours are automatically cancelled. +> Builds on Docker Build Cloud have a timeout limit of 90 minutes. Builds that +> run for longer than 90 minutes are automatically cancelled. -## CI platform examples +## Setting up credentials for CI/CD -### GitHub Actions +To enable your CI/CD system to build and push images using Docker Build Cloud, provide both an access token and a username. The type of token and the username you use depend on your account type and permissions. + +- If you are an organization administrator or have permission to create [organization access tokens (OAT)](../security/for-admins/access-tokens.md), use an OAT and set `DOCKER_USER` to your Docker Hub organization name. +- If you do not have permission to create OATs or are using a personal account, use a [personal access token (PAT)](/security/for-developers/access-tokens/) and set `DOCKER_USER` to your Docker Hub username. + +### Creating access tokens + +#### For organization accounts + +If you are an organization administrator: + +1. Create an [organization access token (OAT)](../security/for-admins/access-tokens.md): + - The token must have these permissions: + - **cloud-connect** scope + - **Read public repositories** permission + - **Repository access** with **Image push** permission for the target repository: + - Expand the **Repository** drop-down. + - Select **Add repository** and choose your target repository. + - Set the **Image push** permission for the repository. + +If you are not an organization administrator: + +- Ask your organization administrator for an access token with the permissions listed above, or use a personal access token. + +#### For personal accounts + +1. Create a [personal access token (PAT)](/security/for-developers/access-tokens/): + - Create a new token with **Read & write** access. + - Note: Building with Docker Build Cloud only requires read access, but you need write access to push images to a Docker Hub repository. + + +## CI platform examples > [!NOTE] > -> Version 4.0.0 and later of `docker/build-push-action` and -> `docker/bake-action` builds images with [provenance attestations by -> default](/manuals/build/ci/github-actions/attestations.md#default-provenance). Docker -> Build Cloud automatically attempts to load images to the local image store if -> you don't explicitly push them to a registry. -> -> This results in a conflicting scenario where if you build a tagged image -> without pushing it to a registry, Docker Build Cloud attempts to load images -> containing attestations. But the local image store on the GitHub runner -> doesn't support attestations, and the image load fails as a result. +> In your CI/CD configuration, set the following variables: +> - `DOCKER_PAT` — your access token (PAT or OAT) +> - `DOCKER_USER` — your Docker Hub username (for PAT) or organization name (for OAT) > -> If you want to load images built with `docker/build-push-action` together -> with Docker Build Cloud, you must disable provenance attestations by setting -> `provenance: false` in the GitHub Action inputs (or in `docker-bake.hcl` if -> you use Bake). +> This ensures your builds authenticate correctly with Docker Build Cloud. + +### GitHub Actions ```yaml name: ci @@ -381,7 +404,7 @@ mkdir -vp ~/.docker/cli-plugins/ curl --silent -L --output ~/.docker/cli-plugins/docker-buildx $BUILDX_URL chmod a+x ~/.docker/cli-plugins/docker-buildx -# Login to Docker Hub. For security reasons $DOCKER_PAT should be a Personal Access Token. See https://docs.docker.com/security/for-developers/access-tokens/ +# Login to Docker Hub. For security reasons $DOCKER_PAT should be a Personal Access Token. See https://docs.docker.com/build-cloud/ci/#creating-access-tokens echo "$DOCKER_PAT" | docker login --username $DOCKER_USER --password-stdin # Connect to your builder and set it as the default builder @@ -426,7 +449,7 @@ curl --silent -L --output ~/.docker/cli-plugins/docker-compose $COMPOSE_URL chmod a+x ~/.docker/cli-plugins/docker-buildx chmod a+x ~/.docker/cli-plugins/docker-compose -# Login to Docker Hub. For security reasons $DOCKER_PAT should be a Personal Access Token. See https://docs.docker.com/security/for-developers/access-tokens/ +# Login to Docker Hub. For security reasons $DOCKER_PAT should be a Personal Access Token. See https://docs.docker.com/build-cloud/ci/#creating-access-tokens echo "$DOCKER_PAT" | docker login --username $DOCKER_USER --password-stdin # Connect to your builder and set it as the default builder From 5bef519e2d7118254210edd80b659d3ef3925a3c Mon Sep 17 00:00:00 2001 From: George Gabolaev Date: Tue, 6 May 2025 10:02:52 +0200 Subject: [PATCH 364/699] 4.41.2 release notes --- content/manuals/desktop/release-notes.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/content/manuals/desktop/release-notes.md b/content/manuals/desktop/release-notes.md index 6e6df443d5c9..3a3a5550bd52 100644 --- a/content/manuals/desktop/release-notes.md +++ b/content/manuals/desktop/release-notes.md @@ -29,6 +29,18 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo > > If you're experiencing malware detection issues on Mac, follow the steps documented in [docker/for-mac#7527](https://github.com/docker/for-mac/issues/7527). +## 4.41.2 + +{{< release-date date="2025-05-06" >}} + +{{< desktop-install-v2 all=true beta_win_arm=true version="4.41.2" build_path="/TODO/" >}} + +### Bug fixes and enhancements + +#### For all platforms + +- Fixed an issue where the `Models` menu was displayed in the GUI even when Docker Model Runner was not supported or not enabled. + ## 4.41.1 {{< release-date date="2025-04-30" >}} From c65f6678f13a82005667853fb8d7ae619cdcd36a Mon Sep 17 00:00:00 2001 From: Usha Mandya Date: Tue, 6 May 2025 10:29:48 +0100 Subject: [PATCH 365/699] fix a broken link Signed-off-by: Usha Mandya --- content/manuals/ai/model-runner.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/manuals/ai/model-runner.md b/content/manuals/ai/model-runner.md index 1f8aab071af9..84898f989dd5 100644 --- a/content/manuals/ai/model-runner.md +++ b/content/manuals/ai/model-runner.md @@ -11,6 +11,7 @@ description: Learn how to use Docker Model Runner to manage and run AI models. keywords: Docker, ai, model runner, docker deskotp, llm aliases: - /desktop/features/model-runner/ + - /ai/model-runner/ --- {{< summary-bar feature_name="Docker Model Runner" >}} From 043dabd13508066f72ab35c882d8094336bf7d86 Mon Sep 17 00:00:00 2001 From: fliespl Date: Wed, 1 Jan 2025 20:50:16 +0100 Subject: [PATCH 366/699] add another iptables rule to allow dns queries from container Co-authored-by: Rob Murray Co-authored-by: fliespl Signed-off-by: Sebastiaan van Stijn --- .../engine/network/packet-filtering-firewalls.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/content/manuals/engine/network/packet-filtering-firewalls.md b/content/manuals/engine/network/packet-filtering-firewalls.md index 2ca6cea12a1d..cc935a2ebaf0 100644 --- a/content/manuals/engine/network/packet-filtering-firewalls.md +++ b/content/manuals/engine/network/packet-filtering-firewalls.md @@ -126,6 +126,17 @@ the source and destination. For instance, if the Docker host has addresses `2001:db8:1111::2` and `2001:db8:2222::2`, you can make rules specific to `2001:db8:1111::2` and leave `2001:db8:2222::2` open. +You may need to allow responses from servers outside the permitted external address +ranges. For example, containers may send DNS or HTTP requests to hosts that are +not allowed to access the container's services. The following rule accepts any +incoming or outgoing packet belonging to a flow that has already been accepted +by other rules. It must be placed before `DROP` rules that restrict access from +external address ranges. + +```console +$ iptables -I DOCKER-USER -m state --state RELATED,ESTABLISHED -j ACCEPT +``` + `iptables` is complicated. There is a lot more information at [Netfilter.org HOWTO](https://www.netfilter.org/documentation/HOWTO/NAT-HOWTO.html). ### Direct routing From fe9389f4be79bda3dbb098b15906534aa9d0206f Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Tue, 6 May 2025 16:13:34 +0300 Subject: [PATCH 367/699] Fix typos in the Resource constraints manual (#22594) --- .../engine/containers/resource_constraints.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/manuals/engine/containers/resource_constraints.md b/content/manuals/engine/containers/resource_constraints.md index 09e04a4a37e4..5f9efc616eba 100644 --- a/content/manuals/engine/containers/resource_constraints.md +++ b/content/manuals/engine/containers/resource_constraints.md @@ -69,8 +69,8 @@ You can mitigate the risk of system instability due to OOME by: Docker can enforce hard or soft memory limits. -- Hard limits lets the container use no more than a fixed amount of memory. -- Soft limits lets the container use as much memory as it needs unless certain +- Hard limits let the container use no more than a fixed amount of memory. +- Soft limits let the container use as much memory as it needs unless certain conditions are met, such as when the kernel detects low memory or contention on the host machine. @@ -162,7 +162,7 @@ a container. Consider the following scenarios: an OOM error. If the kernel memory limit is higher than the user memory limit, the kernel limit doesn't cause the container to experience an OOM. -When you enable kernel memory limits, the host machine tracks "high water mark" +When you enable kernel memory limits, the host machine tracks the "high water mark" statistics on a per-process basis, so you can track which processes (in this case, containers) are using excess memory. This can be seen per process by viewing `/proc//status` on the host machine. @@ -186,7 +186,7 @@ the container's cgroup on the host machine. | :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `--cpus=` | Specify how much of the available CPU resources a container can use. For instance, if the host machine has two CPUs and you set `--cpus="1.5"`, the container is guaranteed at most one and a half of the CPUs. This is the equivalent of setting `--cpu-period="100000"` and `--cpu-quota="150000"`. | | `--cpu-period=` | Specify the CPU CFS scheduler period, which is used alongside `--cpu-quota`. Defaults to 100000 microseconds (100 milliseconds). Most users don't change this from the default. For most use-cases, `--cpus` is a more convenient alternative. | -| `--cpu-quota=` | Impose a CPU CFS quota on the container. The number of microseconds per `--cpu-period` that the container is limited to before throttled. As such acting as the effective ceiling. For most use-cases, `--cpus` is a more convenient alternative. | +| `--cpu-quota=` | Impose a CPU CFS quota on the container. The number of microseconds per `--cpu-period` that the container is limited to before being throttled. As such acting as the effective ceiling. For most use-cases, `--cpus` is a more convenient alternative. | | `--cpuset-cpus` | Limit the specific CPUs or cores a container can use. A comma-separated list or hyphen-separated range of CPUs a container can use, if you have more than one CPU. The first CPU is numbered 0. A valid value might be `0-3` (to use the first, second, third, and fourth CPU) or `1,3` (to use the second and fourth CPU). | | `--cpu-shares` | Set this flag to a value greater or less than the default of 1024 to increase or reduce the container's weight, and give it access to a greater or lesser proportion of the host machine's CPU cycles. This is only enforced when CPU cycles are constrained. When plenty of CPU cycles are available, all containers use as much CPU as they need. In that way, this is a soft limit. `--cpu-shares` doesn't prevent containers from being scheduled in Swarm mode. It prioritizes container CPU resources for the available CPU cycles. It doesn't guarantee or reserve any specific CPU access. | @@ -234,7 +234,7 @@ for real-time tasks per runtime period. For instance, with the default period of containers using the real-time scheduler can run for 950000 microseconds for every 1000000-microsecond period, leaving at least 50000 microseconds available for non-real-time tasks. To make this configuration permanent on systems which use -`systemd`, create a systemd unit file for the `docker` service. For an example, +`systemd`, create a systemd unit file for the `docker` service. For example, see the instruction on how to configure the daemon to use a proxy with a [systemd unit file](../daemon/proxy.md#systemd-unit-file). @@ -343,6 +343,6 @@ environment variables. More information on valid variables can be found in the [nvidia-container-toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/docker-specialized.html) documentation. These variables can be set in a Dockerfile. -You can also use CUDA images which sets these variables automatically. See the +You can also use CUDA images, which set these variables automatically. See the official [CUDA images](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda) NGC catalog page. From ca0334a1dd4d459637c2b9d8210b5f5eb6c4f031 Mon Sep 17 00:00:00 2001 From: george Date: Tue, 6 May 2025 19:33:19 +0200 Subject: [PATCH 368/699] add build number --- content/manuals/desktop/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/desktop/release-notes.md b/content/manuals/desktop/release-notes.md index 3a3a5550bd52..48295917df0b 100644 --- a/content/manuals/desktop/release-notes.md +++ b/content/manuals/desktop/release-notes.md @@ -33,7 +33,7 @@ For more frequently asked questions, see the [FAQs](/manuals/desktop/troubleshoo {{< release-date date="2025-05-06" >}} -{{< desktop-install-v2 all=true beta_win_arm=true version="4.41.2" build_path="/TODO/" >}} +{{< desktop-install-v2 all=true beta_win_arm=true version="4.41.2" build_path="/191736/" >}} ### Bug fixes and enhancements From c8183564d2a9a4f422f6e69a7ea294b5911fe642 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Wed, 7 May 2025 10:39:54 +0300 Subject: [PATCH 369/699] Merge pull request #22553 from duffuniverse/fix-typos-in-use-compose-watch-manual Fix typos in the Use Compose Watch manual --- content/manuals/compose/how-tos/file-watch.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/manuals/compose/how-tos/file-watch.md b/content/manuals/compose/how-tos/file-watch.md index 5cef4963916e..e59386d267eb 100644 --- a/content/manuals/compose/how-tos/file-watch.md +++ b/content/manuals/compose/how-tos/file-watch.md @@ -31,8 +31,8 @@ Compose supports sharing a host directory inside service containers. Watch mode More importantly, `watch` allows for greater granularity than is practical with a bind mount. Watch rules let you ignore specific files or entire directories within the watched tree. For example, in a JavaScript project, ignoring the `node_modules/` directory has two benefits: -* Performance. File trees with many small files can cause high I/O load in some configurations -* Multi-platform. Compiled artifacts cannot be shared if the host OS or architecture is different to the container +* Performance. File trees with many small files can cause a high I/O load in some configurations +* Multi-platform. Compiled artifacts cannot be shared if the host OS or architecture is different from the container For example, in a Node.js project, it's not recommended to sync the `node_modules/` directory. Even though JavaScript is interpreted, `npm` packages can contain native code that is not portable across platforms. @@ -88,12 +88,12 @@ If `action` is set to `rebuild`, Compose automatically builds a new image with B The behavior is the same as running `docker compose up --build `. -Rebuild is ideal for compiled languages or as fallbacks for modifications to particular files that require a full +Rebuild is ideal for compiled languages or as a fallback for modifications to particular files that require a full image rebuild (e.g. `package.json`). #### Sync + Restart -If `action` is set to `sync+restart`, Compose synchronizes your changes with the service containers and restarts it. +If `action` is set to `sync+restart`, Compose synchronizes your changes with the service containers and restarts them. `sync+restart` is ideal when the config file changes, and you don't need to rebuild the image but just restart the main process of the service containers. It will work well when you update a database configuration or your `nginx.conf` file, for example. From 8d9f59ce1d7f8295faed33e48ee573a58e9250e8 Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Thu, 1 May 2025 10:59:07 +0100 Subject: [PATCH 370/699] Update warning about ports published to 127.0.0.1 Fixed in 28.0.0 - aligning with packet-filtering-firewalls.md. Signed-off-by: Rob Murray --- content/manuals/engine/network/_index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/manuals/engine/network/_index.md b/content/manuals/engine/network/_index.md index 048834851b57..97583dfe8af1 100644 --- a/content/manuals/engine/network/_index.md +++ b/content/manuals/engine/network/_index.md @@ -160,8 +160,8 @@ Here are some examples: > > > [!WARNING] > > -> > Hosts within the same L2 segment (for example, hosts connected to the same -> > network switch) can reach ports published to localhost. +> > In releases older than 28.0.0, hosts within the same L2 segment (for example, +> > hosts connected to the same network switch) can reach ports published to localhost. > > For more information, see > > [moby/moby#45610](https://github.com/moby/moby/issues/45610) From 942475214bb055e6c42aeaa9d81a99aa8cf77f4b Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Wed, 7 May 2025 14:54:40 +0100 Subject: [PATCH 371/699] Update text about direct routing Since 28.0.0, direct access to container ports from outside the host has been blocked. Signed-off-by: Rob Murray --- .../manuals/engine/network/packet-filtering-firewalls.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/manuals/engine/network/packet-filtering-firewalls.md b/content/manuals/engine/network/packet-filtering-firewalls.md index cc935a2ebaf0..99f28b38df99 100644 --- a/content/manuals/engine/network/packet-filtering-firewalls.md +++ b/content/manuals/engine/network/packet-filtering-firewalls.md @@ -234,14 +234,14 @@ $ docker run --network=mynet -p 8080:80 myimage ``` Then: -- Only container port 80 will be open, for IPv4 and IPv6. It is accessible - from anywhere, if there is routing to the container's address, and access - is not blocked by the host's firewall. +- Only container port 80 will be open, for IPv4 and IPv6. - For IPv6, using `routed` mode, port 80 will be open on the container's IP address. Port 8080 will not be opened on the host's IP addresses, and outgoing packets will use the container's IP address. - For IPv4, using the default `nat` mode, the container's port 80 will be - accessible via port 8080 on the host's IP addresses, as well as directly. + accessible via port 8080 on the host's IP addresses, as well as directly + from within the Docker host. But, container port 80 cannot be accessed + directly from outside the host. Connections originating from the container will masquerade, using the host's IP address. From a461224f1c52f3bfe5c87a71596794430d4dea9b Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Wed, 7 May 2025 14:20:28 -0400 Subject: [PATCH 372/699] security: domain management (#22477) ## Description - Adds Domain management guide separate from Domain audit (open to discussing where else to put this) - Adds steps to add and verify a domain, removing mention of SSO ## Related issues or tickets - https://docker.atlassian.net/browse/ENGDOCS-2543 ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- .../security/for-admins/domain-management.md | 158 ++++++++++++++++++ data/summary.yaml | 3 + 2 files changed, 161 insertions(+) create mode 100644 content/manuals/security/for-admins/domain-management.md diff --git a/content/manuals/security/for-admins/domain-management.md b/content/manuals/security/for-admins/domain-management.md new file mode 100644 index 000000000000..8a2e99a454fa --- /dev/null +++ b/content/manuals/security/for-admins/domain-management.md @@ -0,0 +1,158 @@ +--- +description: Learn how to manage domains and users in the Admin Console +keywords: domain management, security, identify users, manage users +title: Domain management +weight: 55 +--- + +{{< summary-bar feature_name="Domain management" >}} + +Domain management lets you add and verify domains, and enable +auto-provisioning for users. Auto-provisioning adds users to your +organization when they sign in with an email address that matches a verified +domain. + +This simplifies user management, ensures consistent security settings, and +reduces the risk of unmanaged users accessing Docker without visibility +or control. + +## Add a domain + +1. Sign in to the [Admin Console](https://admin.docker.com/). +2. Select your organization or company from the **Choose profile** page. +If your organization is part of a company, select the company +and configure the domain for the organization at the company level. +3. Under **Security and access**, select **Domain management**. +4. Select **Add a domain**. +5. Enter your domain and select **Add domain**. +6. In the pop-up modal, copy the **TXT Record Value** to verify your domain. + +## Verify a domain + +Verifying your domain confirms that you own it. To verify, add a TXT record to +your Domain Name System (DNS) host using the value provided by Docker. This +value proves ownership and instructs your DNS to publish the record. + +It can take up to 72 hours for the DNS change to propagate. Docker automatically +checks for the record and confirms ownership once the change is recognized. + +Follow your DNS provider’s documentation to add the **TXT Record Value**. If +your provider isn't listed, use the steps for other providers. + +> [!TIP] +> +> The record name field determines where the TXT record is added in your domain +(root or subdomain). In general, refer to the following tips for +adding a record name: +> +> - Use `@` or leave the record name empty for root domains like `example.com`, +depending on your provider. +> - Don't enter values like `docker`, `docker-verification`, `www`, or your +domain name. These values may direct to the wrong place. +> +> Check your DNS provider's documentation to verify record name requirements. + +{{< tabs >}} +{{< tab name="AWS Route 53" >}} + +1. To add your TXT record to AWS, see [Creating records by using the Amazon Route 53 console](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-creating.html). +2. TXT record verification can take 72 hours. Once you have waited for +TXT record verification, return to the **Domain management** page of the +[Admin Console](https://app.docker.com/admin) and select **Verify** next to +your domain name. + +{{< /tab >}} +{{< tab name="Google Cloud DNS" >}} + +1. To add your TXT record to Google Cloud DNS, see [Verifying your domain with a TXT record](https://cloud.google.com/identity/docs/verify-domain-txt). +2. TXT record verification can take 72 hours. Once you have waited for TXT +record verification, return to the **Domain management** page of the +[Admin Console](https://app.docker.com/admin) and select **Verify** next to +your domain name. + +{{< /tab >}} +{{< tab name="GoDaddy" >}} + +1. To add your TXT record to GoDaddy, see [Add a TXT record](https://www.godaddy.com/help/add-a-txt-record-19232). +2. TXT record verification can take 72 hours. Once you have waited for TXT +record verification, return to the **Domain management** page of the +[Admin Console](https://app.docker.com/admin) and select **Verify** next to your +domain name. + +{{< /tab >}} +{{< tab name="Other providers" >}} + +1. Sign in to your domain host. +2. Add a TXT record to your DNS settings and save the record. +3. TXT record verification can take 72 hours. Once you have waited for TXT +record verification, return to the **Domain management** page of the +[Admin Console](https://app.docker.com/admin) and select **Verify** next to +your domain name. + +{{< /tab >}} +{{< /tabs >}} + +## Delete a domain + +Deleting a domain removes the assigned TXT record value. To delete a domain: + +1. Sign in to the [Admin Console](https://admin.docker.com/). +2. Select your organization or company from the **Choose profile** page. +If your organization is part of a company, select the company +and configure the domain for the organization at the company level. +3. Under **Security and access**, select **Domain management**. +4. For the domain you want to delete, section the **Actions** menu, then +**Delete domain**. +5. To confirm, select **Delete domain** in the pop-up modal. + +## Auto-provisioning + +You must add and verify a domain before enabling auto-provisioning. This +confirms your organization owns the domain. Once a domain is verified, +Docker can automatically associate matching users with your organization. +Auto-provisioning does not require an SSO connection. + +> [!IMPORTANT] +> +> For domains that are part of an SSO connection, Just-in-Time (JIT) overrides +auto-provisioning to add users to an organization. + +### How it works + +When auto-provisioning is enabled for a verified domain, the next time a user +signs into Docker with an email address that is associated with your verified +domain, they are automatically added to your organization. Auto-provisioning +does not create accounts for new users, it adds existing unassociated users to +your organization. Users will *not* experience any sign in or user experience +changes. + +When a new user is auto-provisioned, company and organization owners will +receive an email notifying them that a new user has been added to their +organization. If you need to add more seats to your organization to +to accomodate new users, see [Manage seats](/manuals/subscription/manage-seats.md). + +### Enable auto-provisioning + +Auto-provisioning is enabled per user. To enable +auto-provisioning: + +1. Open the [Admin Console](https://app.docker.com/admin). +2. Select **Domain management** from the left-hand navigation. +3. Select the **Actions menu** next to the user you want to enable +auto-provisioning for. +4. Select **Enable auto-provisioning**. +5. Optional. If enabling auto-provisioning at the company level, select an +organization for the user. +6. Select **Enable** to confirm. + +The **Auto-provisioning** column will update to **Enabled**. + +### Disable auto-provisioning + +To disable auto-provisioning for a user: + +1. Open the [Admin Console](https://app.docker.com/admin). +2. Select **Domain management** from the left-hand navigation. +3. Select the **Actions menu** next to your user. +4. Select **Disable auto-provisioning**. +5. Select **Disable**. diff --git a/data/summary.yaml b/data/summary.yaml index 3f5953caf82b..01f870c28e66 100644 --- a/data/summary.yaml +++ b/data/summary.yaml @@ -165,6 +165,9 @@ Docker Scout Mount Permissions: Domain audit: subscription: [Business] for: Administrators +Domain management: + subscription: [Business] + for: Administrators Enforce sign-in: subscription: [Business] for: Administrators From 32c786079d96063145f2190b61cbb8b87970ceca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lio=E6=9D=8E=E6=AD=90?= Date: Thu, 8 May 2025 00:40:11 -0700 Subject: [PATCH 373/699] Update model-runner.md: replace hyphens (#22603) ## Description This makes the resulting env vars `AI_RUNNER_URL` and `AI_RUNNER_MODEL` actually accessible in different languages. ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/compose/how-tos/model-runner.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/content/manuals/compose/how-tos/model-runner.md b/content/manuals/compose/how-tos/model-runner.md index 36d27b2b7eba..2a7fca43ca83 100644 --- a/content/manuals/compose/how-tos/model-runner.md +++ b/content/manuals/compose/how-tos/model-runner.md @@ -33,21 +33,21 @@ services: chat: image: my-chat-app depends_on: - - ai-runner + - ai_runner - ai-runner: + ai_runner: provider: type: model options: model: ai/smollm2 ``` -Notice the dedicated `provider` attribute in the `ai-runner` service. +Notice the dedicated `provider` attribute in the `ai_runner` service. This attribute specifies that the service is a model provider and lets you define options such as the name of the model to be used. There is also a `depends_on` attribute in the `chat` service. -This attribute specifies that the `chat` service depends on the `ai-runner` service. -This means that the `ai-runner` service will be started before the `chat` service to allow injection of model information to the `chat` service. +This attribute specifies that the `chat` service depends on the `ai_runner` service. +This means that the `ai_runner` service will be started before the `chat` service to allow injection of model information to the `chat` service. ## How it works @@ -56,8 +56,8 @@ It also sends Compose the model tag name and the URL to access the model runner. This information is then passed to services which declare a dependency on the model provider. In the example above, the `chat` service receives 2 environment variables prefixed by the service name: - - `AI-RUNNER_URL` with the URL to access the model runner - - `AI-RUNNER_MODEL` with the model name which could be passed with the URL to request the model. + - `AI_RUNNER_URL` with the URL to access the model runner + - `AI_RUNNER_MODEL` with the model name which could be passed with the URL to request the model. This lets the `chat` service to interact with the model and use it for its own purposes. From 751d6681cc9e5599389d266825dda94690c6a78f Mon Sep 17 00:00:00 2001 From: Guillaume Lours <705411+glours@users.noreply.github.com> Date: Thu, 8 May 2025 09:56:01 +0200 Subject: [PATCH 374/699] release-notes for Compose v2.36.0 version (#22600) ## Description Add release notes for Compose version `v2.36.0` ## Related issues or tickets https://docker.atlassian.net/browse/APCLI-1117 ## Reviews - [ ] Technical review - [x] Editorial review - [ ] Product review Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> --- .../v2/docs/reference/compose_build.md | 1 + .../v2/docs/reference/compose_config.md | 2 +- .../docs/reference/docker_compose_build.yaml | 10 ++++++++++ .../docs/reference/docker_compose_config.yaml | 1 - _vendor/modules.txt | 6 +++--- .../manuals/compose/releases/release-notes.md | 19 +++++++++++++++++++ go.mod | 8 ++++---- go.sum | 2 ++ hugo.yaml | 2 +- 9 files changed, 41 insertions(+), 10 deletions(-) diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/compose_build.md b/_vendor/github.com/docker/compose/v2/docs/reference/compose_build.md index 98d573e44c38..5589a46934c6 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/compose_build.md +++ b/_vendor/github.com/docker/compose/v2/docs/reference/compose_build.md @@ -17,6 +17,7 @@ run `docker compose build` to rebuild it. |:----------------------|:--------------|:--------|:------------------------------------------------------------------------------------------------------------| | `--build-arg` | `stringArray` | | Set build-time variables for services | | `--builder` | `string` | | Set builder to use | +| `--check` | `bool` | | Check build configuration | | `--dry-run` | `bool` | | Execute command in dry run mode | | `-m`, `--memory` | `bytes` | `0` | Set memory limit for the build container. Not supported by BuildKit. | | `--no-cache` | `bool` | | Do not use cache when building the image | diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/compose_config.md b/_vendor/github.com/docker/compose/v2/docs/reference/compose_config.md index 9e87efd29cbc..78c1835a5278 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/compose_config.md +++ b/_vendor/github.com/docker/compose/v2/docs/reference/compose_config.md @@ -15,7 +15,7 @@ the canonical format. |:--------------------------|:---------|:--------|:----------------------------------------------------------------------------| | `--dry-run` | `bool` | | Execute command in dry run mode | | `--environment` | `bool` | | Print environment used for interpolation. | -| `--format` | `string` | `yaml` | Format the output. Values: [yaml \| json] | +| `--format` | `string` | | Format the output. Values: [yaml \| json] | | `--hash` | `string` | | Print the service config hash, one per line. | | `--images` | `bool` | | Print the image names, one per line. | | `--no-consistency` | `bool` | | Don't check model consistency - warning: may produce invalid Compose output | diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_build.yaml b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_build.yaml index 3f53dcf73628..1197d5314c47 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_build.yaml +++ b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_build.yaml @@ -33,6 +33,16 @@ options: experimentalcli: false kubernetes: false swarm: false + - option: check + value_type: bool + default_value: "false" + description: Check build configuration + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false - option: compress value_type: bool default_value: "true" diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_config.yaml b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_config.yaml index 15b1e7dc3989..7ec479b2000b 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_config.yaml +++ b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_config.yaml @@ -21,7 +21,6 @@ options: swarm: false - option: format value_type: string - default_value: yaml description: 'Format the output. Values: [yaml | json]' deprecated: false hidden: false diff --git a/_vendor/modules.txt b/_vendor/modules.txt index ca334bf0d1a8..1a4ad2197dfa 100644 --- a/_vendor/modules.txt +++ b/_vendor/modules.txt @@ -1,6 +1,6 @@ # github.com/moby/moby v28.1.0-rc.2+incompatible -# github.com/moby/buildkit v0.21.0 +# github.com/moby/buildkit v0.21.1 # github.com/docker/buildx v0.23.0 -# github.com/docker/cli v28.1.0+incompatible -# github.com/docker/compose/v2 v2.35.1 +# github.com/docker/cli v28.1.1+incompatible +# github.com/docker/compose/v2 v2.36.0 # github.com/docker/scout-cli v1.15.0 diff --git a/content/manuals/compose/releases/release-notes.md b/content/manuals/compose/releases/release-notes.md index b90bed1afe75..a37c97ff2048 100644 --- a/content/manuals/compose/releases/release-notes.md +++ b/content/manuals/compose/releases/release-notes.md @@ -13,6 +13,25 @@ aliases: For more detailed information, see the [release notes in the Compose repo](https://github.com/docker/compose/releases/). +## 2.36.0 + +{{< release-date date="2025-05-07" >}} + +### Bug fixes and enhancements + +- Introduced `networks.interface_name` +- Added support for `COMPOSE_PROGRESS` env variable +- Added `service.provider` to external binaries +- Introduced build `--check` flag +- Fixed multiple panic issues when parsing Compose files + +### Update + +- Dependencies upgrade: bump compose-go to v2.6.2 +- Dependencies upgrade: bump docker engine and cli to v28.1.0 +- Dependencies upgrade: bump containerd to 2.0.5 +- Dependencies upgrade: bump buildkit to v0.21.1 + ## 2.35.1 {{< release-date date="2025-04-17" >}} diff --git a/go.mod b/go.mod index 155f635ef101..26a9c60f1984 100644 --- a/go.mod +++ b/go.mod @@ -6,17 +6,17 @@ toolchain go1.24.1 require ( github.com/docker/buildx v0.23.0 // indirect - github.com/docker/cli v28.1.0+incompatible // indirect - github.com/docker/compose/v2 v2.35.1 // indirect + github.com/docker/cli v28.1.1+incompatible // indirect + github.com/docker/compose/v2 v2.36.0 // indirect github.com/docker/scout-cli v1.15.0 // indirect - github.com/moby/buildkit v0.21.0 // indirect + github.com/moby/buildkit v0.21.1 // indirect github.com/moby/moby v28.1.0-rc.2+incompatible // indirect ) replace ( github.com/docker/buildx => github.com/docker/buildx v0.23.0 github.com/docker/cli => github.com/docker/cli v28.1.0-rc.2+incompatible - github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.35.1 + github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.36.0 github.com/docker/scout-cli => github.com/docker/scout-cli v1.15.0 github.com/moby/buildkit => github.com/moby/buildkit v0.20.0 github.com/moby/moby => github.com/moby/moby v28.1.0-rc.2+incompatible diff --git a/go.sum b/go.sum index e0d9918a4407..8e4053f2ce26 100644 --- a/go.sum +++ b/go.sum @@ -231,6 +231,8 @@ github.com/docker/compose/v2 v2.35.0 h1:bU23OeFrbGyHYrKijMSEwkOeDg2TLhAGntU2F3hw github.com/docker/compose/v2 v2.35.0/go.mod h1:S5ejUILn9KTYC6noX3IxznWu3/sb3FxdZqIYbq4seAk= github.com/docker/compose/v2 v2.35.1 h1:oRt5EE22een6DEAkNNQcuzJGhBS2rcMtEKdbfMhFIgk= github.com/docker/compose/v2 v2.35.1/go.mod h1:Ydd9ceg7VBOPSVAsDDKfyGGAkjejH3cD91GSmHjuRhI= +github.com/docker/compose/v2 v2.36.0 h1:MACSfQ2xqcwgCwAtsHVoQkFbHi2nNfNAsd5EWFg164k= +github.com/docker/compose/v2 v2.36.0/go.mod h1:kFPppTinl2Q0Lv3Dy9titIL41oWYoUkNxoKQZb/lfSU= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= diff --git a/hugo.yaml b/hugo.yaml index 3250af12955a..fb1c962215aa 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -140,7 +140,7 @@ params: # (Used to show e.g., "latest" and "latest"-1 in engine install examples docker_ce_version_prev: "28.1.0" # Latest Docker Compose version - compose_version: "v2.35.1" + compose_version: "v2.36.0" # Latest BuildKit version buildkit_version: "0.21.0" From f6bb42e96de38c4861b85cd1f3e6be7fc1930819 Mon Sep 17 00:00:00 2001 From: Guillaume Lours <705411+glours@users.noreply.github.com> Date: Thu, 8 May 2025 10:02:08 +0200 Subject: [PATCH 375/699] add how-to page explaining usage of Compose provider services (#22586) ## Description Add how-to page for Compose provider services explaining usage and configuration of this new feature allowing extending Compose behaviour ## Related issues or tickets https://docker.atlassian.net/browse/APCLI-1091 ## Reviews - [x] Technical review - [x] Editorial review - [ ] Product review --------- Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> Co-authored-by: Nicolas De loof Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- .../compose/how-tos/provider-services.md | 125 ++++++++++++++++++ data/summary.yaml | 2 + 2 files changed, 127 insertions(+) create mode 100644 content/manuals/compose/how-tos/provider-services.md diff --git a/content/manuals/compose/how-tos/provider-services.md b/content/manuals/compose/how-tos/provider-services.md new file mode 100644 index 000000000000..fa1ddbb3dad7 --- /dev/null +++ b/content/manuals/compose/how-tos/provider-services.md @@ -0,0 +1,125 @@ +--- +title: Use provider services +description: Learn how to use provider services in Docker Compose to integrate external capabilities into your applications +keywords: compose, docker compose, provider, services, platform capabilities, integration, model runner, ai +weight: 112 +params: + sidebar: + badge: + color: green + text: New +--- + +{{< summary-bar feature_name="Compose provider services" >}} + +Docker Compose supports provider services, which allow integration with services whose lifecycles are managed by third-party components rather than by Compose itself. +This feature enables you to define and utilize platform-specific services without the need for manual setup or direct lifecycle management. + + +## What are provider services? + +Provider services are a special type of service in Compose that represents platform capabilities rather than containers. +They allow you to declare dependencies on specific platform features that your application needs. + +When you define a provider service in your Compose file, Compose works with the platform to provision and configure +the requested capability, making it available to your application services. + +## Using provider services + +To use a provider service in your Compose file, you need to: + +1. Define a service with the `provider` attribute +2. Specify the `type` of provider you want to use +3. Configure any provider-specific options +4. Declare dependencies from your application services to the provider service + +Here's a basic example: + +```yaml +services: + database: + provider: + type: awesomecloud + options: + type: mysql + foo: bar + app: + image: myapp + depends_on: + - database +``` + +Notice the dedicated `provider` attribute in the `database` service. +This attribute specifies that the service is managed by a provider and lets you define options specific to that provider type. + +The `depends_on` attribute in the `app` service specifies that it depends on the `database` service. +This means that the `database` service will be started before the `app` service, allowing the provider information +to be injected into the `app` service. + +## How it works + +During the `docker compose up` command execution, Compose identifies services relying on providers and works with them to provision +the requested capabilities. The provider then populates Compose model with information about how to access the provisioned resource. + +This information is passed to services that declare a dependency on the provider service, typically through environment +variables. The naming convention for these variables is: + +```env +<>_<> +``` + +For example, if your provider service is named `database`, your application service might receive environment variables like: + +- `DATABASE_URL` with the URL to access the provisioned resource +- `DATABASE_TOKEN` with an authentication token +- Other provider-specific variables + +Your application can then use these environment variables to interact with the provisioned resource. + +## Provider types + +The `type` field in a provider service references the name of either: + +1. A Docker CLI plugin (e.g., `docker-model`) +2. A binary available in the user's PATH + +When Compose encounters a provider service, it looks for a plugin or binary with the specified name to handle the provisioning of the requested capability. + +For example, if you specify `type: model`, Compose will look for a Docker CLI plugin named `docker-model` or a binary named `model` in the PATH. + +```yaml +services: + ai-runner: + provider: + type: model # Looks for docker-model plugin or model binary + options: + model: ai/example-model +``` + +The plugin or binary is responsible for: + +1. Interpreting the options provided in the provider service +2. Provisioning the requested capability +3. Returning information about how to access the provisioned resource + +This information is then passed to dependent services as environment variables. + +## Benefits of using provider services + +Using provider services in your Compose applications offers several benefits: + +1. Simplified configuration: You don't need to manually configure and manage platform capabilities +2. Declarative approach: You can declare all your application's dependencies in one place +3. Consistent workflow: You use the same Compose commands to manage your entire application, including platform capabilities + +## Creating your own provider + +If you want to create your own provider to extend Compose with custom capabilities, you can implement a Compose plugin that registers provider types. + +For detailed information on how to create and implement your own provider, refer to the [Compose Extensions documentation](https://github.com/docker/compose/blob/main/docs/extension.md). +This guide explains the extension mechanism that allows you to add new provider types to Compose. + +## Reference + +- [Docker Model Runner documentation](/manuals/ai/model-runner.md) +- [Compose Extensions documentation](https://github.com/docker/compose/blob/main/docs/extension.md) \ No newline at end of file diff --git a/data/summary.yaml b/data/summary.yaml index 01f870c28e66..5246f3899d9f 100644 --- a/data/summary.yaml +++ b/data/summary.yaml @@ -109,6 +109,8 @@ Compose model runner: requires: Docker Compose [2.35.0](/manuals/compose/releases/release-notes.md#2300) and later, and Docker Desktop 4.41 and later Compose OCI artifact: requires: Docker Compose [2.34.0](/manuals/compose/releases/release-notes.md#2340) and later +Compose provider services: + requires: Docker Compose [2.36.0](/manuals/compose/releases/release-notes.md) and later Compose replace file: requires: Docker Compose [2.24.4](/manuals/compose/releases/release-notes.md#2244) and later Compose required: From bc1386108b618b72514d5d1b46eca728c507c014 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Thu, 8 May 2025 16:09:16 +0100 Subject: [PATCH 376/699] ENGDOCS-2595 (#22530) ## Description Adds docs on DD on Microsoft Dev Box ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Co-authored-by: Sarah Sanders --- content/manuals/desktop/features/dev-box.md | 55 +++++++++++++++++++++ content/manuals/desktop/setup/vm-vdi.md | 4 ++ 2 files changed, 59 insertions(+) create mode 100644 content/manuals/desktop/features/dev-box.md diff --git a/content/manuals/desktop/features/dev-box.md b/content/manuals/desktop/features/dev-box.md new file mode 100644 index 000000000000..31f7b7822cd9 --- /dev/null +++ b/content/manuals/desktop/features/dev-box.md @@ -0,0 +1,55 @@ +--- +Title: Docker Desktop in Microsoft Dev Box +description: Learn about the benefits of and how to setup Docker Desktop in Microsoft Dev Box +keywords: desktop, docker, windows, microsoft dev box +--- + +Docker Desktop is available as a pre-configured image in the Microsoft Azure Marketplace for use with Microsoft Dev Box, allowing developers to quickly set up consistent development environments in the cloud. + +Microsoft Dev Box provides cloud-based, pre-configured developer workstations that allow you to code, build, and test applications without configuring a local development environment. The Docker Desktop image for Microsoft Dev Box comes with Docker Desktop and its dependencies pre-installed, giving you a ready-to-use containerized development environment. + +## Key benefits + +- Pre-configured environment: Docker Desktop, WSL2, and other requirements come pre-installed and configured +- Consistent development: Ensure all team members work with the same Docker environment +- Powerful resources: Access more compute power and storage than might be available on local machines +- State persistence: Dev Box maintains your state between sessions, similar to hibernating a local machine +- Seamless licensing: Use your existing Docker subscription or purchase a new one directly through Azure Marketplace + +## Setup + +### Prerequisites + +- An Azure subscription +- Access to Microsoft Dev Box +- A Docker subscription (Pro, Team, or Business). You can use Docker Desktop in Microsoft Dev Box with any of the following subscription options: + - An existing or new Docker subscription + - A new Docker subscription purchased through Azure Marketplace + - A Docker Business subscription with SSO configured for your organization + +### Set up Docker Desktop in Dev Box + +1. Navigate to the [Docker Desktop for Microsoft Dev Box](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/dockerinc1694120899427.devbox_azuremachine?tab=Overview) listing in Azure Marketplace. +2. Select **Get It Now** to add the virtual machine image to your subscription. +3. Follow the Azure workflow to complete the setup. +4. Use the image to create VMs, assign to Dev Centers, or create Dev Box Pools according to your organization's setup. + +### Activate Docker Desktop + +Once your Dev Box is provisioned with the Docker Desktop image: + +1. Start your Dev Box instance. +2. Launch Docker Desktop. +3. Sign in with your Docker ID. + +## Support + +For issues related to: + +- Docker Desktop configuration, usage, or licensing: Create a support ticket through [Docker Support](https://hub.docker.com/support). +- Dev Box creation, Azure portal configuration, or networking: Contact Azure Support. + +## Limitations + +- Microsoft Dev Box is currently only available on Windows 10 and 11 (Linux VMs are not supported). +- Performance may vary based on your Dev Box configuration and network conditions. diff --git a/content/manuals/desktop/setup/vm-vdi.md b/content/manuals/desktop/setup/vm-vdi.md index 37333024258e..b51978247761 100644 --- a/content/manuals/desktop/setup/vm-vdi.md +++ b/content/manuals/desktop/setup/vm-vdi.md @@ -64,3 +64,7 @@ Docker Desktop follows the VDI support definitions outlined [previously](#virtua ### Support scope and responsibilities For WSL 2-related issues, contact Nutanix support. For Docker Desktop-specific issues, contact Docker support. + +## Aditional resources + +- [Docker Desktop on Microsoft Dev Box](/manuals/desktop/features/dev-box.md) \ No newline at end of file From 371f608c031436ba78f83cabdcec0a474b8e49aa Mon Sep 17 00:00:00 2001 From: Cesar Talledo Date: Thu, 8 May 2025 14:18:59 -0700 Subject: [PATCH 377/699] Expand documentation on the KubernetesImagesRepository setting. (#22589) ## Description Provide our users more help on this setting. Place the info in the Kubernetes feature section, and link to it from the admin-settings description for KubernetesImagesRepository. ## Reviews - [ ] Technical review - [X] Editorial review - [ ] Product review Signed-off-by: Cesar Talledo --- .../manuals/desktop/features/kubernetes.md | 106 ++++++++++++++++-- .../configure-json-file.md | 6 +- 2 files changed, 101 insertions(+), 11 deletions(-) diff --git a/content/manuals/desktop/features/kubernetes.md b/content/manuals/desktop/features/kubernetes.md index 1a7f77313e15..6319a7955a2e 100644 --- a/content/manuals/desktop/features/kubernetes.md +++ b/content/manuals/desktop/features/kubernetes.md @@ -81,14 +81,6 @@ The following table summarizes this comparison. | Works with containerd image store | Yes | Yes | | Works with Docker image store | Yes | No | -### Additional settings - -#### Viewing system containers - -By default, Kubernetes system containers are hidden. To inspect these containers, enable **Show system containers (advanced)**. - -You can now view the running Kubernetes containers with `docker ps` or in the Docker Desktop Dashboard. - ## Using the kubectl command Kubernetes integration automatically installs the Kubernetes CLI command @@ -131,6 +123,104 @@ For more information about `kubectl`, see the Kubernetes clusters are not automatically upgraded with Docker Desktop updates. To upgrade the cluster, you must manually select **Reset Kubernetes Cluster** in settings. +## Additional settings + +### Viewing system containers + +By default, Kubernetes system containers are hidden. To inspect these containers, enable **Show system containers (advanced)**. + +You can now view the running Kubernetes containers with `docker ps` or in the Docker Desktop Dashboard. + +### Configuring a custom image registry for Kubernetes control plane images + +Docker Desktop uses containers to run the Kubernetes control plane. By default, Docker Desktop pulls +the associated container images from Docker Hub. The images pulled depend on the [cluster provisioning mode](#cluster-provisioning-method). + +For example, in `kind` mode it requires the following images: + +```console +docker.io/kindest/node: +docker.io/docker/desktop-cloud-provider-kind: +docker.io/docker/desktop-containerd-registry-mirror: +``` + +In `kubeadm` mode it requires the following images: + +```console +docker.io/registry.k8s.io/kube-controller-manager: +docker.io/registry.k8s.io/kube-apiserver: +docker.io/registry.k8s.io/kube-scheduler: +docker.io/registry.k8s.io/kube-proxy +docker.io/registry.k8s.io/etcd: +docker.io/registry.k8s.io/pause: +docker.io/registry.k8s.io/coredns/coredns: +docker.io/docker/desktop-storage-provisioner: +docker.io/docker/desktop-vpnkit-controller: +docker.io/docker/desktop-kubernetes: +``` + +The image tags are automatically selected by Docker Desktop based on several +factors, including the version of Kubernetes being used. The tags vary for each image. + +To accommodate scenarios where access to Docker Hub is not allowed, admins can +configure Docker Desktop to pull the above listed images from a different registry (e.g., a mirror) +using the [KubernetesImagesRepository](../../security/for-admins/hardened-desktop/settings-management/configure-json-file.md#kubernetes) setting as follows. + +An image name can be broken into `[registry[:port]/][namespace/]repository[:tag]` components. +The `KubernetesImagesRepository` setting allows users to override the `[registry[:port]/][namespace]` +portion of the image's name. + +For example, if Docker Desktop Kubernetes is configured in `kind` mode and +`KubernetesImagesRepository` is set to `my-registry:5000/kind-images`, then +Docker Desktop will pull the images from: + +```console +my-registry:5000/kind-images/node: +my-registry:5000/kind-images/desktop-cloud-provider-kind: +my-registry:5000/kind-images/desktop-containerd-registry-mirror: +``` + +These images should be cloned/mirrored from their respective images in Docker Hub. The tags must +also match what Docker Desktop expects. + +The recommended approach to set this up is the following: + +1) Start Docker Desktop. + +2) In Settings > Kubernetes, enable the *Show system containers* setting. + +3) In Settings > Kubernetes, start Kubernetes using the desired cluster provisioning method: `kubeadm` or `kind`. + +4) Wait for Kubernetes to start. + +5) Use `docker ps` to view the container images used by Docker Desktop for the Kubernetes control plane. + +6) Clone or mirror those images (with matching tags) to your custom registry. + +7) Stop the Kubernetes cluster. + +8) Configure the `KubernetesImagesRepository` setting to point to your custom registry. + +9) Restart Docker Desktop. + +10) Verify that the Kubernetes cluster is using the custom registry images using the `docker ps` command. + +> [!NOTE] +> +> The `KubernetesImagesRepository` setting only applies to control plane images used by Docker Desktop +> to set up the Kubernetes cluster. It has no effect on other Kubernetes pods. + +> [!NOTE] +> +> When using `KubernetesImagesRepository` and [Enhanced Container Isolation (ECI)](../../security/for-admins/hardened-desktop/enhanced-container-isolation/_index.md) +> is enabled, add the following images to the [ECI Docker socket mount image list](../../security/for-admins/hardened-desktop/settings-management/configure-json-file.md#enhanced-container-isolation): +> +> * [imagesRepository]/desktop-cloud-provider-kind:* +> * [imagesRepository]/desktop-containerd-registry-mirror:* +> +> These containers mount the Docker socket, so you must add the images to the ECI images list. If not, +> ECI will block the mount and Kubernetes won't start. + ## Troubleshooting - If Kubernetes fails to start, make sure Docker Desktop is running with enough allocated resources. Check **Settings** > **Resources**. diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md index 0096692d5a89..f6856d85c66e 100644 --- a/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md @@ -264,14 +264,14 @@ The following `admin-settings.json` code and table provides an example of the re |Parameter|OS|Description|Version| |:-------------------------------|---|:-------------------------------|---| -|`kubernetes`| | If `enabled` is set to true, a Kubernetes single-node cluster is started when Docker Desktop starts. If `showSystemContainers` is set to true, Kubernetes containers are displayed in the Docker Desktop Dashboard and when you run `docker ps`. `imagesRepository` lets you specify which repository Docker Desktop pulls the Kubernetes images from. For example, `"imagesRepository": "registry-1.docker.io/docker"`. | | +|`kubernetes`| | If `enabled` is set to true, a Kubernetes single-node cluster is started when Docker Desktop starts. If `showSystemContainers` is set to true, Kubernetes containers are displayed in the Docker Desktop Dashboard and when you run `docker ps`. The [imagesRepository](../../../../desktop/features/kubernetes.md#configuring-a-custom-image-registry-for-kubernetes-control-plane-images) setting lets you specify which repository Docker Desktop pulls control-plane Kubernetes images from. | | > [!NOTE] > > When using the `imagesRepository` setting and Enhanced Container Isolation (ECI), add the following images to the [ECI Docker socket mount image list](#enhanced-container-isolation): > -> `/desktop-cloud-provider-kind:*` -> `/desktop-containerd-registry-mirror:*` +> * [imagesRepository]/desktop-cloud-provider-kind:* +> * [imagesRepository]/desktop-containerd-registry-mirror:* > > These containers mount the Docker socket, so you must add the images to the ECI images list. If not, ECI will block the mount and Kubernetes won't start. From a9c38b6471e467bb2e0d01a230d5b3893a6876c7 Mon Sep 17 00:00:00 2001 From: "Dr. Matt Lee" Date: Fri, 9 May 2025 10:14:25 -0400 Subject: [PATCH 378/699] Merge pull request #22610 from mattl/patch-1 Update what-is-a-container.md --- .../docker-concepts/the-basics/what-is-a-container.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/get-started/docker-concepts/the-basics/what-is-a-container.md b/content/get-started/docker-concepts/the-basics/what-is-a-container.md index 89af955717ed..aeedde7fbd20 100644 --- a/content/get-started/docker-concepts/the-basics/what-is-a-container.md +++ b/content/get-started/docker-concepts/the-basics/what-is-a-container.md @@ -84,7 +84,7 @@ This container runs a web server that displays a simple website. When working wi When you launched the container, you exposed one of the container's ports onto your machine. Think of this as creating configuration to let you to connect through the isolated environment of the container. -For this container, the frontend is accessible on port `8080`. To open the website, select the link in the **Port(s)** column of your container or visit [http://localhost:8080](https://localhost:8080) in your browser. +For this container, the frontend is accessible on port `8080`. To open the website, select the link in the **Port(s)** column of your container or visit [http://localhost:8080](http://localhost:8080) in your browser. ![Screenshot of the landing page coming from the running container](images/access-the-frontend.webp?border) From d03288ea1d889ab353898b16ae32f7fb949e3dca Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Fri, 9 May 2025 15:49:21 -0400 Subject: [PATCH 379/699] dd: update Windows Arm to EA (#22613) ## Description - Windows Arm is in EA not Beta ## Related issues or tickets - Request in #team-docs channel from @KatTomrushka ## Reviews - [ ] Editorial review --- content/manuals/desktop/setup/install/windows-install.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/manuals/desktop/setup/install/windows-install.md b/content/manuals/desktop/setup/install/windows-install.md index 259eab642863..1bb4e86bb2ec 100644 --- a/content/manuals/desktop/setup/install/windows-install.md +++ b/content/manuals/desktop/setup/install/windows-install.md @@ -32,7 +32,7 @@ This page provides download links, system requirements, and step-by-step install {{< button text="Docker Desktop for Windows - x86_64" url="https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-win-amd64" >}} {{< button text="Docker Desktop for Windows - x86_64 on the Microsoft Store" url="https://apps.microsoft.com/detail/xp8cbj40xlbwkx?hl=en-GB&gl=GB" >}} -{{< button text="Docker Desktop for Windows - Arm (Beta)" url="https://desktop.docker.com/win/main/arm64/Docker%20Desktop%20Installer.exe?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-win-arm64" >}} +{{< button text="Docker Desktop for Windows - Arm (Early Access)" url="https://desktop.docker.com/win/main/arm64/Docker%20Desktop%20Installer.exe?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-win-arm64" >}} _For checksums, see [Release notes](/manuals/desktop/release-notes.md)_ @@ -95,7 +95,7 @@ For more information on setting up WSL 2 with Docker Desktop, see [WSL](/manuals > Windows Home or Education editions only allow you to run Linux containers. {{< /tab >}} -{{< tab name="WSL 2 backend, Arm (Beta)" >}} +{{< tab name="WSL 2 backend, Arm (Early Access)" >}} - WSL version 1.1.3.0 or later. - Windows 11 64-bit: Home or Pro version 22H2 or higher, or Enterprise or Education version 22H2 or higher. From 778b2184efe090ede0ce3a2fb070eb72833e19a9 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Mon, 12 May 2025 13:41:26 +0200 Subject: [PATCH 380/699] build: image-manifest enabled by default for cache export Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- content/manuals/build/cache/backends/_index.md | 3 +++ content/manuals/build/cache/backends/local.md | 4 ++-- content/manuals/build/cache/backends/registry.md | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/content/manuals/build/cache/backends/_index.md b/content/manuals/build/cache/backends/_index.md index de54ea0f6cec..3606910a44dd 100644 --- a/content/manuals/build/cache/backends/_index.md +++ b/content/manuals/build/cache/backends/_index.md @@ -179,3 +179,6 @@ $ docker buildx build --push -t / \ --cache-to type=registry,ref=/,oci-mediatypes=true,image-manifest=true \ --cache-from type=registry,ref=/ . ``` + +> [!NOTE] +> Since BuildKit v0.21, `image-manifest` is enabled by default. diff --git a/content/manuals/build/cache/backends/local.md b/content/manuals/build/cache/backends/local.md index 5d033bf27549..69f32107c3d5 100644 --- a/content/manuals/build/cache/backends/local.md +++ b/content/manuals/build/cache/backends/local.md @@ -25,13 +25,13 @@ The following table describes the available CSV parameters that you can pass to `--cache-to` and `--cache-from`. | Name | Option | Type | Default | Description | -| ------------------- | ------------ | ----------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------- | +|---------------------|--------------|-------------------------|---------|---------------------------------------------------------------------------------------------------------------------------------| | `src` | `cache-from` | String | | Path of the local directory where cache gets imported from. | | `digest` | `cache-from` | String | | Digest of manifest to import, see [cache versioning][4]. | | `dest` | `cache-to` | String | | Path of the local directory where cache gets exported to. | | `mode` | `cache-to` | `min`,`max` | `min` | Cache layers to export, see [cache mode][1]. | | `oci-mediatypes` | `cache-to` | `true`,`false` | `true` | Use OCI media types in exported manifests, see [OCI media types][2]. | -| `image-manifest` | `cache-to` | `true`,`false` | `false` | When using OCI media types, generate an image manifest instead of an image index for the cache image, see [OCI media types][2]. | +| `image-manifest` | `cache-to` | `true`,`false` | `true` | When using OCI media types, generate an image manifest instead of an image index for the cache image, see [OCI media types][2]. | | `compression` | `cache-to` | `gzip`,`estargz`,`zstd` | `gzip` | Compression type, see [cache compression][3]. | | `compression-level` | `cache-to` | `0..22` | | Compression level, see [cache compression][3]. | | `force-compression` | `cache-to` | `true`,`false` | `false` | Forcibly apply compression, see [cache compression][3]. | diff --git a/content/manuals/build/cache/backends/registry.md b/content/manuals/build/cache/backends/registry.md index 9a4ff0d1a027..ce9a7d4ee0e3 100644 --- a/content/manuals/build/cache/backends/registry.md +++ b/content/manuals/build/cache/backends/registry.md @@ -37,11 +37,11 @@ The following table describes the available CSV parameters that you can pass to `--cache-to` and `--cache-from`. | Name | Option | Type | Default | Description | -| ------------------- | ----------------------- | ----------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------- | +|---------------------|-------------------------|-------------------------|---------|---------------------------------------------------------------------------------------------------------------------------------| | `ref` | `cache-to`,`cache-from` | String | | Full name of the cache image to import. | | `mode` | `cache-to` | `min`,`max` | `min` | Cache layers to export, see [cache mode][1]. | | `oci-mediatypes` | `cache-to` | `true`,`false` | `true` | Use OCI media types in exported manifests, see [OCI media types][2]. | -| `image-manifest` | `cache-to` | `true`,`false` | `false` | When using OCI media types, generate an image manifest instead of an image index for the cache image, see [OCI media types][2]. | +| `image-manifest` | `cache-to` | `true`,`false` | `true` | When using OCI media types, generate an image manifest instead of an image index for the cache image, see [OCI media types][2]. | | `compression` | `cache-to` | `gzip`,`estargz`,`zstd` | `gzip` | Compression type, see [cache compression][3]. | | `compression-level` | `cache-to` | `0..22` | | Compression level, see [cache compression][3]. | | `force-compression` | `cache-to` | `true`,`false` | `false` | Forcibly apply compression, see [cache compression][3]. | From ee35407538ceb88b0a455dde0b98bc33f79edece Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Mon, 12 May 2025 15:39:15 +0200 Subject: [PATCH 381/699] Merge pull request #22617 from crazy-max/bake-fix-syntax bake: fix hcl syntax --- content/manuals/build/bake/expressions.md | 2 +- content/manuals/build/bake/targets.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/manuals/build/bake/expressions.md b/content/manuals/build/bake/expressions.md index 71e7ef7de72e..05620f0866cc 100644 --- a/content/manuals/build/bake/expressions.md +++ b/content/manuals/build/bake/expressions.md @@ -62,7 +62,7 @@ target "default" { dockerfile="Dockerfile" tags = [ "my-image:latest", - notequal("",TAG) ? "my-image:${TAG}": "", + notequal("",TAG) ? "my-image:${TAG}": "" ] } ``` diff --git a/content/manuals/build/bake/targets.md b/content/manuals/build/bake/targets.md index 29c6a1d376b6..183eb939e92f 100644 --- a/content/manuals/build/bake/targets.md +++ b/content/manuals/build/bake/targets.md @@ -81,8 +81,8 @@ target "api" { target "tests" { dockerfile = "tests.Dockerfile" contexts = { - webapp = "target:webapp", - api = "target:api", + webapp = "target:webapp" + api = "target:api" } output = ["type=local,dest=build/tests"] context = "." From 71109d5f42b7c5fdbbc78c4528fefcdc36104e5a Mon Sep 17 00:00:00 2001 From: Pradumna Saraf Date: Mon, 12 May 2025 22:18:17 +0530 Subject: [PATCH 382/699] docs: Update incorrect port in Docker Compose the go-prometheus-monitoring guide (#22614) ## Description The app service port is `8000`, and I mistakenly mentioned `8080` for health check while creating this guide. So, it will give an error. - [ ] Technical review - [x] Editorial review - [ ] Product review --- content/guides/go-prometheus-monitoring/compose.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/guides/go-prometheus-monitoring/compose.md b/content/guides/go-prometheus-monitoring/compose.md index dd9763bcd117..499e065759f4 100644 --- a/content/guides/go-prometheus-monitoring/compose.md +++ b/content/guides/go-prometheus-monitoring/compose.md @@ -27,7 +27,7 @@ services: networks: - go-network healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/health"] + test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 5 @@ -163,4 +163,4 @@ Next, you will learn how to develop the Golang application with Docker Compose a ## Next steps -In the next section, you will learn how to develop the Golang application with Docker. You will also learn how to use Docker Compose Watch to rebuild the image whenever you make changes to the code. Lastly, you will test the application and visualize the metrics in Grafana using Prometheus as the data source. \ No newline at end of file +In the next section, you will learn how to develop the Golang application with Docker. You will also learn how to use Docker Compose Watch to rebuild the image whenever you make changes to the code. Lastly, you will test the application and visualize the metrics in Grafana using Prometheus as the data source. From 9b93eb9f3e898a5cb2334ddbeca9609256d968b8 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Mon, 12 May 2025 13:47:02 -0400 Subject: [PATCH 383/699] iam: multiple-idp (#21675) ## Description - Updated SSO configuration/management docs for multiple IdP support - Updated FAQs to clarify that Docker now supports it - Fixed some typos ## Related issues or tickets [ENGDOCS-2358](https://docker.atlassian.net/browse/ENGDOCS-2358) ## Reviews - [ ] Technical review @gurleensethi-docker @ivan-californias @technicallyjosh - [ ] Editorial review - [ ] Product review [ENGDOCS-2358]: https://docker.atlassian.net/browse/ENGDOCS-2358?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- content/manuals/admin/faqs/general-faqs.md | 4 ++-- content/manuals/security/faqs/single-sign-on/idp-faqs.md | 4 ++-- .../security/for-admins/single-sign-on/configure.md | 4 ++++ .../security/for-admins/single-sign-on/connect.md | 9 +++++++-- layouts/shortcodes/admin-sso-management.md | 4 ++++ 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/content/manuals/admin/faqs/general-faqs.md b/content/manuals/admin/faqs/general-faqs.md index 2bd3216269c9..d672c868aa10 100644 --- a/content/manuals/admin/faqs/general-faqs.md +++ b/content/manuals/admin/faqs/general-faqs.md @@ -27,7 +27,7 @@ Additionally, you can't reuse a Docker ID in the future if you deactivate your a ### What if my Docker ID is taken? -All Docker IDs are first-come, first-served except for companies that have a US Trademark on a username. If you have a trademark for your namespace, [Docker Support](https://hub.docker.com/support/contact/) can retrieve the Docker ID for you. +All Docker IDs are first-come, first-served except for companies that have a U.S. Trademark on a username. If you have a trademark for your namespace, [Docker Support](https://hub.docker.com/support/contact/) can retrieve the Docker ID for you. ### What’s an organization? @@ -66,7 +66,7 @@ The organization owner can also add additional owners to help them manage users, ### Can I configure multiple SSO identity providers (IdPs) to authenticate users to a single org? -Docker SSO allows only one IdP configuration per organization. For more +Yes. Docker SSO supports multiple IdP configurations. For more information, see [Configure SSO](../../security/for-admins/single-sign-on/configure/_index.md) and [SSO FAQs](../../security/faqs/single-sign-on/faqs.md). ### What is a service account? diff --git a/content/manuals/security/faqs/single-sign-on/idp-faqs.md b/content/manuals/security/faqs/single-sign-on/idp-faqs.md index 2b456e005540..c5d6416ffa07 100644 --- a/content/manuals/security/faqs/single-sign-on/idp-faqs.md +++ b/content/manuals/security/faqs/single-sign-on/idp-faqs.md @@ -11,7 +11,7 @@ aliases: ### Is it possible to use more than one IdP with Docker SSO? -No. You can only configure Docker SSO to work with a single IdP. A domain can only be associated with a single IdP. Docker supports Entra ID (formerly Azure AD) and identity providers that support SAML 2.0. +Yes. Docker supports multiple IdP configurations. A domain can be associated with multiple IdPs. Docker supports Entra ID (formerly Azure AD) and identity providers that support SAML 2.0. ### Is it possible to change my identity provider after configuring SSO? @@ -57,4 +57,4 @@ Yes, Entra ID (formerly Azure AD) is supported with SSO for Docker Business, bot ### My SSO connection with Entra ID isn't working and I receive an error that the application is misconfigured. How can I troubleshoot this? -Confirm that you've configured the necessary API permissions in Entra ID (formerly Azure AD) for your SSO connection. You need to grant admin consent within your Entra ID (formerly Azure AD) tenant. See [Entra ID (formerly Azure AD) documentation](https://learn.microsoft.com/en-us/azure/active-directory/manage-apps/grant-admin-consent?pivots=portal#grant-admin-consent-in-app-registrations). +Confirm that you've configured the necessary API permissions in Entra ID (formerly Azure AD) for your SSO connection. You need to grant administrator consent within your Entra ID (formerly Azure AD) tenant. See [Entra ID (formerly Azure AD) documentation](https://learn.microsoft.com/en-us/azure/active-directory/manage-apps/grant-admin-consent?pivots=portal#grant-admin-consent-in-app-registrations). diff --git a/content/manuals/security/for-admins/single-sign-on/configure.md b/content/manuals/security/for-admins/single-sign-on/configure.md index b0304d8b6f9b..920f321a6ccd 100644 --- a/content/manuals/security/for-admins/single-sign-on/configure.md +++ b/content/manuals/security/for-admins/single-sign-on/configure.md @@ -18,6 +18,10 @@ Get started creating a single sign-on (SSO) connection for your organization or ## Step one: Add your domain +> [!NOTE] +> +> Docker supports multiple identity provider (IdP) configurations. With a multiple IdP configuration, one domain can be associated with more than one SSO identity provider. + {{< tabs >}} {{< tab name="Admin Console" >}} diff --git a/content/manuals/security/for-admins/single-sign-on/connect.md b/content/manuals/security/for-admins/single-sign-on/connect.md index a5aaf812f76e..04041c66d0e3 100644 --- a/content/manuals/security/for-admins/single-sign-on/connect.md +++ b/content/manuals/security/for-admins/single-sign-on/connect.md @@ -202,15 +202,20 @@ After you've completed the SSO connection process in Docker, we recommend testin 1. Open an incognito browser. 2. Sign in to the Admin Console using your **domain email address**. -3. The browser will redirect to your IdP's login page to authenticate. +3. The browser will redirect to your identity provider's sign in page to authenticate. If you have [multiple IdPs](#optional-configure-multiple-idps), choose the sign sign-in option **Continue with SSO**. 4. Authenticate through your domain email instead of using your Docker ID. You can also test your SSO connection through the command-line interface (CLI). If you want to test through the CLI, your users must have a personal access token (PAT). +## Optional: Configure multiple IdPs + +Docker supports multiple IdP configurations. With multiple IdPs configured, one domain can be associated with multiple SSO identity providers. To configure multiple IdPs, repeat steps 1-4 in this guide for each IdP. Ensure each IdP configuration uses the same domain. + +When a user signs in to a Docker organization that has multiple IdPs, on the sign-in page, they must choose the option **Continue with SSO**. This prompts them to choose their identity provider and authenticate through their domain email. ## Optional: Enforce SSO ->[!IMPORTANT] +> [!IMPORTANT] > > If SSO isn't enforced, users can choose to sign in with either their Docker username and password or SSO. diff --git a/layouts/shortcodes/admin-sso-management.md b/layouts/shortcodes/admin-sso-management.md index 9a02a6360317..9d04bebfea8c 100644 --- a/layouts/shortcodes/admin-sso-management.md +++ b/layouts/shortcodes/admin-sso-management.md @@ -8,6 +8,10 @@ ### Remove a domain from an SSO connection +> [!IMPORTANT] +> +> Docker supports multiple IdP configurations, where a single domain is used for multiple SSO identity providers. If you want to remove a domain from multiple SSO connections, you must remove it from each connection individually. + 1. Sign in to {{ $product_link }}. 2. {{ $sso_navigation }} 3. In the SSO connections table, select the **Action** icon and then **Edit connection**. From 3514b18fc96c1c8855c8b8f03c4678cf7bedec0d Mon Sep 17 00:00:00 2001 From: sheltongraves <148902861+sheltongraves@users.noreply.github.com> Date: Mon, 12 May 2025 14:38:30 -0400 Subject: [PATCH 384/699] Create immutable-tags.md (#22608) Adding a new page for immutable tags feature. I was thinking it would go in Docker Hub -> Repositories -> Images. But open to your discretion of the best place for it. ## Description ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Signed-off-by: Craig Co-authored-by: Craig Osterhout <103533812+craig-osterhout@users.noreply.github.com> Co-authored-by: Craig --- .../repos/manage/hub-images/immutable-tags.md | 50 +++++++++++++++++++ data/summary.yaml | 2 + 2 files changed, 52 insertions(+) create mode 100644 content/manuals/docker-hub/repos/manage/hub-images/immutable-tags.md diff --git a/content/manuals/docker-hub/repos/manage/hub-images/immutable-tags.md b/content/manuals/docker-hub/repos/manage/hub-images/immutable-tags.md new file mode 100644 index 000000000000..b0ae4abee53d --- /dev/null +++ b/content/manuals/docker-hub/repos/manage/hub-images/immutable-tags.md @@ -0,0 +1,50 @@ +--- +description: Learn about immutable tags and how they help maintain image version consistency on Docker Hub. +keywords: Docker Hub, Hub, repository content, tags, immutable tags, version control +title: Immutable tags on Docker Hub +linkTitle: Immutable tags +weight: 11 +--- +{{< summary-bar feature_name="Immutable tags" >}} + +Immutable tags provide a way to ensure that specific image versions remain unchanged once they are published to Docker Hub. This feature helps maintain consistency and reliability in your container deployments by preventing accidental overwrites of important image versions. + +## What are immutable tags? + +Immutable tags are image tags that, once pushed to Docker Hub, cannot be overwritten or deleted. This ensures that a specific version of an image remains exactly the same throughout its lifecycle, providing: + +- Version consistency +- Reproducible builds +- Protection against accidental overwrites +- Better security and compliance + +## Enable immutable tags + +To enable immutable tags for your repository: + +1. Sign in to [Docker Hub](https://hub.docker.com). +2. Select **My Hub** > **Repositories**. +3. Select the repository where you want to enable immutable tags. +4. Select the **Settings** tab +5. Under **Tag mutability settings**, select **Immutable**. +6. Select **Save**. + +Once enabled, all tags are locked to their specific images, ensuring that each tag always points to the same image version and cannot be modified. + + > [!NOTE] +> +> All tags in the repository become immutable, including the `latest` tag. + +## Working with immutable tags + +When immutable tags are enabled: + +- You cannot push a new image with the same tag name +- You must use a new tag name for each new image version + +To push an image, create a new tag for your updated image and push it to the repository. + + + + + diff --git a/data/summary.yaml b/data/summary.yaml index 5246f3899d9f..e18714146d70 100644 --- a/data/summary.yaml +++ b/data/summary.yaml @@ -182,6 +182,8 @@ Hardened Docker Desktop: for: Administrators Image management: availability: Beta +Immutable tags: + availability: Beta Import builds: availability: Beta requires: Docker Desktop [4.31](/manuals/desktop/release-notes.md#4310) and later From 4084a45650fb2fa14979ecf2676acb8af3635f03 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Tue, 13 May 2025 15:14:28 +0200 Subject: [PATCH 385/699] update go to 1.24 Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- Dockerfile | 2 +- go.mod | 4 +--- hack/releaser/Dockerfile | 2 +- hack/releaser/go.mod | 2 +- hugo.yaml | 2 +- 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index c7e22db80cc7..0fbed160d309 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ # check=skip=InvalidBaseImagePlatform ARG ALPINE_VERSION=3.21 -ARG GO_VERSION=1.23.8 +ARG GO_VERSION=1.24 ARG HTMLTEST_VERSION=0.17.0 ARG HUGO_VERSION=0.141.0 ARG NODE_VERSION=22 diff --git a/go.mod b/go.mod index 26a9c60f1984..ebea548b95ec 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,6 @@ module github.com/docker/docs -go 1.23.8 - -toolchain go1.24.1 +go 1.24.0 require ( github.com/docker/buildx v0.23.0 // indirect diff --git a/hack/releaser/Dockerfile b/hack/releaser/Dockerfile index 11c574d173a0..90687cf448b7 100644 --- a/hack/releaser/Dockerfile +++ b/hack/releaser/Dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1 -ARG GO_VERSION=1.23 +ARG GO_VERSION=1.24 FROM scratch AS sitedir diff --git a/hack/releaser/go.mod b/hack/releaser/go.mod index d17c092280c4..0e1396febd74 100644 --- a/hack/releaser/go.mod +++ b/hack/releaser/go.mod @@ -1,6 +1,6 @@ module github.com/docker/docs/hack/releaser -go 1.22 +go 1.24.0 require ( github.com/alecthomas/kong v1.4.0 diff --git a/hugo.yaml b/hugo.yaml index fb1c962215aa..86f4f43246ee 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -145,7 +145,7 @@ params: buildkit_version: "0.21.0" # Example runtime/library/os versions - example_go_version: "1.23" + example_go_version: "1.24" example_alpine_version: "3.21" example_node_version: "20" From b64d612c4dcbfa5918e8262cdfd230be3bc00d03 Mon Sep 17 00:00:00 2001 From: sheltongraves <148902861+sheltongraves@users.noreply.github.com> Date: Tue, 13 May 2025 16:26:10 -0400 Subject: [PATCH 386/699] Merge pull request #22491 from sheltongraves/patch-13 Update roles-and-permissions.md --- content/manuals/security/for-admins/roles-and-permissions.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/manuals/security/for-admins/roles-and-permissions.md b/content/manuals/security/for-admins/roles-and-permissions.md index f2464db71f09..5a8a96949368 100644 --- a/content/manuals/security/for-admins/roles-and-permissions.md +++ b/content/manuals/security/for-admins/roles-and-permissions.md @@ -20,6 +20,7 @@ When you invite users to your organization, you assign them a role. A role is a The following roles are available to assign: - Member: Non-administrative role. Members can view other members that are in the same organization. +- Distributor Member: Restricted-access role. Distributor Members can only view and pull from repositories they’ve been explicitly granted access to. They cannot view other members or teams. - Editor: Partial administrative access to the organization. Editors can create, edit, and delete repositories. They can also edit an existing team's access permissions. - Organization owner: Full organization administrative access. Organization owners can manage organization repositories, teams, members, settings, and billing. - Company owner: In addition to the permissions of an organization owner, company owners can configure settings for their associated organizations. From 8764eac28511b1a000454599c878f07693067114 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Wed, 14 May 2025 13:55:07 +0300 Subject: [PATCH 387/699] Fix link to docs in Annotations manual --- content/manuals/build/metadata/annotations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/manuals/build/metadata/annotations.md b/content/manuals/build/metadata/annotations.md index 910ce96f9d31..330deb818137 100644 --- a/content/manuals/build/metadata/annotations.md +++ b/content/manuals/build/metadata/annotations.md @@ -11,7 +11,7 @@ arbitrary information and attach it to your image, which helps consumers and tools understand the origin, contents, and how to use the image. Annotations are similar to, and in some sense overlap with, [labels]. Both -serve the same purpose: attach metadata to a resource. As a general principle, +serve the same purpose: to attach metadata to a resource. As a general principle, you can think of the difference between annotations and labels as follows: - Annotations describe OCI image components, such as [manifests], [indexes], @@ -68,7 +68,7 @@ For examples on how to add annotations to images built with GitHub Actions, see You can also add annotations to an image created using `docker buildx imagetools create`. This command only supports adding annotations to an index or manifest descriptors, see -[CLI reference](/reference/cli/docker/buildx/imagetools/create.md#annotations). +[CLI reference](/reference/cli/docker/buildx/imagetools/create.md#annotation). ## Inspect annotations From 7cc91f6dd07ea28e145288caaa43f5fbe5f5e0ff Mon Sep 17 00:00:00 2001 From: ArthurFlag Date: Wed, 14 May 2025 14:47:26 +0200 Subject: [PATCH 388/699] engine: add new supported versions --- content/manuals/engine/install/debian.md | 3 ++- content/manuals/engine/install/fedora.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/content/manuals/engine/install/debian.md b/content/manuals/engine/install/debian.md index 1ed65408d891..0ca59c2490a8 100644 --- a/content/manuals/engine/install/debian.md +++ b/content/manuals/engine/install/debian.md @@ -42,6 +42,7 @@ To get started with Docker Engine on Debian, make sure you To install Docker Engine, you need the 64-bit version of one of these Debian versions: +- Debian Trixie 13 (testing) - Debian Bookworm 12 (stable) - Debian Bullseye 11 (oldstable) @@ -144,7 +145,7 @@ Docker from the repository. ```console $ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ``` - + {{< /tab >}} {{< tab name="Specific version" >}} diff --git a/content/manuals/engine/install/fedora.md b/content/manuals/engine/install/fedora.md index 71a795db6ab0..ac936854c18d 100644 --- a/content/manuals/engine/install/fedora.md +++ b/content/manuals/engine/install/fedora.md @@ -26,8 +26,9 @@ To get started with Docker Engine on Fedora, make sure you To install Docker Engine, you need a maintained version of one of the following Fedora versions: -- Fedora 40 +- Fedora 42 - Fedora 41 +- Fedora 40 ### Uninstall old versions From fd2f88e9086abe835f15183fcda26090d321a9b6 Mon Sep 17 00:00:00 2001 From: sheltongraves <148902861+sheltongraves@users.noreply.github.com> Date: Wed, 14 May 2025 13:26:38 -0400 Subject: [PATCH 389/699] Update access.md (#22505) Added Gated Distribution information to docs page. ## Description ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Signed-off-by: Craig Co-authored-by: Craig Osterhout <103533812+craig-osterhout@users.noreply.github.com> Co-authored-by: Craig --- .../manuals/docker-hub/repos/manage/access.md | 39 +++++++++++++++++++ data/summary.yaml | 2 + 2 files changed, 41 insertions(+) diff --git a/content/manuals/docker-hub/repos/manage/access.md b/content/manuals/docker-hub/repos/manage/access.md index 4dbf8f2d88d5..0adac4195c49 100644 --- a/content/manuals/docker-hub/repos/manage/access.md +++ b/content/manuals/docker-hub/repos/manage/access.md @@ -132,3 +132,42 @@ To configure team repository permissions: Organizations can use OATs. OATs let you assign fine-grained repository access permissions to tokens. For more details, see [Organization access tokens](/manuals/security/for-admins/access-tokens.md). + +## Gated distribution + +{{< summary-bar feature_name="Gated distribution" >}} + +Gated distribution allows publishers to securely share private container images with external customers or partners, without giving them full organization access or visibility into your teams, collaborators, or other repositories. + +This feature is ideal for commercial software publishers who want to control who can pull specific images while preserving a clean separation between internal users and external consumers. + +### Key features + +- **Private repository distribution**: Content is stored in private repositories and only accessible to explicitly invited users. + +- **External access without organization membership**: External users don't need to be added to your internal organization to pull images. + +- **Pull-only permissions**: External users receive pull-only access and cannot push or modify repository content. + +- **Invite-only access**: Access is granted through authenticated email invites, managed via API. + +### Invite distributor members via API + +> [!NOTE] +> When you invite members, you assign them a role. See [Roles and permissions](/manuals/security/for-admins/roles-and-permissions.md) for details about the access permissions for each role. + +Distributor members (used for gated distribution) can only be invited using the Docker Hub API. UI-based invitations are not currently supported for this role. To invite distributor members, use the Bulk create invites API endpoint. + +To invite distributor members: + +1. Use the [Authentication API](https://docs.docker.com/reference/api/hub/latest/#tag/authentication-api/operation/AuthCreateAccessToken) to generate a bearer token for your Docker Hub account. + +2. Create a team in the Hub UI or use the [Teams API](https://docs.docker.com/reference/api/hub/latest/#tag/groups/paths/~1v2~1orgs~1%7Borg_name%7D~1groups/post). + +3. Grant repository access to the team: + - In the Hub UI: Navigate to your repository settings and add the team with "Read-only" permissions + - Using the [Repository Teams API](https://docs.docker.com/reference/api/hub/latest/#tag/repositories/paths/~1v2~1repositories~1%7Bnamespace%7D~1%7Brepository%7D~1groups/post): Assign the team to your repositories with "read-only" access level + +4. Use the [Bulk create invites endpoint](https://docs.docker.com/reference/api/hub/latest/#tag/invites/paths/~1v2~1invites~1bulk/post) to send email invites with the distributor member role. In the request body, set the "role" field to "distributor_member". + +5. The invited user will receive an email with a link to accept the invite. After signing in with their Docker ID, they'll be granted pull-only access to the specified private repository as a distributor member. diff --git a/data/summary.yaml b/data/summary.yaml index e18714146d70..e24ad0ca8f50 100644 --- a/data/summary.yaml +++ b/data/summary.yaml @@ -173,6 +173,8 @@ Domain management: Enforce sign-in: subscription: [Business] for: Administrators +Gated distribution: + availability: Early Access General admin: for: Administrators GitHub Actions cache: From da86a326e5e8e35a13a17884141cb855acafab79 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Wed, 14 May 2025 14:46:03 -0400 Subject: [PATCH 390/699] security: fix callout in domain audit (#22624) ## Description - Callout was misleading/linking to the wrong doc, this PR fixes that ## Related issues or tickets https://docker.atlassian.net/browse/ENGDOCS-2605 ## Reviews - [ ] Editorial review --- layouts/shortcodes/admin-domain-audit.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/layouts/shortcodes/admin-domain-audit.md b/layouts/shortcodes/admin-domain-audit.md index 09a693849550..01e8da1179d1 100644 --- a/layouts/shortcodes/admin-domain-audit.md +++ b/layouts/shortcodes/admin-domain-audit.md @@ -24,7 +24,6 @@ You can invite all the uncaptured users to your organization using the exported > [!NOTE] > -> Domain audit may identify accounts of users who are no longer a part of your organization. If you don't want to add a user to your organization and you don't want the user to appear in future domain audits, you must deactivate the account or update the associated email address. -> -> Only someone with access to the Docker account can deactivate the account or update the associated email address. For more details, see [Deactivating an account](/admin/organization/deactivate-account/). +> Domain audit may identify accounts of users who are no longer a part of your organization. If you don't want to add a user to your organization and you don't want the user to appear in future domain audits, the user must deactivate their account or update their associated email address. > +> You can't deactivate an account or update an associated email address on behalf of a user. For more details, see [Deactivating an account](/manuals/accounts/deactivate-user-account.md). \ No newline at end of file From 887fcd2e2bdd0078e46e2c06c5828252a7aee531 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Wed, 14 May 2025 14:46:29 -0400 Subject: [PATCH 391/699] desktop: add faq for MDMs (#22630) ## Description - Adds FAQ for MDMs, specifically about needing to deploy settings in separate files ## Related issues or tickets - https://docker.slack.com/archives/C04300R4G5U/p1747051871059429 - https://docker.atlassian.net/browse/ENGDOCS-2613 - ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- .../setup/install/enterprise-deployment/faq.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/content/manuals/desktop/setup/install/enterprise-deployment/faq.md b/content/manuals/desktop/setup/install/enterprise-deployment/faq.md index 71e689bab4d2..d2b7cacbcb8e 100644 --- a/content/manuals/desktop/setup/install/enterprise-deployment/faq.md +++ b/content/manuals/desktop/setup/install/enterprise-deployment/faq.md @@ -83,4 +83,18 @@ Add-LocalGroupMember -Group $Group -Member $CurrentUser > [!NOTE] > -> After adding a new user to the `docker-users` group, the user must sign out and then sign back in for the changes to take effect. \ No newline at end of file +> After adding a new user to the `docker-users` group, the user must sign out and then sign back in for the changes to take effect. + +## MDM + +Common questions about deploying Docker Desktop using mobile device management +(MDM) tools such as Jamf, Intune, or Workspace ONE. + +### Why doesn't my MDM tool apply all Docker Desktop configuration settings at once? + +Some MDM tools, such as Workspace ONE, may not support applying multiple +configuration settings in a single XML file. In these cases, you may need to +deploy each setting in a separate XML file. + +Refer to your MDM provider's documentation for specific deployment +requirements or limitations. \ No newline at end of file From 0a744f3846c57dfe22beb7ef73c694857830fdad Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Wed, 14 May 2025 14:46:49 -0400 Subject: [PATCH 392/699] billing: fix 404 (#22638) ## Description - Found a 404 during triage, added redirect ## Related issues or tickets https://docker.atlassian.net/browse/ENGDOCS-2618?atlOrigin=eyJpIjoiZmVkNzliNzdhZDI2NDk0NWFlNmVmOWU2ZDJmOTdjMjciLCJwIjoiaiJ9 ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/subscription/change.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/manuals/subscription/change.md b/content/manuals/subscription/change.md index 5844598f1ba2..2660e25ae01e 100644 --- a/content/manuals/subscription/change.md +++ b/content/manuals/subscription/change.md @@ -12,6 +12,7 @@ aliases: - /docker-hub/cancel-downgrade/ - /docker-hub/billing/downgrade/ - /billing/scout-billing/ +- /billing/subscription-management/ weight: 30 --- From 537c9f158f1e0420e7b873d2f43cedd8cbffeb02 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Wed, 14 May 2025 14:47:01 -0400 Subject: [PATCH 393/699] fix: mobile footer issue (#22639) ## Description - The Contact support button was appearing above the sidenav slideout on mobile, this fixes that - Tested on mobile in browser and mobile device - Verified there is no impact to desktop web version ## Related issues or tickets https://docker.atlassian.net/browse/ENGDOCS-2603 ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- hugo_stats.json | 1 - layouts/_default/baseof.html | 4 ++-- layouts/partials/footer.html | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/hugo_stats.json b/hugo_stats.json index 0ba8fdcc0a2b..b1aeaa2a9792 100644 --- a/hugo_stats.json +++ b/hugo_stats.json @@ -115,7 +115,6 @@ "Using-the-GUI", "VS-Code", "Vue", - "WSL-2-backend-Arm-Beta", "WSL-2-backend-x86_64", "Web-browser", "What-are-the-key-features-of-Docker-Desktop", diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html index fd991c9923ea..734cc86513ca 100644 --- a/layouts/_default/baseof.html +++ b/layouts/_default/baseof.html @@ -29,7 +29,7 @@ class="md:h-[calc(100vh-64px)] fixed md:sticky top-0 md:top-16 z-40 hidden h-screen flex-none overflow-y-auto overflow-x-hidden bg-background-light dark:bg-gray-dark-100 w-full md:z-auto md:block md:w-[300px]" :class="{ 'hidden': ! $store.showSidebar }"> -
@@ -53,7 +53,7 @@
-
{{ partialCached "footer.html" . }}
+
{{ partialCached "footer.html" . }}
{{/* Load the YouTube player if the page embeds a YouTube video */}} {{ with .Store.Get "youtube" }} diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html index d35b4ce95f72..aae737109963 100644 --- a/layouts/partials/footer.html +++ b/layouts/partials/footer.html @@ -1,4 +1,4 @@ -
+
{{ partialCached "components/support-button.html" . }}
From aca7feed7b0185a2199abe78e1ad8745a21b0f70 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Wed, 14 May 2025 17:53:46 -0400 Subject: [PATCH 394/699] security: add settings reference (#22625) ## Description - Add a settings reference for a source of truth for Settings Management and Docker Desktop settings - Improved other Settings Management docs to link to reference and make steps simpler - Added hardened security recommendations to reference *Ignore vale error* ## Related issues or tickets https://docker.atlassian.net/browse/ENGDOCS-2581 ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Co-authored-by: Craig Osterhout <103533812+craig-osterhout@users.noreply.github.com> --- .../settings-management/_index.md | 91 +- .../configure-admin-console.md | 96 +- .../configure-json-file.md | 111 +- .../settings-management/settings-reference.md | 1058 +++++++++++++++++ 4 files changed, 1218 insertions(+), 138 deletions(-) create mode 100644 content/manuals/security/for-admins/hardened-desktop/settings-management/settings-reference.md diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md index 48fc13100a01..4c7ab56f2623 100644 --- a/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/_index.md @@ -12,70 +12,73 @@ weight: 10 {{< summary-bar feature_name="Hardened Docker Desktop" >}} -Settings Management helps you control key Docker Desktop settings, like proxies and network configurations, on your developers' machines within your organization. - -For an extra layer of security, you can also use Settings Management to enable and lock in [Enhanced Container Isolation](../enhanced-container-isolation/_index.md), which prevents containers from modifying any Settings Management configurations. +Settings Management lets administrators configure and enforce Docker Desktop +settings across ennd-user machines. It helps maintain consistent configurations +and enhances security within your organization. ## Who is it for? -- For organizations that want to configure Docker Desktop to be within their organization's centralized control. -- For organizations that want to create a standardized Docker Desktop environment at scale. -- For Docker Business customers who want to confidently manage their use of Docker Desktop within tightly regulated environments. +Settings Management is designed for organizations that: + +- Require centralized control over Docker Desktop configurations. +- Aim to standardize Docker Desktop environments across teams. +- Operate in regulated environments and need to enforce compliance. -## How does it work? +This feature is available with a Docker Business subscription. -You can configure several Docker Desktop settings using either: +## How it works - - An `admin-settings.json` file. This file is located on the Docker Desktop host and can only be accessed by developers with root or administrator privileges. - - Creating a settings policy in the Docker Admin Console. +Administrators can define settings using one of the following methods: -Settings that are defined by an administrator override any previous values set by developers and ensure that these cannot be modified. +- [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md): Create and assign settings policies through the +Docker Admin Console. +- [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md): Place a configuration file on the +user's machine to enforce settings. -## What features can I configure with Settings Management? +Enforced settings override user-defined configurations and can't be modified +by developers. -Using the `admin-settings.json` file, you can: +## Configurable settings -- Turn on and lock in [Enhanced Container Isolation](../enhanced-container-isolation/_index.md) -- Configure HTTP proxies -- Configure network settings -- Configure Kubernetes settings -- Enforce the use of WSL 2 based engine or Hyper-V -- Enforce the use of Rosetta for x86_64/amd64 emulation on Apple Silicon -- Configure Docker Engine -- Turn off Docker Desktop's ability to checks for updates -- Turn off Docker Extensions -- Turn off Docker Scout SBOM indexing -- Turn off beta and experimental features -- Turn off Docker AI ([Ask Gordon](/manuals/ai/gordon/_index.md)) -- Turn off Docker Desktop's onboarding survey -- Control whether developers can use the Docker terminal -- Control the file sharing implementation for your developers on macOS -- Specify which paths your developers can add file shares to -- Configure Air-gapped containers +Settings Management supports a broad range of Docker Desktop features, +including proxies, network configurations, and container isolation. -For more details on the syntax and options, see [Configure Settings Management](configure-json-file.md). +For a full list of settings you can enforce, see the [Settings reference](/manuals/security/for-admins/hardened-desktop/settings-management/settings-reference.md). -## How do I set up and enforce Settings Management? +## Set up Settings Management -You first need to [enforce sign-in](/manuals/security/for-admins/enforce-sign-in/_index.md) to ensure that all Docker Desktop developers authenticate with your organization. Since the Settings Management feature requires a Docker Business subscription, enforced sign-in guarantees that only authenticated users have access and that the feature consistently takes effect across all users, even though it may still work without enforced sign-in. +1. [Enforce sign-in](/manuals/security/for-admins/enforce-sign-in/_index.md) to +ensure all developers authenticate with your organization. +2. Choose a configuration method: + - Use the `--admin-settings` installer flag on [macOS](/manuals/desktop/setup/install/mac-install.md#install-from-the-command-line) or [Windows](/manuals/desktop/setup/install/windows-install.md#install-from-the-command-line) to automatically create the `admin-settings.json`. + - Manually create and configure the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md). + - Create a settings policy in the [Docker Admin Console](configure-admin-console.md). -Next, you must either: - - Manually [create and configure the `admin-settings.json` file](configure-json-file.md), or use the `--admin-settings` installer flag on [macOS](/manuals/desktop/setup/install/mac-install.md#install-from-the-command-line) or [Windows](/manuals/desktop/setup/install/windows-install.md#install-from-the-command-line) to automatically create the `admin-settings.json` and save it in the correct location. - - Fill out the **Settings policy** creation form in the [Docker Admin Console](configure-admin-console.md). +After configuration, developers receive the enforced setting when they: -Once this is done, Docker Desktop developers receive the changed settings when they either: -- Quit, re-launch, and sign in to Docker Desktop -- Launch and sign in to Docker Desktop for the first time +- Quit and relaunch Docker Desktop, then sign in. +- Launch and sign in to Docker Desktop for the first time. -To avoid disrupting your developers' workflows, Docker doesn't automatically require that developers re-launch and re-authenticate once a change has been made. +> [!NOTE] +> +> Docker Desktop does not automatically prompt users to restart or re-authenticate +after a settings change. -## What do developers see when the settings are enforced? +## Developer experience -Enforced settings appear grayed out in Docker Desktop. They can't be edited via the Docker Desktop Dashboard, CLI, or `settings-store.json` (or `settings.json` for Docker Desktop 4.34 and earlier). +When settings are enforced: -In addition, if Enhanced Container Isolation is enforced, developers can't use privileged containers or similar techniques to modify enforced settings within the Docker Desktop Linux VM. For example, they can't reconfigure proxy and networking, or Docker Engine. +- Options appear grayed out in Docker Desktop and can't be modified via the +Dashboard, CLI, or configuration files. +- If Enhanced Container Isolation is enabled, developers can't use privileged +containers or similar methods to alter enforced settings within the Docker +Desktop Linux VM. ## What's next? -- [Configure Settings Management with a `.json` file](configure-json-file.md) +- [Configure Settings Management with the `admin-settings.json` file](configure-json-file.md) - [Configure Settings Management with the Docker Admin Console](configure-admin-console.md) + +## Learn more + +To see how each Docker Desktop setting maps across the Docker Dashboard, `admin-settings.json` file, and Admin Console, see the [Settings reference](settings-reference.md). \ No newline at end of file diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md index 646685fc950a..fc9b4f1e0095 100644 --- a/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md @@ -8,68 +8,78 @@ weight: 20 {{< summary-bar feature_name="Admin Console" >}} -This page contains information for administrators on how to configure Settings Management with the Docker Admin Console. You can specify and lock configuration parameters to create a standardized Docker Desktop environment across your Docker company or organization. +This page explains how administrators can use the Docker Admin Console to create +and apply settings policies for Docker Desktop. These policies help standardize +and secure Docker Desktop environments across your organization. ## Prerequisites -- [Download and install Docker Desktop 4.36.0 or later](/manuals/desktop/release-notes.md). +- [Install Docker Desktop 4.36.0 or later](/manuals/desktop/release-notes.md). - [Verify your domain](/manuals/security/for-admins/single-sign-on/configure.md#step-one-add-and-verify-your-domain). -- [Enforce sign-in](/manuals/security/for-admins/enforce-sign-in/_index.md). The Settings Management feature requires a Docker Business -subscription, therefore your Docker Desktop users must authenticate to your -organization for configurations to take effect. +- [Enforce sign-in](/manuals/security/for-admins/enforce-sign-in/_index.md) to +ensure users authenticate to your organization. +- A Docker Business subscription is required. + +> [!IMPORTANT] +> +> You must add users to your verified domain for settings to take effect. ## Create a settings policy -1. Within the [Docker Admin Console](https://app.docker.com/admin) navigate to the company or organization you want to define a settings policy for. -2. Under the **Docker Desktop** section, select **Settings Management**. +1. Go to the [Docker Admin Console](https://app.docker.com/admin) and select +your organization. +2. Under **Docker Desktop**, select **Settings Management**. 3. Select **Create a settings policy**. -4. Give your settings policy a name and an optional description. +4. Provide a name and optional description. - > [!TIP] - > - > If you have already configured Settings Management with an `admin-settings.json` file for an organization, you can upload it using the **Upload existing settings** button which then automatically populates the form for you. - > - > Settings policies deployed via the Docker Admin Console take precedence over manually deployed `admin-settings.json` files. + > [!TIP] + > + > You can upload an existing `admin-settings.json` file to pre-fill the form. + Admin Console policies override local `admin-settings.json` files. -5. Assign the setting policy to all your users within the company or organization, or specific users. +5. Choose who the policy applies to: + - All users + - Specific users - > [!NOTE] - > - > If a settings policy is assigned to all users, it sets the policy as the global default policy. You can only have one global settings policy at a time. - > If a user already has a user-specific settings policy assigned, the user-specific policy takes precedence over a global policy. + > [!NOTE] + > + > User-specific policies override the global default. Test your policy with + a few users before rolling it out globally. - > [!TIP] - > - > Before setting a global settings policy, it is recommended that you first test it as a user-specific policy to make sure you're happy with the changes before proceeding. +6. Configure the state for each setting: + - **User-defined**: Users can change the setting. + - **Always enabled**: Setting is on and locked. + - **Enabled**: Setting is on but can be changed. + - **Always disabled**: Setting is off and locked. + - **Disabled**: Setting is off but can be changed. -6. Configure the settings for the policy. Go through each setting and select your chosen setting state. You can choose: - - **User-defined**. Your developers are able to control and change this setting. - - **Always enabled**. This means the setting is turned on and your users won't be able to edit this setting from Docker Desktop or the CLI. - - **Enabled**. The setting is turned on and users can edit this setting from Docker Desktop or the CLI. - - **Always disabled**. This means the setting is turned off and your users won't be able to edit this setting from Docker Desktop or the CLI. - - **Disabled**. The setting is turned off and users can edit this setting from Docker Desktop or the CLI. -7. Select **Create** + > [!TIP] + > + > For a complete list of available settings, their supported platforms, and which configuration methods they work with, see the [Settings reference](settings-reference.md). -For the settings policy to take effect: -- On a new install, users need to launch Docker Desktop and authenticate to their organization. -- On an existing install, users need to quit Docker Desktop through the Docker menu, and then re-launch Docker Desktop. If they are already signed in, they don't need to sign in again for the changes to take effect. +7. Select **Create**. - > [!IMPORTANT] - > - > Selecting **Restart** from the Docker menu isn't enough as it only restarts some components of Docker Desktop. +To apply the policy: -To avoid disrupting your users' workflows, Docker doesn't automatically require that users re-launch once a change has been made. +- New installs: Launch Docker Desktop and sign in. +- Existing installs: Fully quit and relaunch Docker Desktop. -> [!NOTE] +> [!IMPORTANT] > -> Settings are synced to Docker Desktop and the CLI when a user is signed in and starts Docker Desktop, and then every 60 minutes. +> Restarting from the Docker Desktop menu isn't enough. Users must fully quit +and relaunch Docker Desktop. + +Docker Desktop checks for policy updates at launch and every 60 minutes. To roll +back a policy, either delete it or set individual settings to **User-defined**. + +## Manage policies -If your settings policy needs to be rolled back, either delete the policy or edit the policy to set individual settings to **User-defined**. +From the **Actions** menu on the **Settings Management** page, you can: -## Settings policy actions +- Edit or delete an existing settings policy +- Export a settings policy as an `admin-settings.json` file +- Promote a user-specific policy to be the new global default -From the **Actions** menu on the **Settings Management** page in the Docker Admin Console, you can: +## Learn more -- Edit or delete an existing settings policy. -- Export a settings policy as an `admin-settings.json` file. -- Promote a policy that is applied to a select group of users, to be the new global default policy for all users. \ No newline at end of file +To see how each Docker Desktop setting maps across the Docker Dashboard, `admin-settings.json` file, and Admin Console, see the [Settings reference](settings-reference.md). \ No newline at end of file diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md index f6856d85c66e..28758eca5db1 100644 --- a/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md @@ -11,63 +11,75 @@ aliases: {{< summary-bar feature_name="Hardened Docker Desktop" >}} -This page contains information on how to configure Settings Management with an `admin-settings.json` file. You can specify and lock configuration parameters to create a standardized Docker Desktop environment across your company or organization. - -Settings Management is designed specifically for organizations who don’t give developers root access to their machines. +This page explains how to use an `admin-settings.json` file to configure and +enforce Docker Desktop settings. Use this method to standardize Docker +Desktop environments in your organization. ## Prerequisites -You must [enforce sign-in](/manuals/security/for-admins/enforce-sign-in/_index.md) to ensure that all Docker Desktop users authenticate with your organization. +- [Enforce sign-in](/manuals/security/for-admins/enforce-sign-in/_index.md) to +ensure all users authenticate with your organization. +- A Docker Business subscription is required. -Settings management requires a Docker Business subscription. Docker Desktop verifies the user's authentication and licensing before applying any settings from the `admin-settings.json` file. The settings file will not take effect unless both authentication and license checks pass. These checks ensure that only licensed users receive managed settings. +Docker Desktop only applies settings from the `admin-settings.json` file if both +authentication and Docker Business license checks succeed. > [!IMPORTANT] > -> If a user is not signed in, or their Docker ID does not belong to an organization with a Docker Business subscription, Docker Desktop ignores the `admin-settings.json` file. +> If a user isn't signed in or isn't part of a Docker Business organization, +the settings file is ignored. +## Limitation -## Known limitations +- The `admin-settings.json` file doesn't work in air-gapped or offline +environments. +- The file is not compatible with environments that restrict authentication +with Docker Hub. -The `admin-settings.json` file requires users to authenticate with Docker Hub and be a member -of an organization with a Docker Business subscription. This means the file does not work in: +## Step one: Create the settings file -- Air-grapped or offline environments where Docker Desktop can't authenticate with Docker Hub. -- Restricted environments where SSO and cloud-based authentication are not permitted. +You can: +- Use the `--admin-settings` installer flag to auto-generate the file. See: + - [macOS](/manuals/desktop/setup/install/mac-install.md#install-from-the-command-line) install guide + - [Windows](/manuals/desktop/setup/install/windows-install.md#install-from-the-command-line) install guide +- Or create it manually and place it in the following locations: + - Mac: `/Library/Application\ Support/com.docker.docker/admin-settings.json` + - Windows: `C:\ProgramData\DockerDesktop\admin-settings.json` + - Linux: `/usr/share/docker-desktop/admin-settings.json` -## Step one: Create the `admin-settings.json` file and save it in the correct location +> [!IMPORTANT] +> +> Place the file in a protected directory to prevent modification. Use MDM tools +like [Jamf](https://www.jamf.com/lp/en-gb/apple-mobile-device-management-mdm-jamf-shared/?attr=google_ads-brand-search-shared&gclid=CjwKCAjw1ICZBhAzEiwAFfvFhEXjayUAi8FHHv1JJitFPb47C_q_RCySTmF86twF1qJc_6GST-YDmhoCuJsQAvD_BwE) to distribute it at scale. -You can either use the `--admin-settings` installer flag on [macOS](/manuals/desktop/setup/install/mac-install.md#install-from-the-command-line) or [Windows](/manuals/desktop/setup/install/windows-install.md#install-from-the-command-line) to automatically create the `admin-settings.json` and save it in the correct location, or set it up manually. +## Step two: Define settings -To set it up manually: -1. Create a new, empty JSON file and name it `admin-settings.json`. -2. Save the `admin-settings.json` file on your developers' machines in the following locations: - - Mac: `/Library/Application\ Support/com.docker.docker/admin-settings.json` - - Windows: `C:\ProgramData\DockerDesktop\admin-settings.json` - - Linux: `/usr/share/docker-desktop/admin-settings.json` +> [!TIP] +> +> For a complete list of available settings, their supported platforms, and which configuration methods they work with, see the [Settings reference](settings-reference.md). - By placing this file in a protected directory, developers are unable to modify it. +The `admin-settings.json` file uses structured keys to define what can +be configured and whether the values are enforced. - > [!IMPORTANT] - > - > It is assumed that you have the ability to push the `admin-settings.json` settings file to the locations specified through a device management software such as [Jamf](https://www.jamf.com/lp/en-gb/apple-mobile-device-management-mdm-jamf-shared/?attr=google_ads-brand-search-shared&gclid=CjwKCAjw1ICZBhAzEiwAFfvFhEXjayUAi8FHHv1JJitFPb47C_q_RCySTmF86twF1qJc_6GST-YDmhoCuJsQAvD_BwE). +Each setting supports the `locked` field. When `locked` is set to `true`, users +can't change that value in Docker Desktop, the CLI, or config files. When +`locked` is set to `false`, the value acts like a default suggestion and users +can still update it. -## Step two: Configure the settings you want to lock in +Settings where `locked` is set to `false` are ignored on existing installs if +a user has already customized that value in `settings-store.json`, +`settings.json`, or `daemon.json`. > [!NOTE] > -> Some of the configuration parameters only apply to certain platforms or to specific Docker Desktop versions. This is highlighted in the following table. - -The `admin-settings.json` file requires a nested list of configuration parameters, each of which must contain the `locked` parameter. You can add or remove configuration parameters as per your requirements. - -If `locked: true`, users aren't able to edit this setting from Docker Desktop or the CLI. +> Some settings are platform-specific or require a minimum Docker Desktop +version. See the [Settings reference](/manuals/security/for-admins/hardened-desktop/settings-management/settings-reference.md) for details. -If `locked: false`, it's similar to setting a factory default in that: - - For new installs, `locked: false` pre-populates the relevant settings in the Docker Desktop Dashboard, but users are able to modify it. +### Example settings file - - If Docker Desktop is already installed and being used, `locked: false` is ignored. This is because existing users of Docker Desktop may have already updated a setting, which in turn will have been written to the relevant config file, for example the `settings-store.json` (or `settings.json` for Docker Desktop versions 4.34 and earlier) or `daemon.json`. In these instances, the user's preferences are respected and the values aren't altered. These can be controlled by setting `locked: true`. - -The following `admin-settings.json` code and table provides an example of the required syntax and descriptions for parameters and values: +The following file is an example `admin-settings.json` file. For a full list +of configurable settings for the `admin-settings.json` file, see [`admin-settings.json` configurations](#admin-settingsjson-configurations). ```json {collapse=true} { @@ -198,6 +210,20 @@ The following `admin-settings.json` code and table provides an example of the re } ``` +## Step three: Restart and apply settings + +Settings apply after Docker Desktop is restarted and the user is signed in. + +- New installs: Launch Docker Desktop and sign in. +- Existing installs: Quit Docker Desktop fully and relaunch it. + +> [!IMPORTANT] +> +> Restarting Docker Desktop from the menu isn't enough. It must be fully +quit and reopened. + +## `admin-settings.json` configurations + ### General |Parameter|OS|Description|Version| @@ -291,20 +317,3 @@ The following `admin-settings.json` code and table provides an example of the re |        `dockerSocketMount` | | By default, enhanced container isolation blocks bind-mounting the Docker Engine socket into containers (e.g., `docker run -v /var/run/docker.sock:/var/run/docker.sock ...`). This lets you relax this in a controlled way. See [ECI Configuration](../enhanced-container-isolation/config.md) for more info. | | |               `imageList` | | Indicates which container images are allowed to bind-mount the Docker Engine socket. | | |               `commandList` | | Restricts the commands that containers can issue via the bind-mounted Docker Engine socket. | | - -## Step three: Re-launch Docker Desktop - -> [!NOTE] -> -> Test the changes made through the `admin-settings.json` file locally to see if the settings work as expected. - -For settings to take effect: -- On a new install, developers need to launch Docker Desktop and authenticate to their organization. -- On an existing install, developers need to quit Docker Desktop through the Docker menu, and then re-launch Docker Desktop. If they are already signed in, they don't need to sign in again for the changes to take effect. - > [!IMPORTANT] - > - > Selecting **Restart** from the Docker menu isn't enough as it only restarts some components of Docker Desktop. - -So as not to disrupt your developers' workflow, Docker doesn't automatically mandate that developers re-launch and re-authenticate once a change has been made. - -In Docker Desktop, developers see the relevant settings grayed out. diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/settings-reference.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/settings-reference.md new file mode 100644 index 000000000000..a9ef45a70457 --- /dev/null +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/settings-reference.md @@ -0,0 +1,1058 @@ +--- +description: Reference for all settings and features that are configured with Settings Management +keywords: admin, controls, settings management, reference +title: Settings reference +linkTitle: Settings reference +--- + +This reference lists all Docker Desktop settings, including where they are configured, which operating systems they apply to, and whether they're available in the Docker Desktop GUI, the Docker Admin Console, or the `admin-settings.json` file. Settings are grouped to match the structure of the Docker Desktop interface. + +Each setting includes: + +- The display name used in Docker Desktop +- A table of values, default values, and required format +- A description and use cases +- OS compatibility +- Configuration methods: via [Docker Desktop](/manuals/desktop/settings-and-maintenance/settings.md), the Admin Console, or the `admin-settings.json` file + +Use this reference to compare how settings behave across different configuration +methods and platforms. + +## General + +### Start Docker Desktop when you sign in to your computer + +| Default value | Accepted values | Format | +|---------------|-----------------|--------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Start Docker Desktop automatically when booting machine. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Ensure Docker Desktop is always running after boot. +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Open Docker Dashboard when Docker Desktop starts + +| Default value | Accepted values | Format | +|---------------|----------------------------|--------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Open the Docker Dashboard automatically when Docker Desktop starts. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Quickly access containers, images, and volumes in the Docker Dashboard after starting Docker Desktop. +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Choose theme for Docker Desktop + +| Default value | Accepted values | Format | +|---------------|----------------------------|--------| +| `system` | `light`, `dark`, `system` | Enum | + +- **Description:** Choose the Docker Desktop GUI theme. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Personalize Docker Desktop appearance. +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Configure shell completions + +| Default value | Accepted values | Format | +|---------------|-------------------------|--------| +| `integrated` | `integrated`, `system` | String | + +- **Description:** If installed, automatically edits your shell configuration. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Customize developer experience with shell completions. +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Choose container terminal + +| Default value | Accepted values | Format | +|---------------|-------------------------|--------| +| `integrated` | `integrated`, `system` | String | + +- **Description:** Select default terminal for launching Docker CLI from Docker +Desktop. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Customize developer experience with preferred terminal. +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Enable Docker terminal + +| Default value | Accepted values | Format | +|---------------|-----------------|--------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Enable access to the Docker Desktop integrated terminal. If +the value is set to `false`, users can't use the Docker terminal to interact +with the host machine and execute commands directly from Docker Desktop. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Allow or restrict developer access to the built-in terminal. +- **Configure this setting with:** + - **General** setting in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `desktopTerminalEnabled` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + +### Enable Docker Debug by default + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Enable debug logging by default for Docker CLI commands. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Assist with debugging support issues. +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Include VM in Time Machine backup + +| Default value | Accepted values | Format | +|---------------|-----------------|--------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Back up the Docker Desktop virtual machine. +- **OS:** {{< badge color=blue text="Mac only" >}} +- **Use case:** Manage persistence of application data. +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Use containerd for pulling and storing images + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Use containerd native snapshotter instead of legacy +snapshotters. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Improve image handling performance and compatibility. +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Choose Virtual Machine Manager + +#### Docker VMM + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +#### Apple Virtualization framework + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Use Apple Virtualization Framework to run Docker containers. +- **OS:** {{< badge color=blue text="Mac only" >}} +- **Use case:** Improve VM performance on Apple Silicon. +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +#### Rosetta + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Use Rosetta to emulate `amd64` on Apple Silicon. If value +is set to `true`, Docker Desktop turns on Rosetta to accelerate +x86_64/amd64 binary emulation on Apple Silicon. +- **OS:** {{< badge color=blue text="Mac only" >}} 13+ +- **Use case:** Run Intel-based containers on Apple Silicon hosts. + +> [!NOTE] +> +> In hardened environments, disable and lock this setting so only ARM-native +images are permitted. + +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management:`useVirtualizationFrameworkRosetta` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + - Settings Management: **Use Rosetta for x86_64/amd64 emulation on Apple Silicon** setting in the [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md) + +> [!NOTE] +> +> Rosetta requires enabling Apple Virtualization framework. + +#### QEMU + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +### Choose file sharing implementation + +#### VirtioFS + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Use VirtioFS for fast, native file sharing between host and +containers. If value is set to `true`, VirtioFS is set as the file sharing +mechanism. If both VirtioFS and gRPC are set to `true`, VirtioFS takes +precedence. +- **OS:** {{< badge color=blue text="Mac only" >}} 12.5+ +- **Use case:** Improve volume mount performance and compatibility. + +> [!NOTE] +> +> In hardened environments, enable and lock this setting for macOS 12.5 and +later. + +- **Configure this setting with:** + - **General settings** in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `useVirtualizationFrameworkVirtioFS` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + - Settings Management: **Use VirtioFS for file sharing** setting in the [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md) + +#### gRPC FUSE + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Enable gRPC FUSE for macOS file sharing. If value is set to +`true`, gRPC Fuse is set as the file sharing mechanism. +- **OS:** {{< badge color=blue text="Mac only" >}} +- **Use case:** Improve performance and compatibility of file mounts. + +> [!NOTE] +> +> In hardened environments, disable and lock this setting. + +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `useGrpcfuse` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + - Settings Management: **Use gRPC FUSE for file sharing** setting in the [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md) + +#### osxfs + +| Default value | Accepted values | Format | +| ------------- | --------------- | ------- | +| `false` | `true`, `false` | Boolean | + +- **Description:** Enable the legacy osxfs file sharing driver for macOS. When +set to true, Docker Desktop uses osxfs instead of VirtioFS or gRPC FUSE to mount +host directories into containers. +- **OS:** {{< badge color=blue text="Mac only" >}} +- **Use case:** Use the original file sharing implementation when compatibility +with older tooling or specific workflows is required. +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Send usage statistics + +| Default value | Accepted values | Format | +|---------------|-----------------|--------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Controls whether Docker Desktop collects and sends local +usage statistics and crash reports to Docker. This setting affects telemetry +gathered from the Docker Desktop application itself. It does not affect +server-side telemetry collected via Docker Hub or other backend services, such +as login timestamps, pulls, or builds. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Enable analytics to help Docker improve the product based on +usage data. + +> [!NOTE] +> +> In hardened environments, disable and lock this setting. This allows you +to control all your data flows and collect support logs via secure channels +if needed. + +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `analyticsEnabled` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + - Settings Management: **Send usage statistics** setting in the [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md) + +> [!NOTE] +> +> Organizations using the Insights Dashboard may need this setting enabled to +ensure that developer activity is fully visible. If users opt out and the +setting is not locked, their activity may be excluded from analytics +views. + +### Use Enhanced Container Isolation + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Enable Enhanced Container Isolation for secure container +execution. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Prevent containers from modifying configuration or sensitive +host areas. + +> [!NOTE] +> +> In hardened environments, disable and lock this setting. + +- **Configure this setting with:** + - **General settings** in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `enhancedContainerIsolation` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + - Settings Management: **Enable enhanced container isolation** setting in the [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md) + +### Show CLI hints + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Display helpful CLI tips in the terminal when using Docker commands. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Help users discover and learn Docker CLI features through inline suggestions. +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Enable Scout image analysis + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Enable Docker Scout to generate and display SBOM data for container images. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Turn on Docker Scout analysis features to view vulnerabilities, packages, and metadata associated with images. + +> [!NOTE] +> +> In hardened environments, enable and lock this setting to ensure SBOMs are +always built to satisfy compliance scans. + +- **Configure this setting with:** + - **General settings** in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `sbomIndexing` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + - Settings Management: **SBOM indexing** settings in the [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md) + +### Enable background Scout SBOM indexing + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Automatically index SBOM data for images in the background without requiring user interaction. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Keep image metadata up to date by allowing Docker to perform SBOM indexing during idle time or after image pull operations. + +> [!NOTE] +> +> In hardened environments, enable and lock this setting. + +- **Configure this setting with:** + - **General settings** in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Automatically check configuration + +| Default value | Accepted values | Format | +|-----------------------|-----------------|---------| +| `CurrentSettingsVersions` | Integer | Integer | + +- **Description:** Regularly checks your configuration to ensure no unexpected changes have been made by another application +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Track versions for compatibility +- **Configure this setting with:** + - **General** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `configurationFileVersion` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + +## Resources + +### CPU limit + +| Default value | Accepted values | Format | +|-----------------------------------------------|-----------------|---------| +| Number of logical CPU cores available on host | Integer | Integer | + +- **Description:** Number of CPUs assigned to the Docker Desktop virtual machine. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Resource allocation control. +- **Configure this setting with:** + - **Advanced** Resources settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Memory limit + +| Default value | Accepted values | Format | +|---------------------------|-----------------|---------| +| Based on system resources | Integer | Integer | + +- **Description:** Amount of RAM (in MiB) assigned to the Docker virtual machine. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Control how much memory Docker can use on the host. +- **Configure this setting with:** + - **Advanced** Resources settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Swap + +| Default value | Accepted values | Format | +|---------------|-----------------|---------| +| `1024` | Integer | Integer | + +- **Description:** Amount of swap space (in MiB) assigned to the Docker virtual machine +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Extend memory availability via swap +- **Configure this setting with:** + - **Advanced** Resources settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Disk usage limit + +| Default value | Accepted values | Format | +|-------------------------------|-----------------|---------| +| Default disk size of machine. | Integer | Integer | + +- **Description:** Maximum disk size (in MiB) allocated for Docker Desktop. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Constrain Docker's virtual disk size for storage management. +- **Configure this setting with:** + - **Advanced** Resources settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Disk image location + +| Default value | Accepted values | Format | +|--------------------------------------------------|-----------------|--------| +| macOS: `~/Library/Containers/com.docker.docker/Data/vms/0`
Windows: `%USERPROFILE%\AppData\Local\Docker\wsl\data` | File path | String | + +- **Description:** Path where Docker Desktop stores virtual machine data. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Redirect Docker data to a custom location. +- **Configure this setting with:** + - **Advanced** Resources settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Enable Resource Saver + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Enable Docker Desktop to pause when idle. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Save system resources during periods of inactivity. +- **Configure this setting with:** + - **Advanced** Resources settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### File sharing directories + +| Default value | Accepted values | Format | +|----------------------------------------|---------------------------------|--------------------------| +| Varies by OS | List of file paths as strings | Array list of strings | + +- **Description:** List of allowed directories shared between the host and +containers. When a path is added, its subdirectories are allowed. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Restrict or define what file paths are available to containers. + +> [!NOTE] +> +> In hardened environments, lock to an explicit whitelist and disable end-user +edits. + +- **Configure this setting with:** + - **File sharing** Resources settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `filesharingAllowedDirectories` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + - Settings Management: **Allowed file sharing directories** setting in the [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md) + +### Proxy exclude + +| Default value | Accepted values | Format | +|---------------|--------------------|--------| +| `""` | List of addresses | String | + +- **Description:** Configure addresses that containers should bypass from proxy +settings. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Fine-tune proxy exceptions for container networking. + +> [!NOTE] +> +> In hardened environments, disable and lock this setting. + +- **Configure this setting with:** + - **Proxies** Resources settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `proxy` setting with `manual` and `exclude` modes in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + +### Docker subnet + +| Default value | Accepted values | Format | +|-------------------|-----------------|--------| +| `192.168.65.0/24` | IP address | String | + +- **Description:** Overrides the network range used for vpnkit DHCP/DNS for +`*.docker.internal`. +- **OS:** {{< badge color=blue text="Mac only" >}} +- **Use case:** Customize the subnet used for Docker container networking. +- **Configure this setting with:** + - Settings Management: `vpnkitCIDR` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + - Settings Management: **VPN Kit CIDR** setting in the [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md) + +### Use kernel networking for UDP + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Use the host’s kernel network stack for UDP traffic instead of Docker’s virtual network driver. This enables faster and more direct UDP communication, but may bypass some container isolation features. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Improve performance or compatibility for workloads that rely heavily on UDP traffic, such as real-time media, DNS, or game servers. +- **Configure this setting with:** + - **Network** Resources settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Enable host networking + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Enable experimental host networking support. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Allow containers to use the host network stack. +- **Configure this setting with:** + - **Network** Resources settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Enable WSL engine + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** If the value is set to `true`, Docker Desktop uses the WSL2 +based engine. This overrides anything that may have been set at installation +using the `--backend=` flag. +- **OS:** {{< badge color=blue text="Windows only" >}} + WSL +- **Use case:** Enable Linux containers via WSL 2 backend. + +> [!NOTE] +> +> In hardened environments, enable and lock this setting. + +- **Configure this setting with:** + - **WSL Integration** Resources settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `wslEngineEnabled` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + - Settings Management: **Windows Subsystem for Linux (WSL) Engine** setting in the [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md) + +## Docker Engine + +The Docker Engine settings let you configure low-level daemon settings through a raw JSON object. These settings are passed directly to the dockerd process that powers container management in Docker Desktop. + +| Key | Example | Description | Accepted values / Format | Default | +| --------------------- | --------------------------- | -------------------------------------------------- | ------------------------------ | ------- | +| `debug` | `true` | Enable verbose logging in the Docker daemon | Boolean | `false` | +| `experimental` | `true` | Enable experimental Docker CLI and daemon features | Boolean | `false` | +| `insecure-registries` | `["myregistry.local:5000"]` | Allow pulling from HTTP registries without TLS | Array of strings (`host:port`) | `[]` | +| `registry-mirrors` | `["https://mirror.gcr.io"]` | Define alternative registry endpoints | Array of URLs | `[]` | + +- **Description:** Customize the behavior of the Docker daemon using a structured JSON config passed directly to dockerd. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Fine-tune registry access, enable debug mode, or opt into experimental features. +- **Configure this setting with:** + - **Docker Engine** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +> [!NOTE] +> +> Values for this setting are passed as-is to the Docker daemon. Invalid or unsupported fields may prevent Docker Desktop from starting. + +## Builders + +Builders settings lets you manage Buildx builder instances for advanced image-building scenarios, including multi-platform builds and custom backends. + +| Key | Example | Description | Accepted values / Format | Default | +| ----------- | -------------------------------- | -------------------------------------------------------------------------- | ------------------------- | --------- | +| `name` | `"my-builder"` | Name of the builder instance | String | — | +| `driver` | `"docker-container"` | Backend used by the builder (`docker`, `docker-container`, `remote`, etc.) | String | `docker` | +| `platforms` | `["linux/amd64", "linux/arm64"]` | Target platforms supported by the builder | Array of platform strings | Host arch | + +- **Description:** Configure custom Buildx builders for Docker Desktop, including driver type and supported platforms. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Set up advanced build configurations like cross-platform images or remote builders. +- **Configure this setting with:** + - **Builders** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +> [!NOTE] +> +> Builder definitions are structured as an array of objects, each describing a builder instance. Conflicting or unsupported configurations may cause build errors. + +## Kubernetes + +### Enable Kubernetes + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Enable the integrated Kubernetes cluster in Docker Desktop. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Enable or disable Kubernetes support for developers. + +> [!NOTE] +> +> In hardened environments, disable and lock this setting. + +- **Configure this setting with:** + - **Kubernetes** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `kubernetes` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + - Settings Management: **Allow Kubernetes** setting in the [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md) + +### Choose cluster provisioning method + +| Default value | Accepted values | Format | +|---------------|-----------------|--------| +| `kubeadm` | `kubeadm`, `kind` | String | + +- **Description:** Set the Kubernetes node mode (single-node or multi-node). +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Control the topology of the integrated Kubernetes cluster. +- **Configure this setting with:** + - **Kubernetes** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Kubernetes node count (kind provisioning) + +| Default value | Accepted values | Format | +|---------------|-----------------|---------| +| `1` | Integer | Integer | + +- **Description:** Number of nodes to create in a multi-node Kubernetes cluster. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Scale the number of Kubernetes nodes for development or testing. +- **Configure this setting with:** + - **Kubernetes** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Kubernetes node version (kind provisioning) + +| Default value | Accepted values | Format | +|---------------|-------------------------------|--------| +| `1.31.1` | Semantic version (e.g., 1.29.1) | String | + +- **Description:** Version of Kubernetes used for cluster node creation. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Pin a specific Kubernetes version for consistency or +compatibility. +- **Configure this setting with:** + - **Kubernetes** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Show system containers + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Show Kubernetes system containers in the Docker Dashboard container list +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Allow developers to view kube-system containers for debugging + +> [!NOTE] +> +> In hardened environments, disable and lock this setting. + +- **Configure this setting with:** + - **Kubernetes** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +## Software updates + +### Automatically check for updates + +| Default value | Accepted values | Format | +|---------------|-----------------|--------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Disable automatic update polling for Docker Desktop. If the +value is set to `true`, checking for updates and notifications about Docker +Desktop updates are disabled. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Freeze the current version in enterprise environments. + +> [!NOTE] +> +> In hardened environments, enable this setting and lock. This guarantees that +only internally vetted versions are installed. + +- **Configure this setting with:** + - Settings Management: `disableUpdate` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + - Settings Management: **Disable update** setting in the [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md) + +### Always download updates + +| Default value | Accepted values | Format | +|---------------|-----------------|--------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Automatically download Docker Desktop updates when available. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Manage auto update behavior. +- **Configure this setting with:** + - **Software updates** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: **Disable updates** setting in the [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md) + +## Extensions + +### Enable Docker extensions + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Enable or disable Docker Extensions. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Control access to the Extensions Marketplace and installed +extensions. + +> [!NOTE] +> +> In hardened environments, disable and lock this setting. This prevents +third-party or unvetted plugins from being installed. + +- **Configure this setting with:** + - **Extensions** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `extensionsEnabled` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + - Settings Management: **Allow Extensions** setting in the [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md) + +### Allow only extensions distributed through the Docker Marketplace + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Restrict Docker Desktop to only run Marketplace extensions. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Prevent running third-party or local extensions. +- **Configure this setting with:** + - **Extensions** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Show Docker Extensions system containers + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Show system containers used by Docker Extensions in the container list +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Help developers troubleshoot or view extension system containers +- **Configure this setting with:** + - **Extensions** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +## Features in development + +### Enable Docker AI + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Enable Docker AI features in the Docker Desktop experience. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Enable or disable AI features like "Ask Gordon". +- **Configure this setting with:** + - **Features in development** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `enableDockerAI` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + +### Enable Docker Model Runner + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Enable Docker Model Runner features in Docker Desktop. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Enable or disable Docker Model Runner features. +- **Configure this setting with:** + - **Features in development** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Enable host-side TCP support + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Enable Docker Model Runner features in Docker Desktop. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Enable or disable Docker Model Runner features. +- **Configure this setting with:** + - **Features in development** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +> [!NOTE] +> +> This setting requires Docker Model Runner setting to be enabled first. + +## Notifications + +### Status updates on tasks and processes + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Display general informational messages inside Docker Desktop +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Customize in-app communication visibility +- **Configure this setting with:** + - **Notifications** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Recommendations from Docker + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Display promotional announcements and banners inside Docker Desktop +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Control exposure to Docker news and feature promotion +- **Configure this setting with:** + - **Notifications** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Docker announcements + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Display general announcements inside Docker Desktop. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Enable or suppress Docker-wide announcements in the GUI. +- **Configure this setting with:** + - **Notifications** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Docker surveys + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Display notifications inviting users to participate in surveys +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Enable or disable in-product survey prompts +- **Configure this setting with:** + - **Notifications** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Docker Scout Notification pop-ups + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Enable Docker Scout popups inside Docker Desktop. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Show or hide vulnerability scan notifications +- **Configure this setting with:** + - **Notifications** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Docker Scout OS notifications + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Enable Docker Scout notifications through the operating system. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Push Scout updates via system notification center +- **Configure this setting with:** + - **Notifications** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +## Advanced + +### Configure installation of Docker CLI + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `system` | File path | String | + +- **Description:** Install location for Docker CLI binaries. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Customize CLI install location for compliance or tooling. +- **Configure this setting with:** + - **Advanced** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +### Allow the default Docker socket to be used + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** By default, enhanced container isolation blocks bind-mounting +the Docker Engine socket into containers +(e.g., `docker run -v /var/run/docker.sock:/var/run/docker.sock ...`). This lets +you relax this in a controlled way. See ECI Configuration for more info. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Allow containers to access the Docker socket for scenarios like +Docker-in-Docker or containerized CI agents. +- **Configure this setting with:** + - **Advanced** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `dockerSocketMount` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + +### Allow privileged port mapping + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `true` | `true`, `false` | Boolean | + +- **Description:** Starts the privileged helper process which binds privileged ports that are between 1 and 1024 +- **OS:** {{< badge color=blue text="Mac only" >}} +- **Use case:** Enforce elevated privileges for networking support +- **Configure this setting with:** + - **Advanced** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + +## Settings not available in the Docker Desktop GUI + +The following settings aren’t shown in the Docker Desktop GUI. You can only configure them using Settings Management with the Admin Console or the `admin-settings.json` file. + +### Block `docker load` + +| Default value | Accepted values | Format | +|---------------|-----------------|--------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Prevent users from loading local Docker images using the `docker load` command. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Enforce image provenance by restricting local image imports. + +> [!NOTE] +> +> In hardened environments, enable and lock this setting. This forces all images +to come from your secure, scanned registry. + +- **Configure this setting with:** + - Settings Management: `blockDockerLoad` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + +### Expose Docker API on TCP 2375 + +| Default value | Accepted values | Format | +|---------------|-----------------|--------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Exposes the Docker API over an unauthenticated TCP socket on port 2375. Only recommended for isolated and protected environments. +- **OS:** {{< badge color=blue text="Windows only" >}} +- **Use case:** Required for legacy integrations or environments without named pipe support. + +> [!NOTE] +> +> In hardened environments, disable and lock this setting. This ensures the +Docker API is only reachable via the secure internal socket. + +- **Configure this setting with:** + - Settings Management: `exposeDockerAPIOnTCP2375` in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + +### Air-gapped container proxy + +| Default value | Accepted values | Format | +| ------------- | --------------- | ----------- | +| See example | Object | JSON object | + +- **Description:** Configure a manual HTTP/HTTPS proxy for containers. Useful in air-gapped environments where containers need restricted access. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Redirect or block container networking to comply with offline or secured network environments. +- **Configure this setting with:** + - Settings Management: `containersProxy` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + +#### Example + +```json +"containersProxy": { + "locked": true, + "mode": "manual", + "http": "", + "https": "", + "exclude": [], + "pac": "", + "transparentPorts": "" +} +``` + +Docker socket access control (ECI exceptions) + +| Default value | Accepted values | Format | +| ------------- | --------------- | ----------- | +| - | Object | JSON object | + +- **Description:** Allow specific images or commands to use the Docker socket when Enhanced Container Isolation is enabled. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Support tools like Testcontainers or LocalStack that need Docker socket access while maintaining secure defaults. +- Configure this setting with: + - Settings Management: `enhancedContainerIsolation` > `dockerSocketMount` in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + +#### Example + +```json +"enhancedContainerIsolation": { + "locked": true, + "value": true, + "dockerSocketMount": { + "imageList": { + "images": [ + "docker.io/localstack/localstack:*", + "docker.io/testcontainers/ryuk:*" + ] + }, + "commandList": { + "type": "deny", + "commands": ["push"] + } + } +} +``` + +### Allow beta features + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Enable access to beta features in Docker Desktop. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Give developers early access to features that are in public beta. + +> [!NOTE] +> +> In hardened environments, disable and lock this setting. + +- **Configure this setting with:** + - Settings Management: `allowBetaFeatures` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + +### Docker daemon options (Linux or Windows) + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `{}` | JSON object | Stringified JSON | + +- **Description:** Override the Docker daemon configuration used in Linux or Windows containers. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Configure low-level Docker daemon options (e.g., logging, storage drivers) without editing the local config files. + +> [!NOTE] +> +> In hardened environments, provide a vetted JSON config and lock it so no +overrides are possible. + +- **Configure this setting with:** + - Settings Management: `linuxVM.dockerDaemonOptions` or `windowsContainers.dockerDaemonOptions` in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + +### VPNKit CIDR + +| Default value | Accepted values | Format | +|-------------------|-----------------|--------| +| `192.168.65.0/24` | CIDR notation | String | + +- **Description:** Set the subnet used for internal VPNKit DHCP/DNS services. +- **OS:** {{< badge color=blue text="Mac only" >}} +- **Use case:** Prevent IP conflicts in environments with overlapping subnets. + +> [!NOTE] +> +> In hardened environments, lock to an approved, non-conflicting CIDR. + +- **Configure this setting with:** + - Settings Management: `vpnkitCIDR` setting in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) + - Settings Management: **VPN Kit CIDR** setting in the [Admin Console](/manuals/security/for-admins/hardened-desktop/settings-management/configure-admin-console.md) + +### Enable Kerberos and NTLM authentication + +| Default value | Accepted values | Format | +|---------------|-----------------|--------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Enables Kerberos and NTLM proxy authentication for enterprise environments. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Allow users to authenticate with enterprise proxy servers that require Kerberos or NTLM. +- **Configure this setting with:** + - Settings Management: `proxy.enableKerberosNtlm` in the [`admin-settings.json` file](/manuals/security/for-admins/hardened-desktop/settings-management/configure-json-file.md) \ No newline at end of file From 73669a1c478712ebb40ea9085051622154c8b6d2 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 15 May 2025 09:30:38 +0200 Subject: [PATCH 395/699] chore: update area labeler and codeowners for AI (#22636) --- .github/CODEOWNERS | 10 ++++++---- .github/labeler.yml | 6 ++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7c8329fc10fc..9194fe697eac 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -5,7 +5,7 @@ /content/manuals/build/ @crazy-max @aevesdocker -/content/manuals/build-cloud/ @crazy-max @aevesdocker +/content/manuals/build-cloud/ @crazy-max @aevesdocker /content/manuals/compose/ @aevesdocker @@ -19,11 +19,11 @@ /content/manuals/docker-hub/ @craig-osterhout -/content/manuals/engine/ @thaJeztah @aevesdocker +/content/manuals/engine/ @thaJeztah @aevesdocker -/content/reference/api/engine/ @thaJeztah @aevesdocker +/content/reference/api/engine/ @thaJeztah @aevesdocker -/content/reference/cli/ @thaJeztah @aevesdocker +/content/reference/cli/ @thaJeztah @aevesdocker /content/manuals/subscription/ @sarahsanders-docker @@ -41,4 +41,6 @@ /content/manuals/accounts/ @sarahsanders-docker +/content/manuals/ai/ @ArthurFlag + /_vendor @sarahsanders-docker diff --git a/.github/labeler.yml b/.github/labeler.yml index 11cef0e77f6d..c610f1df6207 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,3 +1,9 @@ +area/ai: + - changed-files: + - any-glob-to-any-file: + - content/manuals/ai/** + - content/reference/cli/model/** + area/release: - changed-files: - any-glob-to-any-file: From 446850c1c162572f959aea739acb44772d5ef135 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 15 May 2025 12:38:55 +0200 Subject: [PATCH 396/699] troubleshooting: remove docker feedback cli (#22644) ## Description `docker feedback` doesn't exit anymore. ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/compose/support-and-feedback/feedback.md | 6 ------ .../manuals/desktop/troubleshoot-and-support/feedback.md | 4 ---- 2 files changed, 10 deletions(-) diff --git a/content/manuals/compose/support-and-feedback/feedback.md b/content/manuals/compose/support-and-feedback/feedback.md index 04466f8a4e59..494e821488b7 100644 --- a/content/manuals/compose/support-and-feedback/feedback.md +++ b/content/manuals/compose/support-and-feedback/feedback.md @@ -9,12 +9,6 @@ aliases: There are many ways you can provide feedback on Docker Compose. -### In-product feedback - -If you have obtained Docker Compose through Docker Desktop, you can use the `docker feedback` command to submit feedback directly from the command line. - - - ### Report bugs or problems on GitHub To report bugs or problems, visit [Docker Compose on GitHub](https://github.com/docker/compose/issues) diff --git a/content/manuals/desktop/troubleshoot-and-support/feedback.md b/content/manuals/desktop/troubleshoot-and-support/feedback.md index 6ab0af9cf893..edba3f2d070b 100644 --- a/content/manuals/desktop/troubleshoot-and-support/feedback.md +++ b/content/manuals/desktop/troubleshoot-and-support/feedback.md @@ -14,10 +14,6 @@ There are many ways you can provide feedback on Docker Desktop or Docker Desktop On each Docker Desktop Dashboard view, there is a **Give feedback** link. This opens a feedback form where you can share ideas directly with the Docker team. -You can also use the `docker feedback` command to submit feedback directly from the command line. - - - ### Feedback via Docker Community forums To get help from the community, review current user topics, join or start a From 0c69fcb08eb42b1c8bdcdb8e84914536a0588393 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 15 May 2025 12:39:32 +0200 Subject: [PATCH 397/699] DMR: clarify base urls (#22623) ## Description Clarify base urls, reorder examples by order of importance. ## Related issues or tickets ## Reviews - [x] Technical review - [x] Editorial review - [ ] Product review --------- Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- content/manuals/ai/model-runner.md | 110 ++++++++++++++++------------- 1 file changed, 59 insertions(+), 51 deletions(-) diff --git a/content/manuals/ai/model-runner.md b/content/manuals/ai/model-runner.md index 84898f989dd5..65fe85622858 100644 --- a/content/manuals/ai/model-runner.md +++ b/content/manuals/ai/model-runner.md @@ -7,9 +7,9 @@ params: text: Beta group: AI weight: 20 -description: Learn how to use Docker Model Runner to manage and run AI models. +description: Learn how to use Docker Model Runner to manage and run AI models. keywords: Docker, ai, model runner, docker deskotp, llm -aliases: +aliases: - /desktop/features/model-runner/ - /ai/model-runner/ --- @@ -34,8 +34,8 @@ Models are pulled from Docker Hub the first time they're used and stored locally 1. Navigate to the **Features in development** tab in settings. 2. Under the **Experimental features** tab, select **Access experimental features**. -3. Select **Apply and restart**. -4. Quit and reopen Docker Desktop to ensure the changes take effect. +3. Select **Apply and restart**. +4. Quit and reopen Docker Desktop to ensure the changes take effect. 5. Open the **Settings** view in Docker Desktop. 6. Navigate to **Features in development**. 7. From the **Beta** tab, check the **Enable Docker Model Runner** setting. @@ -46,7 +46,7 @@ You can now use the `docker model` command in the CLI and view and interact with ### Model runner status -Check whether the Docker Model Runner is active: +Check whether the Docker Model Runner is active and displays the current inference engine: ```console $ docker model status @@ -55,7 +55,7 @@ $ docker model status ### View all commands Displays help information and a list of available subcommands. - + ```console $ docker model help ``` @@ -74,7 +74,7 @@ Commands: version Show the current version ``` -### Pull a model +### Pull a model Pulls a model from Docker Hub to your local environment. @@ -82,7 +82,7 @@ Pulls a model from Docker Hub to your local environment. $ docker model pull ``` -Example: +Example: ```console $ docker model pull ai/smollm2 @@ -114,7 +114,13 @@ You will see something similar to: ### Run a model -Run a model and interact with it using a submitted prompt or in chat mode. +Run a model and interact with it using a submitted prompt or in chat mode. When you run a model, Docker +calls an Inference Server API endpoint hosted by the Model Runner through Docker Desktop. The model +stays in memory until another model is requested, or until a pre-defined inactivity timeout is reached (currently 5 minutes). + +You do not have to use `Docker model run` before interacting with a specific model from a +host process or from within a container. Model Runner transparently loads the requested model on-demand, assuming it has been +pulled beforehand and is locally available. #### One-time prompt @@ -150,7 +156,7 @@ Chat session ended. ### Push a model to Docker Hub -Use the following command to push your model to Docker Hub: +To push your model to Docker Hub: ```console $ docker model push / @@ -158,10 +164,10 @@ $ docker model push / ### Tag a model -You can specify a particular version or variant of the model: +To specify a particular version or variant of the model: ```console -$ docker model tag +$ docker model tag ``` If no tag is provided, Docker defaults to `latest`. @@ -171,7 +177,7 @@ If no tag is provided, Docker defaults to `latest`. Fetch logs from Docker Model Runner to monitor activity or debug issues. ```console -$ docker model logs +$ docker model logs ``` The following flags are accepted: @@ -211,7 +217,7 @@ If you want to try an existing GenAI application, follow these instructions. 4. Open you app in the browser at the addresses specified in the repository [README](https://github.com/docker/hello-genai). -You'll see the GenAI app's interface where you can start typing your prompts. +You'll see the GenAI app's interface where you can start typing your prompts. You can now interact with your own GenAI app, powered by a local model. Try a few prompts and notice how fast the responses are — all running on your machine with Docker. @@ -219,45 +225,46 @@ You can now interact with your own GenAI app, powered by a local model. Try a fe ### What models are available? -All the available models are hosted in the [public Docker Hub namespace of `ai`](https://hub.docker.com/u/ai). +All the available models are hosted in the [public Docker Hub namespace of `ai`](https://hub.docker.com/u/ai). ### What API endpoints are available? -Once the feature is enabled, the following new APIs are available: +Once the feature is enabled, new API endpoints are available under the following base URLs: -```text -#### Inside containers #### +- From containers: `http://model-runner.docker.internal/` +- From host processes: `http://localhost:12434/`, assuming you have enabled TCP host access on default port 12434. -http://model-runner.docker.internal/ +Docker Model management endpoints: - # Docker Model management - POST /models/create - GET /models - GET /models/{namespace}/{name} - DELETE /models/{namespace}/{name} +```text +POST /models/create +GET /models +GET /models/{namespace}/{name} +DELETE /models/{namespace}/{name} +``` - # OpenAI endpoints - GET /engines/llama.cpp/v1/models - GET /engines/llama.cpp/v1/models/{namespace}/{name} - POST /engines/llama.cpp/v1/chat/completions - POST /engines/llama.cpp/v1/completions - POST /engines/llama.cpp/v1/embeddings - Note: You can also omit llama.cpp. - E.g., POST /engines/v1/chat/completions. +OpenAI endpoints: -#### Inside or outside containers (host) #### +```text +GET /engines/llama.cpp/v1/models +GET /engines/llama.cpp/v1/models/{namespace}/{name} +POST /engines/llama.cpp/v1/chat/completions +POST /engines/llama.cpp/v1/completions +POST /engines/llama.cpp/v1/embeddings +``` -Same endpoints on /var/run/docker.sock +To call these endpoints via a Unix socket (`/var/run/docker.sock`), prefix their path with +with `/exp/vDD4.40`. + +> [!NOTE] +> You can omit `llama.cpp` from the path. For example: `POST /engines/v1/chat/completions`. - # While still in Beta - Prefixed with /exp/vDD4.40 -``` ### How do I interact through the OpenAI API? #### From within a container -Examples of calling an OpenAI endpoint (`chat/completions`) from within another container using `curl`: +To call the `chat/completions` OpenAI endpoint from within another container using `curl`: ```bash #!/bin/sh @@ -280,15 +287,18 @@ curl http://model-runner.docker.internal/engines/llama.cpp/v1/chat/completions \ ``` -#### From the host using a Unix socket +#### From the host using TCP -Examples of calling an OpenAI endpoint (`chat/completions`) through the Docker socket from the host using `curl`: +To call the `chat/completions` OpenAI endpoint from the host via TCP: + +1. Enable the host-side TCP support from the Docker Desktop GUI, or via the [Docker Desktop CLI](/manuals/desktop/features/desktop-cli.md). + For example: `docker desktop enable model-runner --tcp `. +2. Interact with it as documented in the previous section using `localhost` and the correct port. ```bash #!/bin/sh -curl --unix-socket $HOME/.docker/run/docker.sock \ - localhost/exp/vDD4.40/engines/llama.cpp/v1/chat/completions \ + curl http://localhost:12434/engines/llama.cpp/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "ai/smollm2", @@ -303,19 +313,17 @@ curl --unix-socket $HOME/.docker/run/docker.sock \ } ] }' - ``` -#### From the host using TCP - -In case you want to interact with the API from the host, but use TCP instead of a Docker socket, you can enable the host-side TCP support from the Docker Desktop GUI, or via the [Docker Desktop CLI](/manuals/desktop/features/desktop-cli.md). For example, using `docker desktop enable model-runner --tcp `. +#### From the host using a Unix socket -Afterwards, interact with it as previously documented using `localhost` and the chosen, or the default port. +To call the `chat/completions` OpenAI endpoint through the Docker socket from the host using `curl`: ```bash #!/bin/sh - curl http://localhost:12434/engines/llama.cpp/v1/chat/completions \ +curl --unix-socket $HOME/.docker/run/docker.sock \ + localhost/exp/vDD4.40/engines/llama.cpp/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "ai/smollm2", @@ -354,7 +362,7 @@ Once linked, re-run the command. ### No safeguard for running oversized models -Currently, Docker Model Runner doesn't include safeguards to prevent you from launching models that exceed their system’s available resources. Attempting to run a model that is too large for the host machine may result in severe slowdowns or render the system temporarily unusable. This issue is particularly common when running LLMs models without sufficient GPU memory or system RAM. +Currently, Docker Model Runner doesn't include safeguards to prevent you from launching models that exceed their system's available resources. Attempting to run a model that is too large for the host machine may result in severe slowdowns or render the system temporarily unusable. This issue is particularly common when running LLMs models without sufficient GPU memory or system RAM. ### No consistent digest support in Model CLI @@ -362,7 +370,7 @@ The Docker Model CLI currently lacks consistent support for specifying models by ## Share feedback -Thanks for trying out Docker Model Runner. Give feedback or report any bugs you may find through the **Give feedback** link next to the **Enable Docker Model Runner** setting. +Thanks for trying out Docker Model Runner. Give feedback or report any bugs you may find through the **Give feedback** link next to the **Enable Docker Model Runner** setting. ## Disable the feature @@ -371,4 +379,4 @@ To disable Docker Model Runner: 1. Open the **Settings** view in Docker Desktop. 2. Navigate to the **Beta** tab in **Features in development**. 3. Clear the **Enable Docker Model Runner** checkbox. -4. Select **Apply & restart**. \ No newline at end of file +4. Select **Apply & restart**. From 5bfe083b58b32b5efab32c29ea7c35109ea36944 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Thu, 15 May 2025 14:14:05 +0200 Subject: [PATCH 398/699] Merge pull request #22643 from crazy-max/buildx-0.24.0-rc1 Update buildx reference to v0.24.0-rc1 --- _vendor/modules.txt | 2 +- data/buildx/docker_buildx_build.yaml | 29 ------ data/buildx/docker_buildx_debug.yaml | 29 ------ data/buildx/docker_buildx_debug_build.yaml | 29 ------ data/buildx/docker_buildx_dial-stdio.yaml | 8 +- data/buildx/docker_buildx_history_export.yaml | 91 ++++++++++++++++++- data/buildx/docker_buildx_history_import.yaml | 34 ++++++- .../buildx/docker_buildx_history_inspect.yaml | 53 ++++++++++- ...ker_buildx_history_inspect_attachment.yaml | 66 +++++++++++++- data/buildx/docker_buildx_history_logs.yaml | 50 +++++++++- data/buildx/docker_buildx_history_ls.yaml | 87 +++++++++++++++++- data/buildx/docker_buildx_history_open.yaml | 24 ++++- data/buildx/docker_buildx_history_rm.yaml | 32 ++++++- data/buildx/docker_buildx_history_trace.yaml | 54 ++++++++++- .../docker_buildx_imagetools_create.yaml | 2 +- data/buildx/docker_buildx_rm.yaml | 2 +- go.mod | 4 +- go.sum | 1 + 18 files changed, 482 insertions(+), 115 deletions(-) diff --git a/_vendor/modules.txt b/_vendor/modules.txt index 1a4ad2197dfa..5b934fd1d8dc 100644 --- a/_vendor/modules.txt +++ b/_vendor/modules.txt @@ -1,5 +1,5 @@ # github.com/moby/moby v28.1.0-rc.2+incompatible -# github.com/moby/buildkit v0.21.1 +# github.com/moby/buildkit v0.22.0-rc1 # github.com/docker/buildx v0.23.0 # github.com/docker/cli v28.1.1+incompatible # github.com/docker/compose/v2 v2.36.0 diff --git a/data/buildx/docker_buildx_build.yaml b/data/buildx/docker_buildx_build.yaml index 57a0d8cbfeac..91aca49cfc8a 100644 --- a/data/buildx/docker_buildx_build.yaml +++ b/data/buildx/docker_buildx_build.yaml @@ -187,16 +187,6 @@ options: experimentalcli: false kubernetes: false swarm: false - - option: detach - value_type: bool - default_value: "false" - description: Detach buildx server (supported only on linux) - deprecated: false - hidden: false - experimental: false - experimentalcli: true - kubernetes: false - swarm: false - option: file shorthand: f value_type: string @@ -415,15 +405,6 @@ options: experimentalcli: false kubernetes: false swarm: false - - option: root - value_type: string - description: Specify root directory of server to connect - deprecated: false - hidden: false - experimental: false - experimentalcli: true - kubernetes: false - swarm: false - option: sbom value_type: string description: Shorthand for `--attest=type=sbom` @@ -456,16 +437,6 @@ options: experimentalcli: false kubernetes: false swarm: false - - option: server-config - value_type: string - description: | - Specify buildx server config file (used only when launching new server) - deprecated: false - hidden: false - experimental: false - experimentalcli: true - kubernetes: false - swarm: false - option: shm-size value_type: bytes default_value: "0" diff --git a/data/buildx/docker_buildx_debug.yaml b/data/buildx/docker_buildx_debug.yaml index 90e6d0e8756a..f9b45c6ad3a0 100644 --- a/data/buildx/docker_buildx_debug.yaml +++ b/data/buildx/docker_buildx_debug.yaml @@ -9,16 +9,6 @@ cname: clink: - docker_buildx_debug_build.yaml options: - - option: detach - value_type: bool - default_value: "true" - description: Detach buildx server for the monitor (supported only on linux) - deprecated: false - hidden: false - experimental: false - experimentalcli: true - kubernetes: false - swarm: false - option: invoke value_type: string description: Launch a monitor with executing specified command @@ -49,25 +39,6 @@ options: experimentalcli: false kubernetes: false swarm: false - - option: root - value_type: string - description: Specify root directory of server to connect for the monitor - deprecated: false - hidden: false - experimental: false - experimentalcli: true - kubernetes: false - swarm: false - - option: server-config - value_type: string - description: | - Specify buildx server config file for the monitor (used only when launching new server) - deprecated: false - hidden: false - experimental: false - experimentalcli: true - kubernetes: false - swarm: false inherited_options: - option: builder value_type: string diff --git a/data/buildx/docker_buildx_debug_build.yaml b/data/buildx/docker_buildx_debug_build.yaml index e5e1b934a0ba..547ae9e122a4 100644 --- a/data/buildx/docker_buildx_debug_build.yaml +++ b/data/buildx/docker_buildx_debug_build.yaml @@ -176,16 +176,6 @@ options: experimentalcli: false kubernetes: false swarm: false - - option: detach - value_type: bool - default_value: "false" - description: Detach buildx server (supported only on linux) - deprecated: false - hidden: false - experimental: false - experimentalcli: true - kubernetes: false - swarm: false - option: file shorthand: f value_type: string @@ -394,15 +384,6 @@ options: experimentalcli: false kubernetes: false swarm: false - - option: root - value_type: string - description: Specify root directory of server to connect - deprecated: false - hidden: false - experimental: false - experimentalcli: true - kubernetes: false - swarm: false - option: sbom value_type: string description: Shorthand for `--attest=type=sbom` @@ -433,16 +414,6 @@ options: experimentalcli: false kubernetes: false swarm: false - - option: server-config - value_type: string - description: | - Specify buildx server config file (used only when launching new server) - deprecated: false - hidden: false - experimental: false - experimentalcli: true - kubernetes: false - swarm: false - option: shm-size value_type: bytes default_value: "0" diff --git a/data/buildx/docker_buildx_dial-stdio.yaml b/data/buildx/docker_buildx_dial-stdio.yaml index ca47c5afd741..4ba6f40e9af2 100644 --- a/data/buildx/docker_buildx_dial-stdio.yaml +++ b/data/buildx/docker_buildx_dial-stdio.yaml @@ -1,8 +1,10 @@ command: docker buildx dial-stdio short: Proxy current stdio streams to builder instance long: |- - dial-stdio uses the stdin and stdout streams of the command to proxy to the configured builder instance. - It is not intended to be used by humans, but rather by other tools that want to interact with the builder instance via BuildKit API. + dial-stdio uses the stdin and stdout streams of the command to proxy to the + configured builder instance. It is not intended to be used by humans, but + rather by other tools that want to interact with the builder instance via + BuildKit API. usage: docker buildx dial-stdio pname: docker buildx plink: docker_buildx.yaml @@ -50,7 +52,7 @@ inherited_options: swarm: false examples: |- Example go program that uses the dial-stdio command wire up a buildkit client. - This is for example use only and may not be suitable for production use. + This is, for example, use only and may not be suitable for production use. ```go client.New(ctx, "", client.WithContextDialer(func(context.Context, string) (net.Conn, error) { diff --git a/data/buildx/docker_buildx_history_export.yaml b/data/buildx/docker_buildx_history_export.yaml index e70b8f8fba95..214ebd004d20 100644 --- a/data/buildx/docker_buildx_history_export.yaml +++ b/data/buildx/docker_buildx_history_export.yaml @@ -1,14 +1,29 @@ command: docker buildx history export -short: Export a build into Docker Desktop bundle -long: Export a build into Docker Desktop bundle -usage: docker buildx history export [OPTIONS] [REF] +short: Export build records into Docker Desktop bundle +long: |- + Export one or more build records to `.dockerbuild` archive files. These archives + contain metadata, logs, and build outputs, and can be imported into Docker + Desktop or shared across environments. +usage: docker buildx history export [OPTIONS] [REF...] pname: docker buildx history plink: docker_buildx_history.yaml options: - option: all value_type: bool default_value: "false" - description: Export all records for the builder + description: Export all build records for the builder + details_url: '#all' + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false + - option: finalize + value_type: bool + default_value: "false" + description: Ensure build records are finalized before exporting + details_url: '#finalize' deprecated: false hidden: false experimental: false @@ -19,6 +34,7 @@ options: shorthand: o value_type: string description: Output file path + details_url: '#output' deprecated: false hidden: false experimental: false @@ -29,6 +45,7 @@ inherited_options: - option: builder value_type: string description: Override the configured builder instance + details_url: '#builder' deprecated: false hidden: false experimental: false @@ -40,12 +57,78 @@ inherited_options: value_type: bool default_value: "false" description: Enable debug logging + details_url: '#debug' deprecated: false hidden: false experimental: false experimentalcli: false kubernetes: false swarm: false +examples: |- + ### Export all build records to a file (--all) {#all} + + Use the `--all` flag and redirect the output: + + ```console + docker buildx history export --all > all-builds.dockerbuild + ``` + + Or use the `--output` flag: + + ```console + docker buildx history export --all -o all-builds.dockerbuild + ``` + + ### Use a specific builder instance (--builder) {#builder} + + ```console + docker buildx history export --builder builder0 ^1 -o builder0-build.dockerbuild + ``` + + ### Enable debug logging (--debug) {#debug} + + ```console + docker buildx history export --debug qu2gsuo8ejqrwdfii23xkkckt -o debug-build.dockerbuild + ``` + + ### Ensure build records are finalized before exporting (--finalize) {#finalize} + + Clients can report their own traces concurrently, and not all traces may be + saved yet by the time of the export. Use the `--finalize` flag to ensure all + traces are finalized before exporting. + + ```console + docker buildx history export --finalize qu2gsuo8ejqrwdfii23xkkckt -o finalized-build.dockerbuild + ``` + + ### Export a single build to a custom file (--output) {#output} + + ```console + docker buildx history export qu2gsuo8ejqrwdfii23xkkckt --output mybuild.dockerbuild + ``` + + You can find build IDs by running: + + ```console + docker buildx history ls + ``` + + To export two builds to separate files: + + ```console + # Using build IDs + docker buildx history export qu2gsuo8ejqrwdfii23xkkckt qsiifiuf1ad9pa9qvppc0z1l3 -o multi.dockerbuild + + # Or using relative offsets + docker buildx history export ^1 ^2 -o multi.dockerbuild + ``` + + Or use shell redirection: + + ```console + docker buildx history export ^1 > mybuild.dockerbuild + docker buildx history export ^2 > backend-build.dockerbuild + ``` deprecated: false hidden: false experimental: false diff --git a/data/buildx/docker_buildx_history_import.yaml b/data/buildx/docker_buildx_history_import.yaml index 089a7b328da0..bf6e2ac1fd07 100644 --- a/data/buildx/docker_buildx_history_import.yaml +++ b/data/buildx/docker_buildx_history_import.yaml @@ -1,7 +1,10 @@ command: docker buildx history import -short: Import a build into Docker Desktop -long: Import a build into Docker Desktop -usage: docker buildx history import [OPTIONS] < bundle.dockerbuild +short: Import build records into Docker Desktop +long: |- + Import a build record from a `.dockerbuild` archive into Docker Desktop. This + lets you view, inspect, and analyze builds created in other environments or CI + pipelines. +usage: docker buildx history import [OPTIONS] - pname: docker buildx history plink: docker_buildx_history.yaml options: @@ -10,6 +13,7 @@ options: value_type: stringArray default_value: '[]' description: Import from a file path + details_url: '#file' deprecated: false hidden: false experimental: false @@ -37,6 +41,30 @@ inherited_options: experimentalcli: false kubernetes: false swarm: false +examples: |- + ### Import a `.dockerbuild` archive from standard input + + ```console + docker buildx history import < mybuild.dockerbuild + ``` + + ### Import a build archive from a file (--file) {#file} + + ```console + docker buildx history import --file ./artifacts/backend-build.dockerbuild + ``` + + ### Open a build manually + + By default, the `import` command automatically opens the imported build in Docker + Desktop. You don't need to run `open` unless you're opening a specific build + or re-opening it later. + + If you've imported multiple builds, you can open one manually: + + ```console + docker buildx history open ci-build + ``` deprecated: false hidden: false experimental: false diff --git a/data/buildx/docker_buildx_history_inspect.yaml b/data/buildx/docker_buildx_history_inspect.yaml index 65bbe11d597f..23c5ee37b4eb 100644 --- a/data/buildx/docker_buildx_history_inspect.yaml +++ b/data/buildx/docker_buildx_history_inspect.yaml @@ -1,6 +1,9 @@ command: docker buildx history inspect -short: Inspect a build -long: Inspect a build +short: Inspect a build record +long: |- + Inspect a build record to view metadata such as duration, status, build inputs, + platforms, outputs, and attached artifacts. You can also use flags to extract + provenance, SBOMs, or other detailed information. usage: docker buildx history inspect [OPTIONS] [REF] pname: docker buildx history plink: docker_buildx_history.yaml @@ -42,11 +45,53 @@ inherited_options: kubernetes: false swarm: false examples: |- + ### Inspect the most recent build + + ```console + $ docker buildx history inspect + Name: buildx (binaries) + Context: . + Dockerfile: Dockerfile + VCS Repository: https://github.com/crazy-max/buildx.git + VCS Revision: f15eaa1ee324ffbbab29605600d27a84cab86361 + Target: binaries + Platforms: linux/amd64 + Keep Git Dir: true + + Started: 2025-02-07 11:56:24 + Duration: 1m 1s + Build Steps: 16/16 (25% cached) + + Image Resolve Mode: local + + Materials: + URI DIGEST + pkg:docker/docker/dockerfile@1 sha256:93bfd3b68c109427185cd78b4779fc82b484b0b7618e36d0f104d4d801e66d25 + pkg:docker/golang@1.23-alpine3.21?platform=linux%2Famd64 sha256:2c49857f2295e89b23b28386e57e018a86620a8fede5003900f2d138ba9c4037 + pkg:docker/tonistiigi/xx@1.6.1?platform=linux%2Famd64 sha256:923441d7c25f1e2eb5789f82d987693c47b8ed987c4ab3b075d6ed2b5d6779a3 + + Attachments: + DIGEST PLATFORM TYPE + sha256:217329d2af959d4f02e3a96dcbe62bf100cab1feb8006a047ddfe51a5397f7e3 https://slsa.dev/provenance/v0.2 + ``` + + ### Inspect a specific build + + ```console + # Using a build ID + docker buildx history inspect qu2gsuo8ejqrwdfii23xkkckt + + # Or using a relative offset + docker buildx history inspect ^1 + ``` + ### Format the output (--format) {#format} The formatting options (`--format`) pretty-prints the output to `pretty` (default), `json` or using a Go template. + #### Pretty output + ```console $ docker buildx history inspect Name: buildx (binaries) @@ -77,6 +122,8 @@ examples: |- Print build logs: docker buildx history logs g9808bwrjrlkbhdamxklx660b ``` + #### JSON output + ```console $ docker buildx history inspect --format json { @@ -130,6 +177,8 @@ examples: |- } ``` + #### Go template output + ```console $ docker buildx history inspect --format "{{.Name}}: {{.VCSRepository}} ({{.VCSRevision}})" buildx (binaries): https://github.com/crazy-max/buildx.git (f15eaa1ee324ffbbab29605600d27a84cab86361) diff --git a/data/buildx/docker_buildx_history_inspect_attachment.yaml b/data/buildx/docker_buildx_history_inspect_attachment.yaml index c43308120bba..ba883f474835 100644 --- a/data/buildx/docker_buildx_history_inspect_attachment.yaml +++ b/data/buildx/docker_buildx_history_inspect_attachment.yaml @@ -1,6 +1,9 @@ command: docker buildx history inspect attachment -short: Inspect a build attachment -long: Inspect a build attachment +short: Inspect a build record attachment +long: |- + Inspect a specific attachment from a build record, such as a provenance file or + SBOM. Attachments are optional artifacts stored with the build and may be + platform-specific. usage: docker buildx history inspect attachment [OPTIONS] REF [DIGEST] pname: docker buildx history inspect plink: docker_buildx_history_inspect.yaml @@ -17,6 +20,7 @@ options: - option: type value_type: string description: Type of attachment + details_url: '#type' deprecated: false hidden: false experimental: false @@ -44,6 +48,64 @@ inherited_options: experimentalcli: false kubernetes: false swarm: false +examples: |- + ### Inspect a provenance attachment from a build (--type) {#type} + + Supported types include `provenance` and `sbom`. + + ```console + $ docker buildx history inspect attachment qu2gsuo8ejqrwdfii23xkkckt --type provenance + { + "_type": "https://slsa.dev/provenance/v0.2", + "buildDefinition": { + "buildType": "https://build.docker.com/BuildKit@v1", + "externalParameters": { + "target": "app", + "platforms": ["linux/amd64"] + } + }, + "runDetails": { + "builder": "docker", + "by": "ci@docker.com" + } + } + ``` + + ### Inspect a SBOM for linux/amd64 + + ```console + $ docker buildx history inspect attachment ^0 \ + --type sbom \ + --platform linux/amd64 + { + "bomFormat": "CycloneDX", + "specVersion": "1.5", + "version": 1, + "components": [ + { + "type": "library", + "name": "alpine", + "version": "3.18.2" + } + ] + } + ``` + + ### Inspect an attachment by digest + + You can inspect an attachment directly using its digset, which you can get from + the `inspect` output: + + ```console + # Using a build ID + docker buildx history inspect attachment qu2gsuo8ejqrwdfii23xkkckt sha256:abcdef123456... + + # Or using a relative offset + docker buildx history inspect attachment ^0 sha256:abcdef123456... + ``` + + Use `--type sbom` or `--type provenance` to filter attachments by type. To + inspect a specific attachment by digest, omit the `--type` flag. deprecated: false hidden: false experimental: false diff --git a/data/buildx/docker_buildx_history_logs.yaml b/data/buildx/docker_buildx_history_logs.yaml index c6afba47cda9..3a15e9efd24d 100644 --- a/data/buildx/docker_buildx_history_logs.yaml +++ b/data/buildx/docker_buildx_history_logs.yaml @@ -1,6 +1,15 @@ command: docker buildx history logs -short: Print the logs of a build -long: Print the logs of a build +short: Print the logs of a build record +long: |- + Print the logs for a completed build. The output appears in the same format as + `--progress=plain`, showing the full logs for each step. + + By default, this shows logs for the most recent build on the current builder. + + You can also specify an earlier build using an offset. For example: + + - `^1` shows logs for the build before the most recent + - `^2` shows logs for the build two steps back usage: docker buildx history logs [OPTIONS] [REF] pname: docker buildx history plink: docker_buildx_history.yaml @@ -9,6 +18,7 @@ options: value_type: string default_value: plain description: Set type of progress output (plain, rawjson, tty) + details_url: '#progress' deprecated: false hidden: false experimental: false @@ -36,6 +46,42 @@ inherited_options: experimentalcli: false kubernetes: false swarm: false +examples: |- + ### Print logs for the most recent build + + ```console + $ docker buildx history logs + #1 [internal] load build definition from Dockerfile + #1 transferring dockerfile: 31B done + #1 DONE 0.0s + #2 [internal] load .dockerignore + #2 transferring context: 2B done + #2 DONE 0.0s + ... + ``` + + By default, this shows logs for the most recent build on the current builder. + + ### Print logs for a specific build + + To print logs for a specific build, use a build ID or offset: + + ```console + # Using a build ID + docker buildx history logs qu2gsuo8ejqrwdfii23xkkckt + + # Or using a relative offset + docker buildx history logs ^1 + ``` + + ### Set type of progress output (--progress) {#progress} + + ```console + $ docker buildx history logs ^1 --progress rawjson + {"id":"buildx_step_1","status":"START","timestamp":"2024-05-01T12:34:56.789Z","detail":"[internal] load build definition from Dockerfile"} + {"id":"buildx_step_1","status":"COMPLETE","timestamp":"2024-05-01T12:34:57.001Z","duration":212000000} + ... + ``` deprecated: false hidden: false experimental: false diff --git a/data/buildx/docker_buildx_history_ls.yaml b/data/buildx/docker_buildx_history_ls.yaml index ab7a3abbb3b1..d49eec62ce7b 100644 --- a/data/buildx/docker_buildx_history_ls.yaml +++ b/data/buildx/docker_buildx_history_ls.yaml @@ -1,7 +1,12 @@ command: docker buildx history ls short: List build records -long: List build records -usage: docker buildx history ls +long: |- + List completed builds recorded by the active builder. Each entry includes the + build ID, name, status, timestamp, and duration. + + By default, only records for the current builder are shown. You can filter + results using flags. +usage: docker buildx history ls [OPTIONS] pname: docker buildx history plink: docker_buildx_history.yaml options: @@ -9,6 +14,7 @@ options: value_type: stringArray default_value: '[]' description: Provide filter values (e.g., `status=error`) + details_url: '#filter' deprecated: false hidden: false experimental: false @@ -19,6 +25,7 @@ options: value_type: string default_value: table description: Format the output + details_url: '#format' deprecated: false hidden: false experimental: false @@ -29,6 +36,7 @@ options: value_type: bool default_value: "false" description: List records for current repository only + details_url: '#local' deprecated: false hidden: false experimental: false @@ -39,6 +47,7 @@ options: value_type: bool default_value: "false" description: Don't truncate output + details_url: '#no-trunc' deprecated: false hidden: false experimental: false @@ -66,6 +75,80 @@ inherited_options: experimentalcli: false kubernetes: false swarm: false +examples: |- + ### List all build records for the current builder + + ```console + $ docker buildx history ls + BUILD ID NAME STATUS CREATED AT DURATION + qu2gsuo8ejqrwdfii23xkkckt .dev/2850 Completed 3 days ago 1.4s + qsiifiuf1ad9pa9qvppc0z1l3 .dev/2850 Completed 3 days ago 1.3s + g9808bwrjrlkbhdamxklx660b .dev/3120 Completed 5 days ago 2.1s + ``` + + ### List failed builds (--filter) {#filter} + + ```console + docker buildx history ls --filter status=error + ``` + + You can filter the list using the `--filter` flag. Supported filters include: + + | Filter | Supported comparisons | Example | + |:---------------------------------------|:-------------------------------------------------|:---------------------------| + | `ref`, `repository`, `status` | Support `=` and `!=` comparisons | `--filter status!=success` | + | `startedAt`, `completedAt`, `duration` | Support `<` and `>` comparisons with time values | `--filter duration>30s` | + + You can combine multiple filters by repeating the `--filter` flag: + + ```console + docker buildx history ls --filter status=error --filter duration>30s + ``` + + ### List builds from the current project (--local) {#local} + + ```console + docker buildx history ls --local + ``` + + ### Display full output without truncation (--no-trunc) {#no-trunc} + + ```console + docker buildx history ls --no-trunc + ``` + + ### Format output (--format) {#format} + + #### JSON output + + ```console + $ docker buildx history ls --format json + [ + { + "ID": "qu2gsuo8ejqrwdfii23xkkckt", + "Name": ".dev/2850", + "Status": "Completed", + "CreatedAt": "2025-04-15T12:33:00Z", + "Duration": "1.4s" + }, + { + "ID": "qsiifiuf1ad9pa9qvppc0z1l3", + "Name": ".dev/2850", + "Status": "Completed", + "CreatedAt": "2025-04-15T12:29:00Z", + "Duration": "1.3s" + } + ] + ``` + + #### Go template output + + ```console + $ docker buildx history ls --format '{{.Name}} - {{.Duration}}' + .dev/2850 - 1.4s + .dev/2850 - 1.3s + .dev/3120 - 2.1s + ``` deprecated: false hidden: false experimental: false diff --git a/data/buildx/docker_buildx_history_open.yaml b/data/buildx/docker_buildx_history_open.yaml index e79b0ba56997..1b760fcf6456 100644 --- a/data/buildx/docker_buildx_history_open.yaml +++ b/data/buildx/docker_buildx_history_open.yaml @@ -1,6 +1,8 @@ command: docker buildx history open -short: Open a build in Docker Desktop -long: Open a build in Docker Desktop +short: Open a build record in Docker Desktop +long: |- + Open a build record in Docker Desktop for visual inspection. This requires + Docker Desktop to be installed and running on the host machine. usage: docker buildx history open [OPTIONS] [REF] pname: docker buildx history plink: docker_buildx_history.yaml @@ -25,6 +27,24 @@ inherited_options: experimentalcli: false kubernetes: false swarm: false +examples: |- + ### Open the most recent build in Docker Desktop + + ```console + docker buildx history open + ``` + + By default, this opens the most recent build on the current builder. + + ### Open a specific build + + ```console + # Using a build ID + docker buildx history open qu2gsuo8ejqrwdfii23xkkckt + + # Or using a relative offset + docker buildx history open ^1 + ``` deprecated: false hidden: false experimental: false diff --git a/data/buildx/docker_buildx_history_rm.yaml b/data/buildx/docker_buildx_history_rm.yaml index aa3ddd173cbb..2c35a7277587 100644 --- a/data/buildx/docker_buildx_history_rm.yaml +++ b/data/buildx/docker_buildx_history_rm.yaml @@ -1,6 +1,9 @@ command: docker buildx history rm short: Remove build records -long: Remove build records +long: |- + Remove one or more build records from the current builder’s history. You can + remove specific builds by ID or offset, or delete all records at once using + the `--all` flag. usage: docker buildx history rm [OPTIONS] [REF...] pname: docker buildx history plink: docker_buildx_history.yaml @@ -9,6 +12,7 @@ options: value_type: bool default_value: "false" description: Remove all build records + details_url: '#all' deprecated: false hidden: false experimental: false @@ -36,6 +40,32 @@ inherited_options: experimentalcli: false kubernetes: false swarm: false +examples: |- + ### Remove a specific build + + ```console + # Using a build ID + docker buildx history rm qu2gsuo8ejqrwdfii23xkkckt + + # Or using a relative offset + docker buildx history rm ^1 + ``` + + ### Remove multiple builds + + ```console + # Using build IDs + docker buildx history rm qu2gsuo8ejqrwdfii23xkkckt qsiifiuf1ad9pa9qvppc0z1l3 + + # Or using relative offsets + docker buildx history rm ^1 ^2 + ``` + + ### Remove all build records from the current builder (--all) {#all} + + ```console + docker buildx history rm --all + ``` deprecated: false hidden: false experimental: false diff --git a/data/buildx/docker_buildx_history_trace.yaml b/data/buildx/docker_buildx_history_trace.yaml index 54a4f4cd7873..866f7673843d 100644 --- a/data/buildx/docker_buildx_history_trace.yaml +++ b/data/buildx/docker_buildx_history_trace.yaml @@ -1,6 +1,10 @@ command: docker buildx history trace short: Show the OpenTelemetry trace of a build record -long: Show the OpenTelemetry trace of a build record +long: |- + View the OpenTelemetry trace for a completed build. This command loads the + trace into a Jaeger UI viewer and opens it in your browser. + + This helps analyze build performance, step timing, and internal execution flows. usage: docker buildx history trace [OPTIONS] [REF] pname: docker buildx history plink: docker_buildx_history.yaml @@ -9,6 +13,7 @@ options: value_type: string default_value: 127.0.0.1:0 description: Address to bind the UI server + details_url: '#addr' deprecated: false hidden: false experimental: false @@ -17,7 +22,8 @@ options: swarm: false - option: compare value_type: string - description: Compare with another build reference + description: Compare with another build record + details_url: '#compare' deprecated: false hidden: false experimental: false @@ -45,6 +51,50 @@ inherited_options: experimentalcli: false kubernetes: false swarm: false +examples: |- + ### Open the OpenTelemetry trace for the most recent build + + This command starts a temporary Jaeger UI server and opens your default browser + to view the trace. + + ```console + docker buildx history trace + ``` + + ### Open the trace for a specific build + + ```console + # Using a build ID + docker buildx history trace qu2gsuo8ejqrwdfii23xkkckt + + # Or using a relative offset + docker buildx history trace ^1 + ``` + + ### Run the Jaeger UI on a specific port (--addr) {#addr} + + ```console + # Using a build ID + docker buildx history trace qu2gsuo8ejqrwdfii23xkkckt --addr 127.0.0.1:16686 + + # Or using a relative offset + docker buildx history trace ^1 --addr 127.0.0.1:16686 + ``` + + ### Compare two build traces (--compare) {#compare} + + Compare two specific builds by name: + + ```console + # Using build IDs + docker buildx history trace --compare=qu2gsuo8ejqrwdfii23xkkckt qsiifiuf1ad9pa9qvppc0z1l3 + + # Or using a single relative offset + docker buildx history trace --compare=^1 + ``` + + When you use a single reference with `--compare`, it compares that build + against the most recent one. deprecated: false hidden: false experimental: false diff --git a/data/buildx/docker_buildx_imagetools_create.yaml b/data/buildx/docker_buildx_imagetools_create.yaml index 4bcb085db3dd..3ade4138ddc9 100644 --- a/data/buildx/docker_buildx_imagetools_create.yaml +++ b/data/buildx/docker_buildx_imagetools_create.yaml @@ -10,7 +10,7 @@ long: |- a list or index, the output will be a manifest list, however you can disable this behavior with `--prefer-index=false` which attempts to preserve the source manifest format in the output. -usage: docker buildx imagetools create [OPTIONS] [SOURCE] [SOURCE...] +usage: docker buildx imagetools create [OPTIONS] [SOURCE...] pname: docker buildx imagetools plink: docker_buildx_imagetools.yaml options: diff --git a/data/buildx/docker_buildx_rm.yaml b/data/buildx/docker_buildx_rm.yaml index 94eed6c8da39..b5c632ebed1c 100644 --- a/data/buildx/docker_buildx_rm.yaml +++ b/data/buildx/docker_buildx_rm.yaml @@ -3,7 +3,7 @@ short: Remove one or more builder instances long: |- Removes the specified or current builder. It is a no-op attempting to remove the default builder. -usage: docker buildx rm [OPTIONS] [NAME] [NAME...] +usage: docker buildx rm [OPTIONS] [NAME...] pname: docker buildx plink: docker_buildx.yaml options: diff --git a/go.mod b/go.mod index ebea548b95ec..8a6351f1176c 100644 --- a/go.mod +++ b/go.mod @@ -7,12 +7,12 @@ require ( github.com/docker/cli v28.1.1+incompatible // indirect github.com/docker/compose/v2 v2.36.0 // indirect github.com/docker/scout-cli v1.15.0 // indirect - github.com/moby/buildkit v0.21.1 // indirect + github.com/moby/buildkit v0.22.0-rc1 // indirect github.com/moby/moby v28.1.0-rc.2+incompatible // indirect ) replace ( - github.com/docker/buildx => github.com/docker/buildx v0.23.0 + github.com/docker/buildx => github.com/docker/buildx v0.24.0-rc1 github.com/docker/cli => github.com/docker/cli v28.1.0-rc.2+incompatible github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.36.0 github.com/docker/scout-cli => github.com/docker/scout-cli v1.15.0 diff --git a/go.sum b/go.sum index 8e4053f2ce26..334f8f05b280 100644 --- a/go.sum +++ b/go.sum @@ -104,6 +104,7 @@ github.com/docker/buildx v0.22.0 h1:pGTcGZa+kxpYUlM/6ACsp1hXhkEDulz++RNXPdE8Afk= github.com/docker/buildx v0.22.0/go.mod h1:ThbnUe4kNiStlq6cLXruElyEdSTdPL3k/QerNUmPvHE= github.com/docker/buildx v0.23.0 h1:qoYhuWyZ6PVCrWbkxClLzBWDBCUkyFK6Chjzg6nU+V8= github.com/docker/buildx v0.23.0/go.mod h1:y/6Zf/y3Bf0zTWqgg8PuNFATcqnuhFmQuNf4VyrnPtg= +github.com/docker/buildx v0.24.0-rc1/go.mod h1:poh1qI/j0EMizaPUArN/l9gWKNKQDeLpJ66ZOIo96hE= github.com/docker/cli v24.0.2+incompatible h1:QdqR7znue1mtkXIJ+ruQMGQhpw2JzMJLRXp6zpzF6tM= github.com/docker/cli v24.0.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v24.0.4+incompatible h1:Y3bYF9ekNTm2VFz5U/0BlMdJy73D+Y1iAAZ8l63Ydzw= From 2884f735cab20aa8fd1df4af049f1927a877aff4 Mon Sep 17 00:00:00 2001 From: David Scott Date: Thu, 15 May 2025 13:19:59 +0100 Subject: [PATCH 399/699] troubleshooting: mention specific HCS_E_HYPERV_NOT_INSTALLED error code (#22645) ## Description Improve the troubleshooting docs for Desktop, inspired by tickets like https://github.com/docker/for-win/issues/14743 The troubleshooting contains the relevant info, but this PR - explicitly mentions a common error code (hopefully helping people find this advice) - emphasises that, in WSL 2 mode, WSL 2 commands must be working before Docker Desktop can start - highlight a common scenario where an android emulator is installed which disables Hyper-V (because it uses a conflicting hypervisor) The structure is currently - WSL 2 only - Hyper-V only - Common to both So add links to the WSL 2 section to the common section to make sure people realise it's relevant. ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Signed-off-by: David Scott Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- .../troubleshoot/topics.md | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/content/manuals/desktop/troubleshoot-and-support/troubleshoot/topics.md b/content/manuals/desktop/troubleshoot-and-support/troubleshoot/topics.md index ba3ff6953ae1..a234191093c9 100644 --- a/content/manuals/desktop/troubleshoot-and-support/troubleshoot/topics.md +++ b/content/manuals/desktop/troubleshoot-and-support/troubleshoot/topics.md @@ -343,13 +343,21 @@ Also, the `\` character has a special meaning in Git Bash. Portability of the scripts is not affected as Linux treats multiple `/` as a single entry. -### Docker Desktop fails due to Virtualization settings +### Docker Desktop fails due to Virtualization not working + +#### Error message + +A typical error message is "Docker Desktop - Unexpected WSL error" mentioning the error code +`Wsl/Service/RegisterDistro/CreateVm/HCS/HCS_E_HYPERV_NOT_INSTALLED`. Manually executing `wsl` commands +also fails with the same error code. #### Cause - Virtualization settings are disabled in the BIOS. - Windows Hyper-V or WSL 2 components are missing. +Note some third-party software such as Android emulators will disable Hyper-V on install. + #### Solutions Your machine must have the following features for Docker Desktop to function correctly: @@ -364,6 +372,21 @@ Your machine must have the following features for Docker Desktop to function cor ![WSL 2 enabled](../../images/wsl2-enabled.png) +It must be possible to run WSL 2 commands without error, for example: + +```console +PS C:\users\> wsl -l -v + NAME STATE VERSION +* Ubuntu Running 2 + docker-desktop Stopped 2 +PS C:\users\> wsl -d docker-desktop echo WSL 2 is working +WSL 2 is working +``` + +If the features are enabled but the commands are not working, first check [Virtualization is turned on](#virtualization-must-be-turned-on) +then [enable the Hypervisor at Windows startup](#hypervisor-enabled-at-windows-startup) if required. If running Docker +Desktop in a Virtual Machine, ensure [the hypervisor has nested virtualization enabled](#turn-on-nested-virtualization). + ##### Hyper-V On Windows 10 Pro or Enterprise, you can also use Hyper-V with the following features enabled: From fddfedc2b77d204bed4f86a338f6e6a4ca311532 Mon Sep 17 00:00:00 2001 From: Andreas Heck Date: Thu, 15 May 2025 15:01:55 +0200 Subject: [PATCH 400/699] =?UTF-8?q?Fix=20the=20incorrect=20info=20to=20use?= =?UTF-8?q?=20a=20space=20between=20orgs=20for=20registry=20signi=E2=80=A6?= =?UTF-8?q?=20(#22649)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …n enforcement ## Description We currently tell users to use a space between orgs when enforcing sign-in with multiple orgs via Windows registry. This is just not true. Multiple orgs have to be separated by being on multiple lines. Otherwise it will not work. ## Related issues or tickets https://docker.atlassian.net/browse/DDB-227 ## Reviews @aevesdocker - [ ] Technical review - [x] Editorial review - [ ] Product review --------- Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- content/manuals/security/for-admins/enforce-sign-in/methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/security/for-admins/enforce-sign-in/methods.md b/content/manuals/security/for-admins/enforce-sign-in/methods.md index 2f590b64c442..d7b30d6e61e5 100644 --- a/content/manuals/security/for-admins/enforce-sign-in/methods.md +++ b/content/manuals/security/for-admins/enforce-sign-in/methods.md @@ -27,7 +27,7 @@ To enforce sign-in for Docker Desktop on Windows, you can configure a registry k > [!IMPORTANT] > > As of Docker Desktop version 4.36 and later, you can add more than one organization. With Docker Desktop version 4.35 and earlier, if you add more than one organization sign-in enforcement silently fails. -3. Use your organization's name, all lowercase as string data. If you're adding more than one organization, make sure there is an empty space between each organization name. +3. Use your organization's name, all lowercase as string data. If you're adding more than one organization, make sure they are all on their own line. Don't use any other separators such as spaces or commas. 4. Restart Docker Desktop. 5. When Docker Desktop restarts, verify that the **Sign in required!** prompt appears. From 8462d615783f147db907888ac1e6c744f5dc3f70 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Thu, 15 May 2025 16:23:35 +0200 Subject: [PATCH 401/699] Update buildkit reference to v0.22.0-rc1 Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- .../frontend/dockerfile/docs/reference.md | 84 ++++++++++++++++++- go.mod | 2 +- go.sum | 2 + 3 files changed, 86 insertions(+), 2 deletions(-) diff --git a/_vendor/github.com/moby/buildkit/frontend/dockerfile/docs/reference.md b/_vendor/github.com/moby/buildkit/frontend/dockerfile/docs/reference.md index 0afa620e2cd2..c5105e524876 100644 --- a/_vendor/github.com/moby/buildkit/frontend/dockerfile/docs/reference.md +++ b/_vendor/github.com/moby/buildkit/frontend/dockerfile/docs/reference.md @@ -689,7 +689,8 @@ EOF The available `[OPTIONS]` for the `RUN` instruction are: | Option | Minimum Dockerfile version | -| ------------------------------- | -------------------------- | +|---------------------------------|----------------------------| +| [`--device`](#run---device) | 1.14-labs | | [`--mount`](#run---mount) | 1.2 | | [`--network`](#run---network) | 1.3 | | [`--security`](#run---security) | 1.1.2-labs | @@ -707,6 +708,87 @@ guide](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practi The cache for `RUN` instructions can be invalidated by [`ADD`](#add) and [`COPY`](#copy) instructions. +### RUN --device + +> [!NOTE] +> Not yet available in stable syntax, use [`docker/dockerfile:1-labs`](#syntax) +> version. It also needs BuildKit 0.20.0 or later. + +```dockerfile +RUN --device=name,[required] +``` + +`RUN --device` allows build to request [CDI devices](https://github.com/moby/buildkit/blob/master/docs/cdi.md) +to be available to the build step. + +The device `name` is provided by the CDI specification registered in BuildKit. + +In the following example, multiple devices are registered in the CDI +specification for the `vendor1.com/device` vendor. + +```yaml +cdiVersion: "0.6.0" +kind: "vendor1.com/device" +devices: + - name: foo + containerEdits: + env: + - FOO=injected + - name: bar + annotations: + org.mobyproject.buildkit.device.class: class1 + containerEdits: + env: + - BAR=injected + - name: baz + annotations: + org.mobyproject.buildkit.device.class: class1 + containerEdits: + env: + - BAZ=injected + - name: qux + annotations: + org.mobyproject.buildkit.device.class: class2 + containerEdits: + env: + - QUX=injected +``` + +The device name format is flexible and accepts various patterns to support +multiple device configurations: + +* `vendor1.com/device`: request the first device found for this vendor +* `vendor1.com/device=foo`: request a specific device +* `vendor1.com/device=*`: request all devices for this vendor +* `class1`: request devices by `org.mobyproject.buildkit.device.class` annotation + +#### Example: CUDA-Powered LLaMA Inference + +In this example we use the `--device` flag to run `llama.cpp` inference using +an NVIDIA GPU device through CDI: + +```dockerfile +# syntax=docker/dockerfile:1-labs + +FROM scratch AS model +ADD https://huggingface.co/bartowski/Llama-3.2-1B-Instruct-GGUF/resolve/main/Llama-3.2-1B-Instruct-Q4_K_M.gguf /model.gguf + +FROM scratch AS prompt +COPY < github.com/docker/cli v28.1.0-rc.2+incompatible github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.36.0 github.com/docker/scout-cli => github.com/docker/scout-cli v1.15.0 - github.com/moby/buildkit => github.com/moby/buildkit v0.20.0 + github.com/moby/buildkit => github.com/moby/buildkit v0.22.0-rc1 github.com/moby/moby => github.com/moby/moby v28.1.0-rc.2+incompatible ) diff --git a/go.sum b/go.sum index 334f8f05b280..21006819ab14 100644 --- a/go.sum +++ b/go.sum @@ -372,6 +372,8 @@ github.com/moby/buildkit v0.19.0 h1:w9G1p7sArvCGNkpWstAqJfRQTXBKukMyMK1bsah1HNo= github.com/moby/buildkit v0.19.0/go.mod h1:WiHBFTgWV8eB1AmPxIWsAlKjUACAwm3X/14xOV4VWew= github.com/moby/buildkit v0.20.0 h1:aF5RujjQ310Pn6SLL/wQYIrSsPXy0sQ5KvWifwq1h8Y= github.com/moby/buildkit v0.20.0/go.mod h1:HYFUIK+iGDRxRgdphZ9Nv0y1Fz7mv0HrU7xZoXx217E= +github.com/moby/buildkit v0.22.0-rc1 h1:Q47jZZws7+0WhucTcm35NRV8NcO6n1SwIikzfqcGKLo= +github.com/moby/buildkit v0.22.0-rc1/go.mod h1:j4pP5hxiTWcz7xuTK2cyxQislHl/N2WWHzOy43DlLJw= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/moby v24.0.2+incompatible h1:yH+5dRHH1x3XRKzl1THA2aGTy6CHYnkt5N924ADMax8= github.com/moby/moby v24.0.2+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= From 802ee25399b067f6e7e778b7f1519610231ab819 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Thu, 15 May 2025 16:14:43 +0100 Subject: [PATCH 402/699] codeowners refresh (#22646) ## Description It's time ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- .github/CODEOWNERS | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 9194fe697eac..5c0e55719ca0 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -3,9 +3,9 @@ # For more details, see https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners -/content/manuals/build/ @crazy-max @aevesdocker +/content/manuals/build/ @crazy-max @ArthurFlag -/content/manuals/build-cloud/ @crazy-max @aevesdocker +/content/manuals/build-cloud/ @crazy-max @craig-osterhout /content/manuals/compose/ @aevesdocker @@ -19,11 +19,11 @@ /content/manuals/docker-hub/ @craig-osterhout -/content/manuals/engine/ @thaJeztah @aevesdocker +/content/manuals/engine/ @thaJeztah @ArthurFlag -/content/reference/api/engine/ @thaJeztah @aevesdocker +/content/reference/api/engine/ @thaJeztah @ArthurFlag -/content/reference/cli/ @thaJeztah @aevesdocker +/content/reference/cli/ @thaJeztah @ArthurFlag /content/manuals/subscription/ @sarahsanders-docker @@ -43,4 +43,4 @@ /content/manuals/ai/ @ArthurFlag -/_vendor @sarahsanders-docker +/_vendor @sarahsanders-docker @ArthurFlag From 620d65470861c4c388f21545d748f13c85994514 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Fri, 16 May 2025 07:32:41 +0100 Subject: [PATCH 403/699] security: update sec announcements with latest CVE fixes (#22648) ## Description As per https://docker.atlassian.net/browse/ENGDOCS-2608 ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/security/security-announcements.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/content/manuals/security/security-announcements.md b/content/manuals/security/security-announcements.md index 32918133b4f5..eed5615e4512 100644 --- a/content/manuals/security/security-announcements.md +++ b/content/manuals/security/security-announcements.md @@ -7,6 +7,18 @@ toc_min: 1 toc_max: 2 --- +## Docker Desktop 4.41.0 Security Update: CVE-2025-3224, CVE-2025-4095, and CVE-2025-3911 + +_Last updated May 15, 2025_ + +Three vulnerabilities in Docker Desktop were fixed on April 28 in the [4.41.0](https://docs.docker.com/desktop/release-notes/#4410) release. + +- Fixed [CVE-2025-3224](https://www.cve.org/CVERecord?id=CVE-2025-3224) allowing an attacker with access to a user machine to perform an elevation of privilege when Docker Desktop updates. +- Fixed [CVE-2025-4095](https://www.cve.org/CVERecord?id=CVE-2025-4095) where Registry Access Management (RAM) policies were not enforced when using a MacOS configuration profile, allowing users to pull images from unapproved registries. +- Fixed [CVE-2025-3911](https://www.cve.org/CVERecord?id=CVE-2025-3911) allowing an attacker with read access to a user's machine to obtain sensitive information from Docker Desktop log files, including environment variables configured for running containers. + +We strongly encourage you to update to Docker Desktop [4.41.0](https://docs.docker.com/desktop/release-notes/#4410). + ## Docker Desktop 4.34.2 Security Update: CVE-2024-8695 and CVE-2024-8696 _Last updated September 13, 2024_ From 50bd730573726fac87bb1c013ddc0bc8f4891211 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Fri, 16 May 2025 08:57:07 +0100 Subject: [PATCH 404/699] dmr hugging face addition (#22526) ## Description Add ability to pull from Hugging Face ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/ai/model-runner.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/content/manuals/ai/model-runner.md b/content/manuals/ai/model-runner.md index 65fe85622858..4f7af95db1b1 100644 --- a/content/manuals/ai/model-runner.md +++ b/content/manuals/ai/model-runner.md @@ -97,6 +97,22 @@ Model ai/smollm2 pulled successfully The models also display in the Docker Desktop Dashboard. +#### Pull from Hugging Face + +You can also pull GGUF models directly from [Hugging Face](https://huggingface.co/models?library=gguf). + +```console +$ docker model pull hf.co/ +``` + +For example: + +```console +$ docker model pull hf.co/bartowski/Llama-3.2-1B-Instruct-GGUF +``` + +Pulls the [bartowski/Llama-3.2-1B-Instruct-GGUF](https://huggingface.co/bartowski/Llama-3.2-1B-Instruct-GGUF). + ### List available models Lists all models currently pulled to your local environment. From bb05661cbceef122ff49a17a88156a2487518292 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Fri, 16 May 2025 15:50:30 +0300 Subject: [PATCH 405/699] Merge pull request #22657 from duffuniverse/fix-link-to-release-note-for-multiple-exporters-feature Fix link to release note for multiple exporters feature --- data/summary.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/summary.yaml b/data/summary.yaml index e24ad0ca8f50..ffc4c9be37cf 100644 --- a/data/summary.yaml +++ b/data/summary.yaml @@ -30,7 +30,7 @@ Build dockerfile inline: Build entitlements: requires: Docker Compose [2.27.1](/manuals/compose/releases/release-notes.md#2271) and later Build multiple exporters: - requires: Docker Buildx [0.13.0]((/manuals/build/release-notes.md#0130) and later + requires: Docker Buildx [0.13.0](/manuals/build/release-notes.md#0130) and later Buildkit host: requires: Docker Buildx [0.9.0](/manuals/build/release-notes.md#090) and later Build privileged: From 4fd64ac50b91fb8e5f0cc06b3a3034f61c14a7e5 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Fri, 16 May 2025 14:24:04 +0100 Subject: [PATCH 406/699] Compose: spec updates (#22655) ## Description Spec updates on the new attributes released last week (plus some extra - adds https://github.com/docker/compose/pull/12769 ) ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- _vale/config/vocabularies/Docker/accept.txt | 1 + .../how-tos/environment-variables/envvars.md | 10 +++ content/reference/compose-file/build.md | 11 ++- content/reference/compose-file/services.md | 77 +++++++++++++++++-- data/summary.yaml | 4 + 5 files changed, 94 insertions(+), 9 deletions(-) diff --git a/_vale/config/vocabularies/Docker/accept.txt b/_vale/config/vocabularies/Docker/accept.txt index f2621ae38394..3ee7f04c4221 100644 --- a/_vale/config/vocabularies/Docker/accept.txt +++ b/_vale/config/vocabularies/Docker/accept.txt @@ -153,6 +153,7 @@ Zsh [Ss]warm [Ss]yscalls? [Ss]ysfs +[Tt]eardown [Tt]oolchains? [Uu]narchived? [Uu]ngated diff --git a/content/manuals/compose/how-tos/environment-variables/envvars.md b/content/manuals/compose/how-tos/environment-variables/envvars.md index 67d5929673fa..430a719f509d 100644 --- a/content/manuals/compose/how-tos/environment-variables/envvars.md +++ b/content/manuals/compose/how-tos/environment-variables/envvars.md @@ -26,6 +26,7 @@ This page contains information on how you can set or change the following pre-de - `COMPOSE_ENV_FILES` - `COMPOSE_MENU` - `COMPOSE_EXPERIMENTAL` +- `COMPOSE_PROGRESS` ## Methods to override @@ -192,6 +193,15 @@ This is an opt-out variable. When turned off it deactivates the experimental fea - `false` or `0`, to disable - Defaults to: `1` +### COMPOSE\_PROGRESS + +{{< summary-bar feature_name="Compose progress" >}} + +Defines the type of progress output, if `--progress` isn't used. + +Supported values are `auto`, `tty`, `plain`, `json`, and `quiet`. +Default is `auto`. + ## Unsupported in Compose V2 The following environment variables have no effect in Compose V2. diff --git a/content/reference/compose-file/build.md b/content/reference/compose-file/build.md index 0d8706611c7c..ed0b9d5f97e2 100644 --- a/content/reference/compose-file/build.md +++ b/content/reference/compose-file/build.md @@ -466,8 +466,7 @@ The long syntax provides more granularity in how the secret is created within the service's containers. - `source`: The name of the secret as it exists on the platform. -- `target`: The name of the file to be mounted in `/run/secrets/` in the - service's task containers. Defaults to `source` if not specified. +- `target`: The ID of the secret as declared in the Dockerfile. Defaults to `source` if not specified. - `uid` and `gid`: The numeric uid or gid that owns the file within `/run/secrets/` in the service's task containers. Default value is `USER`. - `mode`: The [permissions](https://wintelguy.com/permissions-calc.pl) for the file to be mounted in `/run/secrets/` @@ -487,7 +486,7 @@ services: context: . secrets: - source: server-certificate - target: server.cert + target: cert # secret ID in Dockerfile uid: "103" gid: "103" mode: 0440 @@ -496,6 +495,12 @@ secrets: external: true ``` +```dockerfile +# Dockerfile +FROM nginx +RUN --mount=type=secret,id=cert,required=true,target=/root/cert ... +``` + Service builds may be granted access to multiple secrets. Long and short syntax for secrets may be used in the same Compose file. Defining a secret in the top-level `secrets` must not imply granting any service build access to it. Such grant must be explicit within service specification as [secrets](services.md#secrets) service element. diff --git a/content/reference/compose-file/services.md b/content/reference/compose-file/services.md index 56eb4e95f3d9..f663085c0a7a 100644 --- a/content/reference/compose-file/services.md +++ b/content/reference/compose-file/services.md @@ -1395,9 +1395,31 @@ services: - mysql networks: - front-tier: - back-tier: - admin: + front-tier: {} + back-tier: {} + admin: {} +``` + +### `interface_name` + +{{< summary-bar feature_name="Compose interface-name" >}} + +`interface_name` lets you specify the name of the network interface used to connect a service to a given network. This ensures consistent and predictable interface naming across services and networks. + +```yaml +services: + backend: + image: alpine + command: ip link show + networks: + back-tier: + interface_name: eth0 +``` + +Running the example Compose application shows: + +```console +backend-1 | 11: eth0@if64: mtu 1500 qdisc noqueue state UP ``` #### `ipv4_address`, `ipv6_address` @@ -1693,6 +1715,46 @@ services: - debug ``` +### `provider` + +{{< summary-bar feature_name="Compose provider services" >}} + +`provider` can be used to define a service that Compose won't manage directly. Compose delegated the service lifecycle to a dedicated or third-party component. + +```yaml + database: + provider: + type: awesomecloud + options: + type: mysql + foo: bar + app: + image: myapp + depends_on: + - database +``` + +As Compose runs the application, the `awesomecloud` binary is used to manage the `database` service setup. +Dependent service `app` receives additional environment variables prefixed by the service name so it can access the resource. + +For illustration, assuming `awesomecloud` execution produced variables `URL` and `API_KEY`, the `app` service +runs with environment variables `DATABASE_URL` and `DATABASE_API_KEY`. + +As Compose stops the application, the `awesomecloud` binary is used to manage the `database` service tear down. + +The mechanism used by Compose to delegate the service lifecycle to an external binary is described [here](https://github.com/docker/compose/tree/main/docs/extension.md). + +For more information on using the `provider` attribute, see [Use provider services](/manuals/compose/how-tos/provider-services.md). + +### `type` + +`type` attribute is required. It defines the external component used by Compose to manage setup and tear down lifecycle +events. + +### `options` + +`options` are specific to the selected provider and not validated by the compose specification + ### `pull_policy` `pull_policy` defines the decisions Compose makes when it starts to pull images. Possible values are: @@ -2035,6 +2097,11 @@ The short syntax uses a single string with colon-separated values to specify a v > platform it rejects Compose files which use relative host paths with an error. To avoid ambiguities > with named volumes, relative paths should always begin with `.` or `..`. +> [!NOTE] +> +> For bind mounts, the short syntax creates a directory at the source path on the host if it doesn't exist. This is for backward compatibility with `docker-compose` legacy. +> It can be prevented by using long syntax and setting `create_host_path` to `false`. + #### Long syntax The long form syntax lets you configure additional fields that can't be @@ -2048,9 +2115,7 @@ expressed in the short form. - `read_only`: Flag to set the volume as read-only. - `bind`: Used to configure additional bind options: - `propagation`: The propagation mode used for the bind. - - `create_host_path`: Creates a directory at the source path on host if there is nothing present. - Compose does nothing if there is something present at the path. This is automatically implied by short syntax - for backward compatibility with `docker-compose` legacy. + - `create_host_path`: Creates a directory at the source path on host if there is nothing present. Defaults to `true`. - `selinux`: The SELinux re-labeling option `z` (shared) or `Z` (private) - `volume`: Configures additional volume options: - `nocopy`: Flag to disable copying of data from a container when a volume is created. diff --git a/data/summary.yaml b/data/summary.yaml index ffc4c9be37cf..f0f424d07acc 100644 --- a/data/summary.yaml +++ b/data/summary.yaml @@ -97,6 +97,8 @@ Compose gw priority: requires: Docker Compose [2.33.1](/manuals/compose/releases/release-notes.md#2331) and later Compose include: requires: Docker Compose [2.20.3](/manuals/compose/releases/release-notes.md#2203) and later +Compose interface-name: + requires: Docker Compose [2.36.0](/manuals/compose/releases/release-notes.md#2203) and later Compose label file: requires: Docker Compose [2.32.2](/manuals/compose/releases/release-notes.md#2232) and later Compose lifecycle hooks: @@ -111,6 +113,8 @@ Compose OCI artifact: requires: Docker Compose [2.34.0](/manuals/compose/releases/release-notes.md#2340) and later Compose provider services: requires: Docker Compose [2.36.0](/manuals/compose/releases/release-notes.md) and later +Compose progress: + requires: Docker Compose [2.36.0](/manuals/compose/releases/release-notes.md) and later Compose replace file: requires: Docker Compose [2.24.4](/manuals/compose/releases/release-notes.md#2244) and later Compose required: From 287a9eff137503d67e28d7fc9c97f8b8338e4568 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Fri, 16 May 2025 11:19:47 -0400 Subject: [PATCH 407/699] Merge pull request #22647 from sarahsanders-docker/SCIM security: improve SCIM intro --- content/manuals/security/faqs/general.md | 7 ++- .../security/for-admins/provisioning/scim.md | 47 ++++++++++++++----- hugo_stats.json | 3 ++ 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/content/manuals/security/faqs/general.md b/content/manuals/security/faqs/general.md index 341c76c2a714..f358e9962432 100644 --- a/content/manuals/security/faqs/general.md +++ b/content/manuals/security/faqs/general.md @@ -70,7 +70,12 @@ This is applicable only when using Docker Hub's application-level password versu ### How do we de-provision users who are not part of our IdP? We use SSO but not SCIM -If SCIM isn't enabled, you have to manually remove users from the organization in our system. Using SCIM automates this. +If SCIM isn't enabled, you have to manually remove users from the organization. +SCIM can automate this if your users are added after SCIM is enabled. Any users +added to your organization before SCIM is enabled must be removed manually. + +For more information on manually removing users, see +[Manage organization members](/manuals/admin/organization/members.md). ### What metadata is collected from container images that Scout analyzes? diff --git a/content/manuals/security/for-admins/provisioning/scim.md b/content/manuals/security/for-admins/provisioning/scim.md index a76de476b39a..5914174c02e9 100644 --- a/content/manuals/security/for-admins/provisioning/scim.md +++ b/content/manuals/security/for-admins/provisioning/scim.md @@ -11,31 +11,46 @@ weight: 30 {{< summary-bar feature_name="SSO" >}} -System for Cross-domain Identity Management (SCIM) is available for Docker Business customers. This guide provides an overview of SCIM provisioning. +System for Cross-domain Identity Management (SCIM) is available for Docker +Business customers. This guide provides an overview of SCIM provisioning. ## How SCIM works -SCIM offers automated user provisioning and de-provisioning for Docker through your identity provider (IdP). Once SCIM is enabled, users assigned to the Docker application in your IdP are automatically provisioned and added to your Docker organization. If a user is unassigned, they are removed from Docker. +SCIM automates user provisioning and de-provisioning for Docker through your +identity provider (IdP). After you enable SCIM, any user assigned to your +Docker application in your IdP is automatically provisioned and added to your +Docker organization. When a user is removed from the Docker application in your +IdP, SCIM deactivates and removes them from your Docker organization. -SCIM also syncs user profile updates, such as name changes, made in your IdP. SCIM can be used with Docker’s default Just-in-Time (JIT) provisioning configuration, or on its own with JIT disabled. +In addition to provisioning and removal, SCIM also syncs profile updates like +name changes—made in your IdP. You can use SCIM alongside Docker’s default +Just-in-Time (JIT) provisioning or on its own with JIT disabled. + +SCIM automates: -SCIM supports the automation of: - Creating users - Updating user profiles - Removing and deactivating users - Re-activating users - Group mapping -## Supported attributes - -> [!IMPORTANT] +> [!NOTE] +> +> SCIM only manages users provisioned through your IdP after SCIM is enabled. +It cannot remove users who were manually added to your Docker organization +before SCIM was set up. > -> Docker uses JIT provisioning by default for SSO configurations. If you enable SCIM, JIT values still overwrite the attribute -values set by SCIM provisioning. To avoid conflicts, your JIT attribute values must match your SCIM attribute values. To avoid conflicts between SCIM and JIT, you can also disable JIT provisioning. See [Just-in-Time](/manuals/security/for-admins/provisioning/just-in-time.md) for more information. +> To remove those users, delete them manually from your Docker organization. +For more information, see [Manage organization members](/manuals/admin/organization/members.md). -Attributes are pieces of user information, such as name and email, that are synchronized between your IdP and Docker when using SCIM. Proper mapping of these attributes is essential for seamless user provisioning and to prevent duplicate entries when using SSO. +## Supported attributes + +SCIM uses attributes (e.g., name, email) to sync user information between your +IdP and Docker. Properly mapping these attributes in your IdP ensures that user +provisioning works smoothly and prevents issues like duplicate user accounts +when using single sign-on (SSO). -The following table lists the supported attributes for SCIM: +Docker supports the following SCIM attributes: | Attribute | Description | |:---------------------------------------------------------------|:-------------------------------------------------------------------------------------------| @@ -46,6 +61,16 @@ The following table lists the supported attributes for SCIM: For additional details about supported attributes and SCIM, see [Docker Hub API SCIM reference](/reference/api/hub/latest/#tag/scim). +> [!IMPORTANT] +> +> By default, Docker uses Just-in-Time (JIT) provisioning for SSO. If SCIM is +enabled, JIT values still take precedence and will overwrite attribute values +set by SCIM. To avoid conflicts, make sure your JIT attribute values match your +SCIM values. +> +> Alternatively, you can disable JIT provisioning to rely solely on SCIM. +For details, see [Just-in-Time](/manuals/security/for-admins/provisioning/just-in-time.md). + ## Enable SCIM in Docker You must [configure SSO](../single-sign-on/configure/_index.md) before you enable SCIM. Enforcing SSO isn't required to use SCIM. diff --git a/hugo_stats.json b/hugo_stats.json index b1aeaa2a9792..357cc9d7dc6d 100644 --- a/hugo_stats.json +++ b/hugo_stats.json @@ -80,6 +80,7 @@ "Mac-with-Apple-silicon", "Mac-with-Intel-chip", "Manually-create-assets", + "Manually-set-it-up", "NetworkManager", "Node", "Non-compliant", @@ -113,8 +114,10 @@ "Use-OpenAI", "Using-the-CLI", "Using-the-GUI", + "Using-the-MCP-Toolkit-Recommended", "VS-Code", "Vue", + "WSL-2-backend-Arm-Early-Access", "WSL-2-backend-x86_64", "Web-browser", "What-are-the-key-features-of-Docker-Desktop", From aa523eecd3348704d680534be77392f767994460 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Fri, 16 May 2025 11:20:09 -0400 Subject: [PATCH 408/699] fix: remove unknown statuses (#22652) ## Description - These statuses aren't needed in docs, they don't really occur in practice ## Related issues or tickets https://docker.atlassian.net/browse/ENGDOCS-2598?atlOrigin=eyJpIjoiODRlNWY3NDFmMDA3NDM1NDlkNWRjMWExMjFhYWRiOGQiLCJwIjoiaiJ9 ## Reviews - [ ] Editorial review - [ ] Product review @ajthilakan --- .../settings-management/compliance-reporting.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/content/manuals/security/for-admins/hardened-desktop/settings-management/compliance-reporting.md b/content/manuals/security/for-admins/hardened-desktop/settings-management/compliance-reporting.md index f7304b448455..603587407e78 100644 --- a/content/manuals/security/for-admins/hardened-desktop/settings-management/compliance-reporting.md +++ b/content/manuals/security/for-admins/hardened-desktop/settings-management/compliance-reporting.md @@ -83,7 +83,6 @@ highest-priority applicable status according to the following rules. | No policy assigned | The user does not have any policy assigned to them. | | Non-compliant | The user fetched the correct policy, but hasn't applied it. | | Outdated | The user fetched a previous version of the policy. | -| Unknown | The user hasn't fetched any policy yet, or their compliance can't be determined. | | Compliant | The user fetched and applied the latest assigned policy. | **Domain status** @@ -95,7 +94,6 @@ This reflects how the user’s email domain is evaluated based on the organizati | Verified | The user’s email domain is verified. | | Guest user | The user's email domain is not verified. | | Domainless | Your organization has no verified domains, and the user's domain is unknown. | -| Unknown user | Your organization has verified domains, but the user's domain is unknown. | **Settings status** From f4f1a45ec9b71543f6a2fd0b567637280ec83a96 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Mon, 19 May 2025 07:36:44 +0100 Subject: [PATCH 409/699] Desktop: troubleshoot addition (#22656) ## Description request from support https://docker.atlassian.net/browse/SEG-940?linkSource=email ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- .../troubleshoot/topics.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/content/manuals/desktop/troubleshoot-and-support/troubleshoot/topics.md b/content/manuals/desktop/troubleshoot-and-support/troubleshoot/topics.md index a234191093c9..356db9f4ed0b 100644 --- a/content/manuals/desktop/troubleshoot-and-support/troubleshoot/topics.md +++ b/content/manuals/desktop/troubleshoot-and-support/troubleshoot/topics.md @@ -156,6 +156,23 @@ Ensure your username is short enough to keep paths within the allowed limit: ## Topics for Mac +### Upgrade requires administrator privileges + +#### Cause + +On macOS, users without administrator privileges cannot perform in-app upgrades from the Docker Desktop Dashboard. + +#### Solution + +> [!IMPORTANT] +> +> Do not uninstall the current version before upgrading. Doing so deletes all local Docker containers, images, and volumes. + +To upgrade Docker Desktop: + +- Ask an administrator to install the newer version over the existing one. +- Use the []`--user` install flag](/manuals/desktop/setup/install/mac-install.md#security-and-access) if appropriate for your setup. + ### Persistent notification telling me an application has changed my Desktop configurations #### Cause From 91eaa59ab86927c5c9c97abb1b18d55868c1fdb5 Mon Sep 17 00:00:00 2001 From: Guillaume Lours <705411+glours@users.noreply.github.com> Date: Mon, 19 May 2025 15:35:28 +0200 Subject: [PATCH 410/699] release-notes for Compose v2.36.1 version (#22665) ## Description Add Compose `v2.36.1` release notes. ## Related issues or tickets https://docker.atlassian.net/browse/APCLI-1134 ## Reviews - [ ] Technical review - [x] Editorial review - [ ] Product review Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> --- .../compose/v2/docs/reference/compose_config.md | 5 +---- .../docs/reference/docker_compose_config.yaml | 11 ++++++++++- _vendor/modules.txt | 2 +- .../manuals/compose/releases/release-notes.md | 17 +++++++++++++++++ go.mod | 4 ++-- go.sum | 2 ++ hugo.yaml | 2 +- 7 files changed, 34 insertions(+), 9 deletions(-) diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/compose_config.md b/_vendor/github.com/docker/compose/v2/docs/reference/compose_config.md index 78c1835a5278..3ec2d4864afd 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/compose_config.md +++ b/_vendor/github.com/docker/compose/v2/docs/reference/compose_config.md @@ -5,10 +5,6 @@ It merges the Compose files set by `-f` flags, resolves variables in the Compose file, and expands short-notation into the canonical format. -### Aliases - -`docker compose config`, `docker compose convert` - ### Options | Name | Type | Default | Description | @@ -18,6 +14,7 @@ the canonical format. | `--format` | `string` | | Format the output. Values: [yaml \| json] | | `--hash` | `string` | | Print the service config hash, one per line. | | `--images` | `bool` | | Print the image names, one per line. | +| `--lock-image-digests` | `bool` | | Produces an override file with image digests | | `--no-consistency` | `bool` | | Don't check model consistency - warning: may produce invalid Compose output | | `--no-env-resolution` | `bool` | | Don't resolve service env files | | `--no-interpolate` | `bool` | | Don't interpolate environment variables | diff --git a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_config.yaml b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_config.yaml index 7ec479b2000b..080fe6748e6b 100644 --- a/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_config.yaml +++ b/_vendor/github.com/docker/compose/v2/docs/reference/docker_compose_config.yaml @@ -1,5 +1,4 @@ command: docker compose config -aliases: docker compose config, docker compose convert short: Parse, resolve and render compose file in canonical format long: |- `docker compose config` renders the actual data model to be applied on the Docker Engine. @@ -47,6 +46,16 @@ options: experimentalcli: false kubernetes: false swarm: false + - option: lock-image-digests + value_type: bool + default_value: "false" + description: Produces an override file with image digests + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false - option: no-consistency value_type: bool default_value: "false" diff --git a/_vendor/modules.txt b/_vendor/modules.txt index 5b934fd1d8dc..587dc8a1a582 100644 --- a/_vendor/modules.txt +++ b/_vendor/modules.txt @@ -2,5 +2,5 @@ # github.com/moby/buildkit v0.22.0-rc1 # github.com/docker/buildx v0.23.0 # github.com/docker/cli v28.1.1+incompatible -# github.com/docker/compose/v2 v2.36.0 +# github.com/docker/compose/v2 v2.36.1 # github.com/docker/scout-cli v1.15.0 diff --git a/content/manuals/compose/releases/release-notes.md b/content/manuals/compose/releases/release-notes.md index a37c97ff2048..0ebbd27b47c2 100644 --- a/content/manuals/compose/releases/release-notes.md +++ b/content/manuals/compose/releases/release-notes.md @@ -13,6 +13,23 @@ aliases: For more detailed information, see the [release notes in the Compose repo](https://github.com/docker/compose/releases/). +## 2.36.1 + +{{< release-date date="2025-05-19" >}} + +### Bug fixes and enhancements + +- Introduced support of arrays for `provider` service `options` attribute +- Added `debug` messages in the extension protocol +- Fixed an issue when trying to publish a Compose application with a `provider` service +- Fixed build issues on Compose applications with `service.provider` +- Introduced `--lock-image-digests` to `config` command + +### Update + +- Dependencies upgrade: bump compose-go to v2.6.3 +- Dependencies upgrade: bump containerd to 2.1.0 + ## 2.36.0 {{< release-date date="2025-05-07" >}} diff --git a/go.mod b/go.mod index 30b94a7aabe5..cf822a02d1ef 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.24.0 require ( github.com/docker/buildx v0.23.0 // indirect github.com/docker/cli v28.1.1+incompatible // indirect - github.com/docker/compose/v2 v2.36.0 // indirect + github.com/docker/compose/v2 v2.36.1 // indirect github.com/docker/scout-cli v1.15.0 // indirect github.com/moby/buildkit v0.22.0-rc1 // indirect github.com/moby/moby v28.1.0-rc.2+incompatible // indirect @@ -14,7 +14,7 @@ require ( replace ( github.com/docker/buildx => github.com/docker/buildx v0.24.0-rc1 github.com/docker/cli => github.com/docker/cli v28.1.0-rc.2+incompatible - github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.36.0 + github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.36.1 github.com/docker/scout-cli => github.com/docker/scout-cli v1.15.0 github.com/moby/buildkit => github.com/moby/buildkit v0.22.0-rc1 github.com/moby/moby => github.com/moby/moby v28.1.0-rc.2+incompatible diff --git a/go.sum b/go.sum index 21006819ab14..9ac0681b003a 100644 --- a/go.sum +++ b/go.sum @@ -234,6 +234,8 @@ github.com/docker/compose/v2 v2.35.1 h1:oRt5EE22een6DEAkNNQcuzJGhBS2rcMtEKdbfMhF github.com/docker/compose/v2 v2.35.1/go.mod h1:Ydd9ceg7VBOPSVAsDDKfyGGAkjejH3cD91GSmHjuRhI= github.com/docker/compose/v2 v2.36.0 h1:MACSfQ2xqcwgCwAtsHVoQkFbHi2nNfNAsd5EWFg164k= github.com/docker/compose/v2 v2.36.0/go.mod h1:kFPppTinl2Q0Lv3Dy9titIL41oWYoUkNxoKQZb/lfSU= +github.com/docker/compose/v2 v2.36.1 h1:BmTE1Ps6XDOuubyL97ucPvIn8Nq2XprRylE2dgCtTXw= +github.com/docker/compose/v2 v2.36.1/go.mod h1:w6fj+dvMW9W0gFaTpIwJ2PYstqiGIC07Cajp5wPukO0= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= diff --git a/hugo.yaml b/hugo.yaml index 86f4f43246ee..da91269bc731 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -140,7 +140,7 @@ params: # (Used to show e.g., "latest" and "latest"-1 in engine install examples docker_ce_version_prev: "28.1.0" # Latest Docker Compose version - compose_version: "v2.36.0" + compose_version: "v2.36.1" # Latest BuildKit version buildkit_version: "0.21.0" From 6be55cd0d6a7c152450f04a3fd92bbcfa0226100 Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 19 May 2025 15:46:10 +0200 Subject: [PATCH 411/699] dmr: docker model package (#22663) ## Description Add `docker model package` ## Related issues or tickets ## Reviews - [X] Technical review - [X] Editorial review - [ ] Product review --- _vale/config/vocabularies/Docker/accept.txt | 24 +++++++++++---------- content/manuals/ai/model-runner.md | 12 +++++++++++ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/_vale/config/vocabularies/Docker/accept.txt b/_vale/config/vocabularies/Docker/accept.txt index 3ee7f04c4221..906fa3bb7000 100644 --- a/_vale/config/vocabularies/Docker/accept.txt +++ b/_vale/config/vocabularies/Docker/accept.txt @@ -15,15 +15,16 @@ Citrix CloudFront Codefresh Codespaces -CouchDB Couchbase +CouchDB Datadog Ddosify Debootstrap Dev -Dex Dev Environments? +Dex Django +DMR Docker Build Cloud Docker Business Docker Dasboard @@ -33,8 +34,8 @@ Docker Extension Docker Hub Docker Scout Docker Team -Docker's Docker-Sponsored Open Source +Docker's Dockerfile Dockerize Dockerizing @@ -44,26 +45,27 @@ Fargate Fedora Flink GeoNetwork +GGUF Git GitHub( Actions)? Google Grafana Gravatar HyperKit -IPv[46] -IPvlan Intel Intune -JFrog +IPv[46] +IPvlan Jamf JetBrains +JFrog JUnit Kerberos Kitematic Kubeadm Kubernetes -Laravel Laradock +Laravel Linux LinuxKit Logstash @@ -71,27 +73,27 @@ Mac Mail(chimp|gun) Microsoft MySQL -NFSv\d Netplan +NFSv\d Nginx Nutanix Nuxeo OAuth +Okta Ollama OTel -Okta -PKG Paketo +PKG Postgres PowerShell Python Ryuk S3 -SQLite Slack Snyk Solr SonarQube +SQLite Syft Sysbox Sysdig diff --git a/content/manuals/ai/model-runner.md b/content/manuals/ai/model-runner.md index 4f7af95db1b1..680c87fec5a0 100644 --- a/content/manuals/ai/model-runner.md +++ b/content/manuals/ai/model-runner.md @@ -215,6 +215,18 @@ Output: Model removed successfully ``` +### Package a model + +Packages a GGUF file into a Docker model OCI artifact, with optional licenses, and pushes it to the specified registry. + +```console +$ docker model package \ + --gguf ./model.gguf \ + --licenses license1.txt \ + --licenses license2.txt \ + --push registry.example.com/ai/custom-model +``` + ## Integrate the Docker Model Runner into your software development lifecycle You can now start building your Generative AI application powered by the Docker Model Runner. From ed275b6a10c112d43b57beee6f83a6d9ba62a9a0 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Mon, 19 May 2025 18:16:06 +0300 Subject: [PATCH 412/699] Fix link to release note for Compose model runner feature (#22668) ## Description This pull request fixes a stale link to compose release notes in the "Use Docker Model Runner" manual. https://docs.docker.com/compose/how-tos/model-runner/ https://github.com/duffuniverse/docs/blob/main/content/manuals/compose/how-tos/model-runner.md --- data/summary.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/summary.yaml b/data/summary.yaml index f0f424d07acc..6edf51df83c5 100644 --- a/data/summary.yaml +++ b/data/summary.yaml @@ -108,7 +108,7 @@ Compose mac address: Compose menu: requires: Docker Compose [2.26.0](/manuals/compose/releases/release-notes.md#2260) and later Compose model runner: - requires: Docker Compose [2.35.0](/manuals/compose/releases/release-notes.md#2300) and later, and Docker Desktop 4.41 and later + requires: Docker Compose [2.35.0](/manuals/compose/releases/release-notes.md#2350) and later, and Docker Desktop 4.41 and later Compose OCI artifact: requires: Docker Compose [2.34.0](/manuals/compose/releases/release-notes.md#2340) and later Compose provider services: From b147e9006baa1ee500b5c4ceb47b9e84e0e70aaa Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Tue, 20 May 2025 17:10:33 +0200 Subject: [PATCH 413/699] build: provenance is minimal by default Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- content/manuals/build/metadata/attestations/_index.md | 2 +- .../manuals/build/metadata/attestations/slsa-provenance.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/manuals/build/metadata/attestations/_index.md b/content/manuals/build/metadata/attestations/_index.md index e18977bf4679..1d10af81c350 100644 --- a/content/manuals/build/metadata/attestations/_index.md +++ b/content/manuals/build/metadata/attestations/_index.md @@ -70,7 +70,7 @@ $ docker buildx build --sbom=true --provenance=true . > You can disable provenance attestations using the `--provenance=false` flag, > or by setting the [`BUILDX_NO_DEFAULT_ATTESTATIONS`](/manuals/build/building/variables.md#buildx_no_default_attestations) environment variable. > -> Using the `--provenance=true` flag attaches provenance attestations with `mode=max` +> Using the `--provenance=true` flag attaches provenance attestations with `mode=min` > by default. See [Provenance attestation](./slsa-provenance.md) for more details. BuildKit generates the attestations when building the image. The attestation diff --git a/content/manuals/build/metadata/attestations/slsa-provenance.md b/content/manuals/build/metadata/attestations/slsa-provenance.md index f3add2da14d6..2ed24019bef4 100644 --- a/content/manuals/build/metadata/attestations/slsa-provenance.md +++ b/content/manuals/build/metadata/attestations/slsa-provenance.md @@ -41,8 +41,8 @@ For an example on how to add provenance attestations with GitHub Actions, see ## Mode You can use the `mode` parameter to define the level of detail to be included in -the provenance attestation. Supported values are `mode=min`, and `mode=max` -(default). +the provenance attestation. Supported values are `mode=min` (default) and +`mode=max`. ### Min From e9ff3f26d6523e3c08e863ed73d6c62ba589684e Mon Sep 17 00:00:00 2001 From: sarahsanders-docker Date: Tue, 20 May 2025 11:12:49 -0400 Subject: [PATCH 414/699] update new UI --- content/manuals/admin/organization/general-settings.md | 5 +++-- content/manuals/admin/organization/orgs.md | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/content/manuals/admin/organization/general-settings.md b/content/manuals/admin/organization/general-settings.md index 6cc04ab9071b..65d4188dbcc2 100644 --- a/content/manuals/admin/organization/general-settings.md +++ b/content/manuals/admin/organization/general-settings.md @@ -7,11 +7,12 @@ keywords: organization, settings, Admin Console This section describes how to manage organization settings in the Docker Admin Console. -## Configure general information +## Configure organization information General organization information appears on your organization landing page in the Admin Console. This information includes: + - Organization Name - Company - Location @@ -22,7 +23,7 @@ To edit this information: 1. Sign in to the [Admin Console](https://admin.docker.com). 2. Select your company on the **Choose profile** page. -3. Under **Organization settings**, select **General**. +3. Under **Organization settings**, select **Organization information**. 4. Specify the organization information and select **Save**. ## Next steps diff --git a/content/manuals/admin/organization/orgs.md b/content/manuals/admin/organization/orgs.md index ef048a8a0c9c..0daf89c2bcc2 100644 --- a/content/manuals/admin/organization/orgs.md +++ b/content/manuals/admin/organization/orgs.md @@ -110,7 +110,7 @@ configure your organization. - **Security and access**: Manage security settings. For more information, see [Security](/manuals/security/_index.md). -- **Organization settings**: Update general settings, manage your company settings, or [deactivate your organization](/manuals/admin/organization/deactivate-account.md). +- **Organization settings**: Update organization information or [deactivate your organization](/manuals/admin/organization/deactivate-account.md). {{< /tab >}} {{< tab name="Docker Hub" >}} From 45ccab3f615246a901289b2c669fcb60ad6b60e7 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Tue, 20 May 2025 12:43:33 -0400 Subject: [PATCH 415/699] Merge pull request #22670 from sarahsanders-docker/get-started-content get started: add troubleshooting callout --- .../get-started/workshop/04_sharing_app.md | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/content/get-started/workshop/04_sharing_app.md b/content/get-started/workshop/04_sharing_app.md index 5ba3b09f065f..5537dff5c9ae 100644 --- a/content/get-started/workshop/04_sharing_app.md +++ b/content/get-started/workshop/04_sharing_app.md @@ -38,8 +38,15 @@ In the following image, you can see an example Docker command from Docker Hub. T ## Push the image -1. In the command line, run the `docker push` command that you see on Docker - Hub. Note that your command will have your Docker ID, not "docker". For example, `docker push YOUR-USER-NAME/getting-started`. +Let's try to push the image to Docker Hub. + +1. In the command line, run the following commmand: + + ```console + docker push docker/getting-started + ``` + + You'll see an error like this: ```console $ docker push docker/getting-started @@ -47,13 +54,17 @@ In the following image, you can see an example Docker command from Docker Hub. T An image does not exist locally with the tag: docker/getting-started ``` - Why did it fail? The push command was looking for an image named `docker/getting-started`, but - didn't find one. If you run `docker image ls`, you won't see one either. + This failure is expected because the image isn't tagged correctly yet. + Docker is looking for an image name `docker/getting started`, but your + local image is still named `getting-started`. - To fix this, you need to tag your existing image you've built to give it another name. + You can confirm this by running: -2. Sign in to Docker Hub using the command `docker login -u YOUR-USER-NAME`. + ```console + docker image ls + ``` +2. To fix this, first sign in to Docker Hub using your Docker ID: `docker login YOUR-USER-NAME`. 3. Use the `docker tag` command to give the `getting-started` image a new name. Replace `YOUR-USER-NAME` with your Docker ID. ```console From 21a5f64c7f7d575e1955408c70c8140c24cee8d0 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Wed, 21 May 2025 08:50:36 +0200 Subject: [PATCH 416/699] engine: install: remove Ubuntu 20.04, Fedora 40 (EOL) (#22675) Ubuntu 20.04 and Fedora 40 reached EOL, so remove mentions of it in the installation docs. ## Description ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Signed-off-by: Sebastiaan van Stijn --- content/manuals/desktop/setup/install/linux/fedora.md | 2 +- content/manuals/engine/install/fedora.md | 1 - content/manuals/engine/install/ubuntu.md | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/content/manuals/desktop/setup/install/linux/fedora.md b/content/manuals/desktop/setup/install/linux/fedora.md index 4148069837ff..9f6c1dccecc4 100644 --- a/content/manuals/desktop/setup/install/linux/fedora.md +++ b/content/manuals/desktop/setup/install/linux/fedora.md @@ -25,7 +25,7 @@ This page contains information on how to install, launch and upgrade Docker Desk To install Docker Desktop successfully, you must: - Meet the [general system requirements](_index.md#general-system-requirements). -- Have a 64-bit version of Fedora 40 or Fedora 41. +- Have a 64-bit version of Fedora 41 or Fedora 42. - For a GNOME desktop environment you must install AppIndicator and KStatusNotifierItem [GNOME extensions](https://extensions.gnome.org/extension/615/appindicator-support/). - If you're not using GNOME, you must install `gnome-terminal` to enable terminal access from Docker Desktop: diff --git a/content/manuals/engine/install/fedora.md b/content/manuals/engine/install/fedora.md index ac936854c18d..a81766f05235 100644 --- a/content/manuals/engine/install/fedora.md +++ b/content/manuals/engine/install/fedora.md @@ -28,7 +28,6 @@ Fedora versions: - Fedora 42 - Fedora 41 -- Fedora 40 ### Uninstall old versions diff --git a/content/manuals/engine/install/ubuntu.md b/content/manuals/engine/install/ubuntu.md index 2d1b920d9b64..94027a89a494 100644 --- a/content/manuals/engine/install/ubuntu.md +++ b/content/manuals/engine/install/ubuntu.md @@ -54,7 +54,6 @@ versions: - Ubuntu Oracular 24.10 - Ubuntu Noble 24.04 (LTS) - Ubuntu Jammy 22.04 (LTS) -- Ubuntu Focal 20.04 (LTS) Docker Engine for Ubuntu is compatible with x86_64 (or amd64), armhf, arm64, s390x, and ppc64le (ppc64el) architectures. From 196062f3a1d8b55d760e8b796e53c354c46fda04 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Wed, 21 May 2025 08:52:04 +0200 Subject: [PATCH 417/699] remove references to EOL distros and images (#22674) - replace some examples using EOL alpine versions - replace some examples using EOL ubuntu versions ## Description ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review Signed-off-by: Sebastiaan van Stijn --- .../go-prometheus-monitoring/containerize.md | 4 ++-- content/manuals/build/building/base-images.md | 12 ++++++------ content/manuals/build/building/best-practices.md | 16 ++++++++-------- content/manuals/build/images/build-variables.svg | 2 +- .../metadata/attestations/slsa-provenance.md | 2 +- content/manuals/compose/how-tos/gpu-support.md | 2 +- .../docker-hub/image-library/trusted-content.md | 2 +- content/manuals/engine/cli/filter.md | 14 +++++++------- 8 files changed, 27 insertions(+), 27 deletions(-) diff --git a/content/guides/go-prometheus-monitoring/containerize.md b/content/guides/go-prometheus-monitoring/containerize.md index a0a1a7401c2e..a628c380618f 100644 --- a/content/guides/go-prometheus-monitoring/containerize.md +++ b/content/guides/go-prometheus-monitoring/containerize.md @@ -41,7 +41,7 @@ COPY . . RUN go build -o /app . # Final lightweight stage -FROM alpine:3.17 AS final +FROM alpine:3.21 AS final # Copy the compiled binary from the builder stage COPY --from=builder /app /bin/app @@ -63,7 +63,7 @@ The Dockerfile consists of two stages: 2. **Final stage**: This stage uses the official Alpine image as the base and copies the compiled binary from the build stage. It also exposes the application's port and runs the application. - You use the `alpine:3.17` image as the base image for the final stage. You copy the compiled binary from the build stage to the final image. You expose the application's port using the `EXPOSE` instruction and run the application using the `CMD` instruction. + You use the `alpine:3.21` image as the base image for the final stage. You copy the compiled binary from the build stage to the final image. You expose the application's port using the `EXPOSE` instruction and run the application using the `CMD` instruction. Apart from the multi-stage build, the Dockerfile also follows best practices such as using the official images, setting the working directory, and copying only the necessary files to the final image. You can further optimize the Dockerfile by other best practices. diff --git a/content/manuals/build/building/base-images.md b/content/manuals/build/building/base-images.md index 2e11b0ba540b..0c057046454b 100644 --- a/content/manuals/build/building/base-images.md +++ b/content/manuals/build/building/base-images.md @@ -102,17 +102,17 @@ which you can also use to build Ubuntu images. For example, to create an Ubuntu base image: ```dockerfile -$ sudo debootstrap focal focal > /dev/null -$ sudo tar -C focal -c . | docker import - focal +$ sudo debootstrap noble noble > /dev/null +$ sudo tar -C noble -c . | docker import - noble sha256:81ec9a55a92a5618161f68ae691d092bf14d700129093158297b3d01593f4ee3 -$ docker run focal cat /etc/lsb-release +$ docker run noble cat /etc/lsb-release DISTRIB_ID=Ubuntu -DISTRIB_RELEASE=20.04 -DISTRIB_CODENAME=focal -DISTRIB_DESCRIPTION="Ubuntu 20.04 LTS" +DISTRIB_RELEASE=24.04 +DISTRIB_CODENAME=noble +DISTRIB_DESCRIPTION="Ubuntu 24.04.2 LTS" ``` There are more example scripts for creating base images in diff --git a/content/manuals/build/building/best-practices.md b/content/manuals/build/building/best-practices.md index eb308bcf862a..c351630ac372 100644 --- a/content/manuals/build/building/best-practices.md +++ b/content/manuals/build/building/best-practices.md @@ -192,15 +192,15 @@ image. This is useful because it lets publishers update tags to point to newer versions of an image. And as an image consumer, it means you automatically get the new version when you re-build your image. -For example, if you specify `FROM alpine:3.19` in your Dockerfile, `3.19` -resolves to the latest patch version for `3.19`. +For example, if you specify `FROM alpine:3.21` in your Dockerfile, `3.21` +resolves to the latest patch version for `3.21`. ```dockerfile # syntax=docker/dockerfile:1 -FROM alpine:3.19 +FROM alpine:3.21 ``` -At one point in time, the `3.19` tag might point to version 3.19.1 of the +At one point in time, the `3.21` tag might point to version 3.21.1 of the image. If you rebuild the image 3 months later, the same tag might point to a different version, such as 3.19.4. This publishing workflow is best practice, and most publishers use this tagging strategy, but it isn't enforced. @@ -213,16 +213,16 @@ To fully secure your supply chain integrity, you can pin the image version to a specific digest. By pinning your images to a digest, you're guaranteed to always use the same image version, even if a publisher replaces the tag with a new image. For example, the following Dockerfile pins the Alpine image to the -same tag as earlier, `3.19`, but this time with a digest reference as well. +same tag as earlier, `3.21`, but this time with a digest reference as well. ```dockerfile # syntax=docker/dockerfile:1 -FROM alpine:3.19@sha256:13b7e62e8df80264dbb747995705a986aa530415763a6c58f84a3ca8af9a5bcd +FROM alpine:3.21@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c ``` -With this Dockerfile, even if the publisher updates the `3.19` tag, your builds +With this Dockerfile, even if the publisher updates the `3.21` tag, your builds would still use the pinned image version: -`13b7e62e8df80264dbb747995705a986aa530415763a6c58f84a3ca8af9a5bcd`. +`a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c`. While this helps you avoid unexpected changes, it's also more tedious to have to look up and include the image digest for base image versions manually each diff --git a/content/manuals/build/images/build-variables.svg b/content/manuals/build/images/build-variables.svg index 13197975fb1c..07dab5f2d326 100644 --- a/content/manuals/build/images/build-variables.svg +++ b/content/manuals/build/images/build-variables.svg @@ -1,3 +1,3 @@ - Global scope# Build arguments declared here are in the global scopeARG GLOBAL_ARG="global default value"ARG VERSION="3.19"# You can't declare environment variables in the global scopeENV GLOBAL_ENV=false# GLOBAL_ARG was not redeclared in this stageRUN echo $GLOBAL_ARG# LOCAL_ARG was declared in stage-aRUN echo $LOCAL_ARGstage-bFROM --platform=$BUILDPLATFORM alpine:${VERSION} as stage-bstage-a# FROM-lines belong to the global scope and have access to global ARGsFROM alpine:${VERSION} as stage-a# Redeclaring GLOBAL_ARG without a value inherits the global defaultARG GLOBAL_ARGRUN echo $GLOBAL_ARG# ARG here this scope creates a local argumentARG LOCAL_ARG="local arg in stage-a"# Set an environment variable in this scopeENV LOCAL_ENV=true# Set an environment variable to the value of a build argumentENV MY_VAR=$LOCAL_ARGstage-c# New stage based on "stage-a"FROM stage-a AS stage-c# Arguments and variables are inherited from parent stagesRUN echo $LOCAL_ARGRUN echo $LOCAL_ENV<- prints an empty string<- prints an empty string<- prints "global default value"<- prints "local arg in stage-a"<- prints "true"ARG TARGETPLATFORM# You must redeclare pre-defined arguments to use them in a stageRUN echo $TARGETPLATFORM<- prints os/arch/variant of --platform# Pre-defined multi-platform arguments like $BUILDPLATFORM are global + Global scope# Build arguments declared here are in the global scopeARG GLOBAL_ARG="global default value"ARG VERSION="3.21"# You can't declare environment variables in the global scopeENV GLOBAL_ENV=false# GLOBAL_ARG was not redeclared in this stageRUN echo $GLOBAL_ARG# LOCAL_ARG was declared in stage-aRUN echo $LOCAL_ARGstage-bFROM --platform=$BUILDPLATFORM alpine:${VERSION} as stage-bstage-a# FROM-lines belong to the global scope and have access to global ARGsFROM alpine:${VERSION} as stage-a# Redeclaring GLOBAL_ARG without a value inherits the global defaultARG GLOBAL_ARGRUN echo $GLOBAL_ARG# ARG here this scope creates a local argumentARG LOCAL_ARG="local arg in stage-a"# Set an environment variable in this scopeENV LOCAL_ENV=true# Set an environment variable to the value of a build argumentENV MY_VAR=$LOCAL_ARGstage-c# New stage based on "stage-a"FROM stage-a AS stage-c# Arguments and variables are inherited from parent stagesRUN echo $LOCAL_ARGRUN echo $LOCAL_ENV<- prints an empty string<- prints an empty string<- prints "global default value"<- prints "local arg in stage-a"<- prints "true"ARG TARGETPLATFORM# You must redeclare pre-defined arguments to use them in a stageRUN echo $TARGETPLATFORM<- prints os/arch/variant of --platform# Pre-defined multi-platform arguments like $BUILDPLATFORM are global diff --git a/content/manuals/build/metadata/attestations/slsa-provenance.md b/content/manuals/build/metadata/attestations/slsa-provenance.md index 2ed24019bef4..5da2b8617aef 100644 --- a/content/manuals/build/metadata/attestations/slsa-provenance.md +++ b/content/manuals/build/metadata/attestations/slsa-provenance.md @@ -175,7 +175,7 @@ extract the full source code of the Dockerfile used to build the image: ```console $ docker buildx imagetools inspect /: \ --format '{{ range (index .Provenance.SLSA.metadata "https://mobyproject.org/buildkit@v1#metadata").source.infos }}{{ if eq .filename "Dockerfile" }}{{ .data }}{{ end }}{{ end }}' | base64 -d -FROM ubuntu:20.04 +FROM ubuntu:24.04 RUN apt-get update ... ``` diff --git a/content/manuals/compose/how-tos/gpu-support.md b/content/manuals/compose/how-tos/gpu-support.md index 0d5c6b7b4d08..a9b0bb899f10 100644 --- a/content/manuals/compose/how-tos/gpu-support.md +++ b/content/manuals/compose/how-tos/gpu-support.md @@ -39,7 +39,7 @@ For more information on these properties, see the [Compose Deploy Specification] ```yaml services: test: - image: nvidia/cuda:12.3.1-base-ubuntu20.04 + image: nvidia/cuda:12.9.0-base-ubuntu22.04 command: nvidia-smi deploy: resources: diff --git a/content/manuals/docker-hub/image-library/trusted-content.md b/content/manuals/docker-hub/image-library/trusted-content.md index 518ccfce6dbb..1150abc46f83 100644 --- a/content/manuals/docker-hub/image-library/trusted-content.md +++ b/content/manuals/docker-hub/image-library/trusted-content.md @@ -137,7 +137,7 @@ Docker Hub for examples on how to install packages if you are unfamiliar. ### Codenames Tags with words that look like Toy Story characters (for example, `bookworm`, -`bullseye`, and `trixie`) or adjectives (such as `focal`, `jammy`, and +`bullseye`, and `trixie`) or adjectives (such as `jammy`, and `noble`), indicate the codename of the Linux distribution they use as a base image. Debian release codenames are [based on Toy Story characters](https://en.wikipedia.org/wiki/Debian_version_history#Naming_convention), and Ubuntu's take the form of "Adjective Animal". For example, the diff --git a/content/manuals/engine/cli/filter.md b/content/manuals/engine/cli/filter.md index e51fb633470f..9549f8a34b5d 100644 --- a/content/manuals/engine/cli/filter.md +++ b/content/manuals/engine/cli/filter.md @@ -30,15 +30,15 @@ output of the `docker images` command to only print `alpine` images. ```console $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE -ubuntu 20.04 33a5cc25d22c 36 minutes ago 101MB -ubuntu 18.04 152dc042452c 36 minutes ago 88.1MB -alpine 3.16 a8cbb8c69ee7 40 minutes ago 8.67MB +ubuntu 24.04 33a5cc25d22c 36 minutes ago 101MB +ubuntu 22.04 152dc042452c 36 minutes ago 88.1MB +alpine 3.21 a8cbb8c69ee7 40 minutes ago 8.67MB alpine latest 7144f7bab3d4 40 minutes ago 11.7MB busybox uclibc 3e516f71d880 48 minutes ago 2.4MB busybox glibc 7338d0c72c65 48 minutes ago 6.09MB $ docker images --filter reference=alpine REPOSITORY TAG IMAGE ID CREATED SIZE -alpine 3.16 a8cbb8c69ee7 40 minutes ago 8.67MB +alpine 3.21 a8cbb8c69ee7 40 minutes ago 8.67MB alpine latest 7144f7bab3d4 40 minutes ago 11.7MB ``` @@ -58,9 +58,9 @@ following example shows how to print all images that match `alpine:latest` or ```console $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE -ubuntu 20.04 33a5cc25d22c 2 hours ago 101MB -ubuntu 18.04 152dc042452c 2 hours ago 88.1MB -alpine 3.16 a8cbb8c69ee7 2 hours ago 8.67MB +ubuntu 24.04 33a5cc25d22c 2 hours ago 101MB +ubuntu 22.04 152dc042452c 2 hours ago 88.1MB +alpine 3.21 a8cbb8c69ee7 2 hours ago 8.67MB alpine latest 7144f7bab3d4 2 hours ago 11.7MB busybox uclibc 3e516f71d880 2 hours ago 2.4MB busybox glibc 7338d0c72c65 2 hours ago 6.09MB From 5b0705f84bdc2eb34a74e44bf4556b3811abbe1f Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 21 May 2025 13:46:45 +0200 Subject: [PATCH 418/699] chore: fix missing card in AI section (#22677) --- content/manuals/_index.md | 8 ++++++-- content/manuals/ai/gordon/mcp/gordon-mcp-server.md | 2 -- static/assets/icons/toolbox.svg | 4 ++++ 3 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 static/assets/icons/toolbox.svg diff --git a/content/manuals/_index.md b/content/manuals/_index.md index ac033af064fc..558924bf1067 100644 --- a/content/manuals/_index.md +++ b/content/manuals/_index.md @@ -33,13 +33,17 @@ params: link: /testcontainers/ ai: - title: Ask Gordon - description: streamline your workflow and get the most out of the Docker ecosystem with your personal AI assistant. + description: Streamline your workflow and get the most out of the Docker ecosystem with your personal AI assistant. icon: note_add link: /ai/gordon/ - title: Docker Model Runner - description: View and manage your local models + description: View and manage your local models. icon: view_in_ar link: /model-runner/ + - title: MCP Catalog and Toolkit + description: Augment your AI workflow with MCP servers. + icon: /assets/icons/toolbox.svg + link: /ai/mcp-catalog-and-toolkit/ products: - title: Docker Desktop description: Your command center for container development. diff --git a/content/manuals/ai/gordon/mcp/gordon-mcp-server.md b/content/manuals/ai/gordon/mcp/gordon-mcp-server.md index 39a163ca87d8..4b0577abb384 100644 --- a/content/manuals/ai/gordon/mcp/gordon-mcp-server.md +++ b/content/manuals/ai/gordon/mcp/gordon-mcp-server.md @@ -6,8 +6,6 @@ aliases: - /desktop/features/gordon/mcp/gordon-mcp-server/ --- -## Gordon as an MCP server - In addition to functioning as an MCP client, Gordon can also act as an MCP server. This means that all the tools configured in the toolbox section of Gordon can be exposed to another MCP client like Claude Desktop, Cursor and diff --git a/static/assets/icons/toolbox.svg b/static/assets/icons/toolbox.svg new file mode 100644 index 000000000000..bef5013751ec --- /dev/null +++ b/static/assets/icons/toolbox.svg @@ -0,0 +1,4 @@ + + + + From 1d05dbda71d99e48f00e9b33d0290027aa134351 Mon Sep 17 00:00:00 2001 From: crazy-max <1951866+crazy-max@users.noreply.github.com> Date: Wed, 21 May 2025 16:27:48 +0000 Subject: [PATCH 419/699] vendor: github.com/docker/buildx v0.24.0 Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../docker/buildx/docs/bake-reference.md | 269 ++++++++++++++++-- _vendor/modules.txt | 4 +- go.mod | 6 +- go.sum | 3 + 4 files changed, 250 insertions(+), 32 deletions(-) diff --git a/_vendor/github.com/docker/buildx/docs/bake-reference.md b/_vendor/github.com/docker/buildx/docs/bake-reference.md index d658d891edd8..5245f611dc38 100644 --- a/_vendor/github.com/docker/buildx/docs/bake-reference.md +++ b/_vendor/github.com/docker/buildx/docs/bake-reference.md @@ -297,7 +297,12 @@ example adds annotations to both the image index and manifests. ```hcl target "default" { - output = [{ type = "image", name = "foo" }] + output = [ + { + type = "image" + name = "foo" + } + ] annotations = ["index,manifest:org.opencontainers.image.authors=dvdksn"] } ``` @@ -314,11 +319,11 @@ This attribute accepts the long-form CSV version of attestation parameters. target "default" { attest = [ { - type = "provenance", - mode = "max", + type = "provenance" + mode = "max" }, { - type = "sbom", + type = "sbom" } ] } @@ -336,12 +341,12 @@ This takes a list value, so you can specify multiple cache sources. target "app" { cache-from = [ { - type = "s3", - region = "eu-west-1", + type = "s3" + region = "eu-west-1" bucket = "mybucket" }, { - type = "registry", + type = "registry" ref = "user/repo:cache" } ] @@ -360,12 +365,12 @@ This takes a list value, so you can specify multiple cache export targets. target "app" { cache-to = [ { - type = "s3", - region = "eu-west-1", + type = "s3" + region = "eu-west-1" bucket = "mybucket" }, { - type = "inline", + type = "inline" } ] } @@ -445,9 +450,9 @@ a context based on the pattern of the context value. ```hcl # docker-bake.hcl target "app" { - contexts = { - alpine = "docker-image://alpine:3.13" - } + contexts = { + alpine = "docker-image://alpine:3.13" + } } ``` @@ -462,9 +467,9 @@ RUN echo "Hello world" ```hcl # docker-bake.hcl target "app" { - contexts = { - src = "../path/to/source" - } + contexts = { + src = "../path/to/source" + } } ``` @@ -485,12 +490,13 @@ COPY --from=src . . ```hcl # docker-bake.hcl target "base" { - dockerfile = "baseapp.Dockerfile" + dockerfile = "baseapp.Dockerfile" } + target "app" { - contexts = { - baseapp = "target:base" - } + contexts = { + baseapp = "target:base" + } } ``` @@ -507,11 +513,11 @@ functionality. ```hcl target "lint" { - description = "Runs golangci-lint to detect style errors" - args = { - GOLANGCI_LINT_VERSION = null - } - dockerfile = "lint.Dockerfile" + description = "Runs golangci-lint to detect style errors" + args = { + GOLANGCI_LINT_VERSION = null + } + dockerfile = "lint.Dockerfile" } ``` @@ -913,8 +919,15 @@ variable "HOME" { target "default" { secret = [ - { type = "env", id = "KUBECONFIG" }, - { type = "file", id = "aws", src = "${HOME}/.aws/credentials" }, + { + type = "env" + id = "KUBECONFIG" + }, + { + type = "file" + id = "aws" + src = "${HOME}/.aws/credentials" + } ] } ``` @@ -1068,6 +1081,7 @@ or interpolate them in attribute values in your Bake file. ```hcl variable "TAG" { + type = string default = "latest" } @@ -1089,6 +1103,206 @@ overriding the default `latest` value shown in the previous example. $ TAG=dev docker buildx bake webapp-dev ``` +Variables can also be assigned an explicit type. +If provided, it will be used to validate the default value (if set), as well as any overrides. +This is particularly useful when using complex types which are intended to be overridden. +The previous example could be expanded to apply an arbitrary series of tags. +```hcl +variable "TAGS" { + default = ["latest"] + type = list(string) +} + +target "webapp-dev" { + dockerfile = "Dockerfile.webapp" + tags = [for tag in TAGS: "docker.io/username/webapp:${tag}"] +} +``` + +This example shows how to generate three tags without changing the file +or using custom functions/parsing: +```console +$ TAGS=dev,latest,2 docker buildx bake webapp-dev +``` + +### Variable typing + +The following primitive types are available: +* `string` +* `number` +* `bool` + +The type is expressed like a keyword; it must be expressed as a literal: +```hcl +variable "OK" { + type = string +} + +# cannot be an actual string +variable "BAD" { + type = "string" +} + +# cannot be the result of an expression +variable "ALSO_BAD" { + type = lower("string") +} +``` +Specifying primitive types can be valuable to show intent (especially when a default is not provided), +but bake will generally behave as expected without explicit typing. + +Complex types are expressed with "type constructors"; they are: +* `tuple([,...])` +* `list()` +* `set()` +* `map()` +* `object({=},...})` + +The following are examples of each of those, as well as how the (optional) default value would be expressed: +```hcl +# structured way to express "1.2.3-alpha" +variable "MY_VERSION" { + type = tuple([number, number, number, string]) + default = [1, 2, 3, "alpha"] +} + +# JDK versions used in a matrix build +variable "JDK_VERSIONS" { + type = list(number) + default = [11, 17, 21] +} + +# better way to express the previous example; this will also +# enforce set semantics and allow use of set-based functions +variable "JDK_VERSIONS" { + type = set(number) + default = [11, 17, 21] +} + +# with the help of lookup(), translate a 'feature' to a tag +variable "FEATURE_TO_NAME" { + type = map(string) + default = {featureA = "slim", featureB = "tiny"} +} + +# map a branch name to a registry location +variable "PUSH_DESTINATION" { + type = object({branch = string, registry = string}) + default = {branch = "main", registry = "prod-registry.invalid.com"} +} + +# make the previous example more useful with composition +variable "PUSH_DESTINATIONS" { + type = list(object({branch = string, registry = string})) + default = [ + {branch = "develop", registry = "test-registry.invalid.com"}, + {branch = "main", registry = "prod-registry.invalid.com"}, + ] +} +``` +Note that in each example, the default value would be valid even if typing was not present. +If typing was omitted, the first three would all be considered `tuple`; +you would be restricted to functions that operate on `tuple` and, for example, not be able to add elements. +Similarly, the third and fourth would both be considered `object`, with the limits and semantics of that type. +In short, in the absence of a type, any value delimited with `[]` is a `tuple` +and value delimited with `{}` is an `object`. +Explicit typing for complex types not only opens up the ability to use functions applicable to that specialized type, +but is also a precondition for providing overrides. + +> [!NOTE] +> See [HCL Type Expressions][typeexpr] page for more details. + +### Overriding variables + +As mentioned in the [intro to variables](#variable), primitive types (`string`, `number`, and `bool`) +can be overridden without typing and will generally behave as expected. +(When explicit typing is not provided, a variable is assumed to be primitive when the default value lacks `{}` or `[]` delimiters; +a variable with neither typing nor a default value is treated as `string`.) +Naturally, these same overrides can be used alongside explicit typing too; +they may help in edge cases where you want `VAR=true` to be a `string`, where without typing, +it may be a `string` or a `bool` depending on how/where it's used. +Overriding a variable with a complex type can only be done when the type is provided. +This is still done via environment variables, but the values can be provided via CSV or JSON. + +#### CSV overrides + +This is considered the canonical method and is well suited to interactive usage. +It is assumed that `list` and `set` will be the most common complex type, +as well as the most common complex type designed to be overridden. +Thus, there is full CSV support for `list` and `set` +(and `tuple`; despite being considered a structural type, it is more like a collection type in this regard). + + +There is limited support for `map` and `object` and no support for composite types; +for these advanced cases, an alternative mechanism [using JSON](#json-overrides) is available. + +#### JSON overrides + +Overrides can also be provided via JSON. +This is the only method available for providing some complex types and may be convenient if overrides are already JSON +(for example, if they come from a JSON API). +It can also be used when dealing with values are difficult or impossible to specify using CSV (e.g., values containing quotes or commas). +To use JSON, simply append `_JSON` to the variable name. +In this contrived example, CSV cannot handle the second value; despite being a supported CSV type, JSON must be used: +```hcl +variable "VALS" { + type = list(string) + default = ["some", "list"] +} +``` +```console +$ cat data.json +["hello","with,comma","with\"quote"] +$ VALS_JSON=$(< data.json) docker buildx bake + +# CSV equivalent, though the second value cannot be expressed at all +$ VALS='hello,"with""quote"' docker buildx bake +``` + +This example illustrates some precedence and usage rules: +```hcl +variable "FOO" { + type = string + default = "foo" +} + +variable "FOO_JSON" { + type = string + default = "foo" +} +``` + +The variable `FOO` can *only* be overridden using CSV because `FOO_JSON`, which would typically used for a JSON override, +is already a defined variable. +Since `FOO_JSON` is an actual variable, setting that environment variable would be expected to a CSV value. +A JSON override *is* possible for this variable, using environment variable `FOO_JSON_JSON`. + +```Console +# These three are all equivalent, setting variable FOO=bar +$ FOO=bar docker buildx bake <...> +$ FOO='bar' docker buildx bake <...> +$ FOO="bar" docker buildx bake <...> + +# Sets *only* variable FOO_JSON; FOO is untouched +$ FOO_JSON=bar docker buildx bake <...> + +# This also sets FOO_JSON, but will fail due to not being valid JSON +$ FOO_JSON_JSON=bar docker buildx bake <...> + +# These are all equivalent +$ cat data.json +"bar" +$ FOO_JSON_JSON=$(< data.json) docker buildx bake <...> +$ FOO_JSON_JSON='"bar"' docker buildx bake <...> +$ FOO_JSON=bar docker buildx bake <...> + +# This results in setting two different variables, both specified as CSV (FOO=bar and FOO_JSON="baz") +$ FOO=bar FOO_JSON='"baz"' docker buildx bake <...> + +# These refer to the same variable with FOO_JSON_JSON having precedence and read as JSON (FOO_JSON=baz) +$ FOO_JSON=bar FOO_JSON_JSON='"baz"' docker buildx bake <...> +``` + ### Built-in variables The following variables are built-ins that you can use with Bake without having @@ -1226,4 +1440,5 @@ target "webapp-dev" { [ssh]: https://docs.docker.com/reference/cli/docker/buildx/build/#ssh [tag]: https://docs.docker.com/reference/cli/docker/image/build/#tag [target]: https://docs.docker.com/reference/cli/docker/image/build/#target +[typeexpr]: https://github.com/hashicorp/hcl/tree/main/ext/typeexpr [userfunc]: https://github.com/hashicorp/hcl/tree/main/ext/userfunc diff --git a/_vendor/modules.txt b/_vendor/modules.txt index 587dc8a1a582..421fd7c081dd 100644 --- a/_vendor/modules.txt +++ b/_vendor/modules.txt @@ -1,6 +1,6 @@ # github.com/moby/moby v28.1.0-rc.2+incompatible -# github.com/moby/buildkit v0.22.0-rc1 -# github.com/docker/buildx v0.23.0 +# github.com/moby/buildkit v0.22.0 +# github.com/docker/buildx v0.24.0 # github.com/docker/cli v28.1.1+incompatible # github.com/docker/compose/v2 v2.36.1 # github.com/docker/scout-cli v1.15.0 diff --git a/go.mod b/go.mod index cf822a02d1ef..95a388700746 100644 --- a/go.mod +++ b/go.mod @@ -3,16 +3,16 @@ module github.com/docker/docs go 1.24.0 require ( - github.com/docker/buildx v0.23.0 // indirect + github.com/docker/buildx v0.24.0 // indirect github.com/docker/cli v28.1.1+incompatible // indirect github.com/docker/compose/v2 v2.36.1 // indirect github.com/docker/scout-cli v1.15.0 // indirect - github.com/moby/buildkit v0.22.0-rc1 // indirect + github.com/moby/buildkit v0.22.0 // indirect github.com/moby/moby v28.1.0-rc.2+incompatible // indirect ) replace ( - github.com/docker/buildx => github.com/docker/buildx v0.24.0-rc1 + github.com/docker/buildx => github.com/docker/buildx v0.24.0 github.com/docker/cli => github.com/docker/cli v28.1.0-rc.2+incompatible github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.36.1 github.com/docker/scout-cli => github.com/docker/scout-cli v1.15.0 diff --git a/go.sum b/go.sum index 9ac0681b003a..efc590142880 100644 --- a/go.sum +++ b/go.sum @@ -104,7 +104,10 @@ github.com/docker/buildx v0.22.0 h1:pGTcGZa+kxpYUlM/6ACsp1hXhkEDulz++RNXPdE8Afk= github.com/docker/buildx v0.22.0/go.mod h1:ThbnUe4kNiStlq6cLXruElyEdSTdPL3k/QerNUmPvHE= github.com/docker/buildx v0.23.0 h1:qoYhuWyZ6PVCrWbkxClLzBWDBCUkyFK6Chjzg6nU+V8= github.com/docker/buildx v0.23.0/go.mod h1:y/6Zf/y3Bf0zTWqgg8PuNFATcqnuhFmQuNf4VyrnPtg= +github.com/docker/buildx v0.24.0-rc1 h1:+VVa5qV3A+oz9MAOScJ76kYKF6zZa+EUjoaVm9WiUNI= github.com/docker/buildx v0.24.0-rc1/go.mod h1:poh1qI/j0EMizaPUArN/l9gWKNKQDeLpJ66ZOIo96hE= +github.com/docker/buildx v0.24.0 h1:qiD+xktY+Fs3R79oz8M+7pbhip78qGLx6LBuVmyb+64= +github.com/docker/buildx v0.24.0/go.mod h1:vYkdBUBjFo/i5vUE0mkajGlk03gE0T/HaGXXhgIxo8E= github.com/docker/cli v24.0.2+incompatible h1:QdqR7znue1mtkXIJ+ruQMGQhpw2JzMJLRXp6zpzF6tM= github.com/docker/cli v24.0.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v24.0.4+incompatible h1:Y3bYF9ekNTm2VFz5U/0BlMdJy73D+Y1iAAZ8l63Ydzw= From c31a3437e99cd2b704a8d3e81390356487981c97 Mon Sep 17 00:00:00 2001 From: Sarah Sanders Date: Wed, 21 May 2025 16:20:02 -0400 Subject: [PATCH 420/699] update: VAT faq and callouts (#22678) ## Description - Updated FAQ and callouts to include UK VAT collection date, May 1 2025 ## Related issues or tickets https://docker.atlassian.net/browse/ENGDOCS-2647 ## Reviews - [ ] Editorial review --- content/includes/tax-compliance.md | 9 +++++++-- content/manuals/billing/faqs.md | 13 +++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/content/includes/tax-compliance.md b/content/includes/tax-compliance.md index fdada055f3c4..7488d95526de 100644 --- a/content/includes/tax-compliance.md +++ b/content/includes/tax-compliance.md @@ -1,5 +1,10 @@ > [!IMPORTANT] > -> Starting July 1, 2024, Docker will begin collecting sales tax on subscription fees in compliance with state regulations for customers in the United States. For our global customers subject to VAT, the implementation will start rolling out on July 1, 2024. Note that while the roll out begins on this date, VAT charges may not apply to all applicable subscriptions immediately. +> For United States customers, Docker began collecting sales tax on July 1, 2024. +> For European customers, Docker began collecting VAT on March 1, 2025. +> For United Kingdom customers, Docker began collecting VAT on May 1, 2025. > -> To ensure that tax assessments are correct, make sure that your [billing information](/billing/details/) and VAT/Tax ID, if applicable, are updated. If you're exempt from sales tax, see [Register a tax certificate](/billing/tax-certificate/). +> To ensure that tax assessments are correct, make sure that your +[billing information](/billing/details/) and VAT/Tax ID, if applicable, are +updated. If you're exempt from sales tax, see +[Register a tax certificate](/billing/tax-certificate/). \ No newline at end of file diff --git a/content/manuals/billing/faqs.md b/content/manuals/billing/faqs.md index d9212c8b50f7..64a9455524e9 100644 --- a/content/manuals/billing/faqs.md +++ b/content/manuals/billing/faqs.md @@ -45,9 +45,18 @@ updated. If you need to update your default payment method, see ### Does Docker collect sales tax and/or VAT? -Docker began collecting sales tax on subscription fees for United States customers on July 1, 2024. For European customers, Docker will begin collecting VAT on March 1, 2025. +Docker collects sales tax and/or VAT from the following: -To ensure that tax assessments are correct, make sure that your billing information and VAT/Tax ID, if applicable, are updated. See [Update the billing information](/billing/details/). +- For United States customers, Docker began collecting sales tax on July 1, 2024. +- For European customers, Docker began collecting VAT on March 1, 2025. +- For United Kingdom customers, Docker began collecting VAT on May 1, 2025. + +To ensure that tax assessments are correct, make sure that your billing +information and VAT/Tax ID, if applicable, are updated. See +[Update the billing information](/billing/details/). + +If you're exempt from sales tax, see +[Register a tax certificate](/billing/tax-certificate/). ### How do I certify my tax exempt status? From db322b21c134ca978dbda239531f2cea388e98e5 Mon Sep 17 00:00:00 2001 From: Craig Osterhout <103533812+craig-osterhout@users.noreply.github.com> Date: Wed, 21 May 2025 13:22:12 -0700 Subject: [PATCH 421/699] cloud: add vanity link (#22683) Added cloud vanity link for in-app DD link. VDI page content will be updated soon for beta in 4.42 release. ## Related issues or tickets ## Reviews - [ ] Editorial review Signed-off-by: Craig --- data/redirects.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/redirects.yml b/data/redirects.yml index aedd6f60ea0b..9689723f42a1 100644 --- a/data/redirects.yml +++ b/data/redirects.yml @@ -236,9 +236,11 @@ "https://www.docker.com/products/build-cloud/?utm_campaign=2024-02-02-dbc_cli&utm_medium=in-product-ad&utm_source=desktop_v4": - /go/docker-build-cloud/ -# Run Cloud links +# Run Cloud links & Docker Cloud "/": - /go/run-cloud-eap/ +"/desktop/setup/vm-vdi/": + - /go/docker-cloud/ # CLI backlinks "/engine/cli/filter/": From a21a04f5155897b4215cc4fb23711931a02c65e7 Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Thu, 22 May 2025 08:06:56 +0100 Subject: [PATCH 422/699] desktop msi: add additional example (#22679) ## Description We have this flag in the table, but had a request to make more prominent as an example ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- .../msi-install-and-configure.md | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/content/manuals/desktop/setup/install/enterprise-deployment/msi-install-and-configure.md b/content/manuals/desktop/setup/install/enterprise-deployment/msi-install-and-configure.md index 48750fc0845a..27dc4a583907 100644 --- a/content/manuals/desktop/setup/install/enterprise-deployment/msi-install-and-configure.md +++ b/content/manuals/desktop/setup/install/enterprise-deployment/msi-install-and-configure.md @@ -72,37 +72,43 @@ Non-interactive installations are silent and any additional configuration must b > > Admin rights are required to run any of the following commands. -#### Installing interactively with verbose logging +#### Install interactively with verbose logging ```powershell msiexec /i "DockerDesktop.msi" /L*V ".\msi.log" ``` -#### Installing interactively without verbose logging +#### Install interactively without verbose logging ```powershell msiexec /i "DockerDesktop.msi" ``` -#### Installing non-interactively with verbose logging +#### Install non-interactively with verbose logging ```powershell msiexec /i "DockerDesktop.msi" /L*V ".\msi.log" /quiet ``` -#### Installing non-interactively and suppressing reboots +#### Install non-interactively and suppressing reboots ```powershell msiexec /i "DockerDesktop.msi" /L*V ".\msi.log" /quiet /norestart ``` -#### Installing non-interactively with admin settings +#### Install non-interactively with admin settings ```powershell msiexec /i "DockerDesktop.msi" /L*V ".\msi.log" /quiet /norestart ADMINSETTINGS="{"configurationFileVersion":2,"enhancedContainerIsolation":{"value":true,"locked":false}}" ALLOWEDORG="docker" ``` -#### Installing with the passive display option +#### Install interactively and allow users to switch to Windows containers without admin rights + +```powershell +msiexec /i "DockerDesktop.msi" /L*V ".\msi.log" /quiet /norestart ALLOWEDORG="docker" ALWAYSRUNSERVICE=1 +``` + +#### Install with the passive display option You can use the `/passive` display option instead of `/quiet` when you want to perform a non-interactive installation but show a progress dialog. @@ -150,25 +156,25 @@ IdentifyingNumber Name msiexec /x {10FC87E2-9145-4D7D-B493-2E99E8D8E103} /L*V ".\msi.log" /quiet ``` -#### Uninstalling interactively with verbose logging +#### Uninstall interactively with verbose logging ```powershell msiexec /x "DockerDesktop.msi" /L*V ".\msi.log" ``` -#### Uninstalling interactively without verbose logging +#### Uninstall interactively without verbose logging ```powershell msiexec /x "DockerDesktop.msi" ``` -#### Uninstalling non-interactively with verbose logging +#### Uninstall non-interactively with verbose logging ```powershell msiexec /x "DockerDesktop.msi" /L*V ".\msi.log" /quiet ``` -#### Uninstalling non-interactively without verbose logging +#### Uninstall non-interactively without verbose logging ```powershell msiexec /x "DockerDesktop.msi" /quiet From d810fe0898e41dd7ff2f5ac6d3a5fe4a1138f924 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Thu, 22 May 2025 14:01:40 +0200 Subject: [PATCH 423/699] build: fix defaults for gha cache url Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- content/manuals/build/cache/backends/gha.md | 22 ++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/content/manuals/build/cache/backends/gha.md b/content/manuals/build/cache/backends/gha.md index 9b3f5c1040d0..c5bab63d0b66 100644 --- a/content/manuals/build/cache/backends/gha.md +++ b/content/manuals/build/cache/backends/gha.md @@ -30,17 +30,17 @@ $ docker buildx build --push -t / \ The following table describes the available CSV parameters that you can pass to `--cache-to` and `--cache-from`. -| Name | Option | Type | Default | Description | -|----------------|-------------------------|-------------|--------------------------|----------------------------------------------------------------------| -| `url` | `cache-to`,`cache-from` | String | `$ACTIONS_CACHE_URL` | Cache server URL, see [authentication][1]. | -| `url_v2` | `cache-to`,`cache-from` | String | `$ACTIONS_CACHE_URL` | Cache v2 server URL, see [authentication][1]. | -| `token` | `cache-to`,`cache-from` | String | `$ACTIONS_RUNTIME_TOKEN` | Access token, see [authentication][1]. | -| `scope` | `cache-to`,`cache-from` | String | `buildkit` | Which scope cache object belongs to, see [scope][2] | -| `mode` | `cache-to` | `min`,`max` | `min` | Cache layers to export, see [cache mode][3]. | -| `ignore-error` | `cache-to` | Boolean | `false` | Ignore errors caused by failed cache exports. | -| `timeout` | `cache-to`,`cache-from` | String | `10m` | Max duration for importing or exporting cache before it's timed out. | -| `repository` | `cache-to` | String | | GitHub repository used for cache storage. | -| `ghtoken` | `cache-to` | String | | GitHub token required for accessing the GitHub API. | +| Name | Option | Type | Default | Description | +|----------------|-------------------------|-------------|------------------------------------------------|----------------------------------------------------------------------| +| `url` | `cache-to`,`cache-from` | String | `$ACTIONS_CACHE_URL` or `$ACTIONS_RESULTS_URL` | Cache server URL, see [authentication][1]. | +| `url_v2` | `cache-to`,`cache-from` | String | `$ACTIONS_RESULTS_URL` | Cache v2 server URL, see [authentication][1]. | +| `token` | `cache-to`,`cache-from` | String | `$ACTIONS_RUNTIME_TOKEN` | Access token, see [authentication][1]. | +| `scope` | `cache-to`,`cache-from` | String | `buildkit` | Which scope cache object belongs to, see [scope][2] | +| `mode` | `cache-to` | `min`,`max` | `min` | Cache layers to export, see [cache mode][3]. | +| `ignore-error` | `cache-to` | Boolean | `false` | Ignore errors caused by failed cache exports. | +| `timeout` | `cache-to`,`cache-from` | String | `10m` | Max duration for importing or exporting cache before it's timed out. | +| `repository` | `cache-to` | String | | GitHub repository used for cache storage. | +| `ghtoken` | `cache-to` | String | | GitHub token required for accessing the GitHub API. | [1]: #authentication [2]: #scope From 12db8ef18077888ca4c520adfa62db9bc2661633 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Thu, 22 May 2025 14:19:41 +0200 Subject: [PATCH 424/699] Update buildkit reference to v0.22.0 Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 95a388700746..3ce87f3ebe52 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,6 @@ replace ( github.com/docker/cli => github.com/docker/cli v28.1.0-rc.2+incompatible github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.36.1 github.com/docker/scout-cli => github.com/docker/scout-cli v1.15.0 - github.com/moby/buildkit => github.com/moby/buildkit v0.22.0-rc1 + github.com/moby/buildkit => github.com/moby/buildkit v0.22.0 github.com/moby/moby => github.com/moby/moby v28.1.0-rc.2+incompatible ) diff --git a/go.sum b/go.sum index efc590142880..4d854bc13e3b 100644 --- a/go.sum +++ b/go.sum @@ -379,6 +379,8 @@ github.com/moby/buildkit v0.20.0 h1:aF5RujjQ310Pn6SLL/wQYIrSsPXy0sQ5KvWifwq1h8Y= github.com/moby/buildkit v0.20.0/go.mod h1:HYFUIK+iGDRxRgdphZ9Nv0y1Fz7mv0HrU7xZoXx217E= github.com/moby/buildkit v0.22.0-rc1 h1:Q47jZZws7+0WhucTcm35NRV8NcO6n1SwIikzfqcGKLo= github.com/moby/buildkit v0.22.0-rc1/go.mod h1:j4pP5hxiTWcz7xuTK2cyxQislHl/N2WWHzOy43DlLJw= +github.com/moby/buildkit v0.22.0 h1:aWN06w1YGSVN1XfeZbj2ZbgY+zi5xDAjEFI8Cy9fTjA= +github.com/moby/buildkit v0.22.0/go.mod h1:j4pP5hxiTWcz7xuTK2cyxQislHl/N2WWHzOy43DlLJw= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/moby v24.0.2+incompatible h1:yH+5dRHH1x3XRKzl1THA2aGTy6CHYnkt5N924ADMax8= github.com/moby/moby v24.0.2+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= From 69fb24d7ff284a5aa2eb796f0ac2799563963f91 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Thu, 22 May 2025 14:38:18 +0200 Subject: [PATCH 425/699] build: dockerfile v0.16.0 release notes Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- .../buildkit/dockerfile-release-notes.md | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/content/manuals/build/buildkit/dockerfile-release-notes.md b/content/manuals/build/buildkit/dockerfile-release-notes.md index 35e5a586b04c..4843619c6fc8 100644 --- a/content/manuals/build/buildkit/dockerfile-release-notes.md +++ b/content/manuals/build/buildkit/dockerfile-release-notes.md @@ -13,6 +13,35 @@ issues, and bug fixes in [Dockerfile reference](/reference/dockerfile.md). For usage, see the [Dockerfile frontend syntax](frontend.md) page. +## 1.16.0 + +{{< release-date date="2025-05-22" >}} + +The full release note for this release is available +[on GitHub](https://github.com/moby/buildkit/releases/tag/dockerfile%2F1.16.0). + +```dockerfile +# syntax=docker/dockerfile:1.16.0 +``` + +* `ADD --checksum` support for Git URL. [moby/buildkit#5975](https://github.com/moby/buildkit/pull/5975) +* Allow whitespace in heredocs. [moby/buildkit#5817](https://github.com/moby/buildkit/pull/5817) +* `WORKDIR` now supports `SOURCE_DATE_EPOCH`. [moby/buildkit#5960](https://github.com/moby/buildkit/pull/5960) +* Leave default PATH environment variable set by the base image for WCOW. [moby/buildkit#5895](https://github.com/moby/buildkit/pull/5895) + +## 1.15.1 + +{{< release-date date="2025-03-30" >}} + +The full release note for this release is available +[on GitHub](https://github.com/moby/buildkit/releases/tag/dockerfile%2F1.15.1). + +```dockerfile +# syntax=docker/dockerfile:1.15.1 +``` + +* Fix `no scan targets for linux/arm64/v8` when `--attest type=sbom` is used. [moby/buildkit#5941](https://github.com/moby/buildkit/pull/5941) + ## 1.15.0 {{< release-date date="2025-04-15" >}} From ff5ddcfbf31863f59ed2c8f13bb46451e7c1c1ae Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 23 May 2025 11:56:07 +0200 Subject: [PATCH 426/699] add: mcp redirect (#22693) Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- data/redirects.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/data/redirects.yml b/data/redirects.yml index 9689723f42a1..37bd3876b5ff 100644 --- a/data/redirects.yml +++ b/data/redirects.yml @@ -298,7 +298,9 @@ - /go/hub-pull-limits/ # Desktop DMR - "/model-runner/": - /go/model-runner/ - \ No newline at end of file + +# Desktop MCP Toolkit +"/ai/mcp-toolkit/": + - /go/mcp-toolkit/ From d757ce6a10c9f9734b7f7f0864356eaf075f432f Mon Sep 17 00:00:00 2001 From: Guillaume Lours <705411+glours@users.noreply.github.com> Date: Fri, 23 May 2025 17:37:12 +0200 Subject: [PATCH 427/699] release-notes for Compose v2.36.2 version (#22695) ## Description Add release notes for Compose `v2.36.2` version ## Related issues or tickets https://docker.atlassian.net/browse/APCLI-1138 ## Reviews - [ ] Technical review - [x] Editorial review - [ ] Product review --------- Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- _vendor/modules.txt | 2 +- .../manuals/compose/releases/release-notes.md | 16 ++++++++++++++++ go.mod | 4 ++-- go.sum | 2 ++ hugo.yaml | 2 +- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/_vendor/modules.txt b/_vendor/modules.txt index 421fd7c081dd..162fbb7efe17 100644 --- a/_vendor/modules.txt +++ b/_vendor/modules.txt @@ -2,5 +2,5 @@ # github.com/moby/buildkit v0.22.0 # github.com/docker/buildx v0.24.0 # github.com/docker/cli v28.1.1+incompatible -# github.com/docker/compose/v2 v2.36.1 +# github.com/docker/compose/v2 v2.36.2 # github.com/docker/scout-cli v1.15.0 diff --git a/content/manuals/compose/releases/release-notes.md b/content/manuals/compose/releases/release-notes.md index 0ebbd27b47c2..8458085d8fb9 100644 --- a/content/manuals/compose/releases/release-notes.md +++ b/content/manuals/compose/releases/release-notes.md @@ -15,6 +15,22 @@ For more detailed information, see the [release notes in the Compose repo](https ## 2.36.1 +{{< release-date date="2025-05-23" >}} + +### Bug fixes and enhancements + +- Fixed an issue with random port allocation +- Fixed an issue recreating containers when not needed during inner loop +- Fixed a problem during `up --build` with `additional_context` + +### Update + +- Dependencies upgrade: bump compose-go to v2.6.4 +- Dependencies upgrade: bump buildx to v0.24.0 +- Dependencies upgrade: bump buildkit to v0.22.0 + +## 2.36.1 + {{< release-date date="2025-05-19" >}} ### Bug fixes and enhancements diff --git a/go.mod b/go.mod index 95a388700746..6bc998dde895 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.24.0 require ( github.com/docker/buildx v0.24.0 // indirect github.com/docker/cli v28.1.1+incompatible // indirect - github.com/docker/compose/v2 v2.36.1 // indirect + github.com/docker/compose/v2 v2.36.2 // indirect github.com/docker/scout-cli v1.15.0 // indirect github.com/moby/buildkit v0.22.0 // indirect github.com/moby/moby v28.1.0-rc.2+incompatible // indirect @@ -14,7 +14,7 @@ require ( replace ( github.com/docker/buildx => github.com/docker/buildx v0.24.0 github.com/docker/cli => github.com/docker/cli v28.1.0-rc.2+incompatible - github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.36.1 + github.com/docker/compose/v2 => github.com/docker/compose/v2 v2.36.2 github.com/docker/scout-cli => github.com/docker/scout-cli v1.15.0 github.com/moby/buildkit => github.com/moby/buildkit v0.22.0-rc1 github.com/moby/moby => github.com/moby/moby v28.1.0-rc.2+incompatible diff --git a/go.sum b/go.sum index efc590142880..a81e8aad1706 100644 --- a/go.sum +++ b/go.sum @@ -239,6 +239,8 @@ github.com/docker/compose/v2 v2.36.0 h1:MACSfQ2xqcwgCwAtsHVoQkFbHi2nNfNAsd5EWFg1 github.com/docker/compose/v2 v2.36.0/go.mod h1:kFPppTinl2Q0Lv3Dy9titIL41oWYoUkNxoKQZb/lfSU= github.com/docker/compose/v2 v2.36.1 h1:BmTE1Ps6XDOuubyL97ucPvIn8Nq2XprRylE2dgCtTXw= github.com/docker/compose/v2 v2.36.1/go.mod h1:w6fj+dvMW9W0gFaTpIwJ2PYstqiGIC07Cajp5wPukO0= +github.com/docker/compose/v2 v2.36.2 h1:rxk1PUUbhbAS6HkGsYo9xUmMBpKtVwFMNCQjE4+i5fk= +github.com/docker/compose/v2 v2.36.2/go.mod h1:mZygkne+MAMu/e1B28PBFmG0Z0WefbxZ/IpcjSFdrw8= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= diff --git a/hugo.yaml b/hugo.yaml index da91269bc731..3677727b3179 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -140,7 +140,7 @@ params: # (Used to show e.g., "latest" and "latest"-1 in engine install examples docker_ce_version_prev: "28.1.0" # Latest Docker Compose version - compose_version: "v2.36.1" + compose_version: "v2.36.2" # Latest BuildKit version buildkit_version: "0.21.0" From 726b57a2ac04222da149beb46335ad884d5cc29d Mon Sep 17 00:00:00 2001 From: Craig Osterhout <103533812+craig-osterhout@users.noreply.github.com> Date: Fri, 23 May 2025 10:34:20 -0700 Subject: [PATCH 428/699] registry: add reference (#22497) ## Description Re-add registry reference from point in time of deletion at https://github.com/docker/docs/pull/18390, not upstream. https://deploy-preview-22497--docsdocker.netlify.app/reference/api/registry/latest/ https://deploy-preview-22497--docsdocker.netlify.app/reference/api/registry/auth/ ## Related issues or tickets ENGDOCS-2577 ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --------- Signed-off-by: Craig Co-authored-by: sheltongraves <148902861+sheltongraves@users.noreply.github.com> Co-authored-by: Sarah Sanders --- content/reference/_index.md | 4 + content/reference/api/registry/_index.md | 5 + content/reference/api/registry/auth.md | 221 +++ .../api/registry/images/v2-registry-auth.png | Bin 0 -> 15859 bytes content/reference/api/registry/latest.md | 7 + content/reference/api/registry/latest.yaml | 1345 +++++++++++++++++ 6 files changed, 1582 insertions(+) create mode 100644 content/reference/api/registry/_index.md create mode 100644 content/reference/api/registry/auth.md create mode 100644 content/reference/api/registry/images/v2-registry-auth.png create mode 100644 content/reference/api/registry/latest.md create mode 100644 content/reference/api/registry/latest.yaml diff --git a/content/reference/_index.md b/content/reference/_index.md index b0b093cd702d..d51c780f93fc 100644 --- a/content/reference/_index.md +++ b/content/reference/_index.md @@ -42,6 +42,10 @@ params: description: API for Docker Verified Publishers to fetch analytics data. icon: area_chart link: /reference/api/hub/dvp/ + - title: Registry API + description: API for Docker Registry. + icon: database + link: /reference/api/registry/latest/ --- This section includes the reference documentation for the Docker platform's diff --git a/content/reference/api/registry/_index.md b/content/reference/api/registry/_index.md new file mode 100644 index 000000000000..0d376d4a28ec --- /dev/null +++ b/content/reference/api/registry/_index.md @@ -0,0 +1,5 @@ +--- +title: Registry API +build: + render: never +--- \ No newline at end of file diff --git a/content/reference/api/registry/auth.md b/content/reference/api/registry/auth.md new file mode 100644 index 000000000000..d395066014af --- /dev/null +++ b/content/reference/api/registry/auth.md @@ -0,0 +1,221 @@ +--- +title: Registry authentication +description: "Specifies the Docker Registry v2 authentication" +keywords: registry, images, tags, repository, distribution, Bearer authentication, advanced +--- + +This document outlines the registry authentication scheme: + +![v2 registry auth](./images/v2-registry-auth.png) + +1. Attempt to begin a push/pull operation with the registry. +2. If the registry requires authorization it will return a `401 Unauthorized` + HTTP response with information on how to authenticate. +3. The registry client makes a request to the authorization service for a + Bearer token. +4. The authorization service returns an opaque Bearer token representing the + client's authorized access. +5. The client retries the original request with the Bearer token embedded in + the request's Authorization header. +6. The Registry authorizes the client by validating the Bearer token and the + claim set embedded within it and begins the push/pull session as usual. + +## Requirements + +- Registry clients which can understand and respond to token auth challenges + returned by the resource server. +- An authorization server capable of managing access controls to their + resources hosted by any given service (such as repositories in a Docker + Registry). +- A Docker Registry capable of trusting the authorization server to sign tokens + which clients can use for authorization and the ability to verify these + tokens for single use or for use during a sufficiently short period of time. + +## Authorization server endpoint descriptions + +The described server is meant to serve as a standalone access control manager +for resources hosted by other services which want to authenticate and manage +authorizations using a separate access control manager. + +A service like this is used by the official Docker Registry to authenticate +clients and verify their authorization to Docker image repositories. + +As of Docker 1.6, the registry client within the Docker Engine has been updated +to handle such an authorization workflow. + +## How to authenticate + +Registry V1 clients first contact the index to initiate a push or pull. Under +the Registry V2 workflow, clients should contact the registry first. If the +registry server requires authentication it will return a `401 Unauthorized` +response with a `WWW-Authenticate` header detailing how to authenticate to this +registry. + +For example, say I (username `jlhawn`) am attempting to push an image to the +repository `samalba/my-app`. For the registry to authorize this, I will need +`push` access to the `samalba/my-app` repository. The registry will first +return this response: + +```text +HTTP/1.1 401 Unauthorized +Content-Type: application/json; charset=utf-8 +Docker-Distribution-Api-Version: registry/2.0 +Www-Authenticate: Bearer realm="https://auth.docker.io/token",service="registry.docker.io",scope="repository:samalba/my-app:pull,push" +Date: Thu, 10 Sep 2015 19:32:31 GMT +Content-Length: 235 +Strict-Transport-Security: max-age=31536000 + +{"errors":[{"code":"UNAUTHORIZED","message":"access to the requested resource is not authorized","detail":[{"Type":"repository","Name":"samalba/my-app","Action":"pull"},{"Type":"repository","Name":"samalba/my-app","Action":"push"}]}]} +``` + +Note the HTTP Response Header indicating the auth challenge: + +```text +Www-Authenticate: Bearer realm="https://auth.docker.io/token",service="registry.docker.io",scope="repository:samalba/my-app:pull,push" +``` + +This format is documented in [Section 3 of RFC 6750: The OAuth 2.0 Authorization Framework: Bearer Token Usage](https://tools.ietf.org/html/rfc6750#section-3) + +This challenge indicates that the registry requires a token issued by the +specified token server and that the request the client is attempting will +need to include sufficient access entries in its claim set. To respond to this +challenge, the client will need to make a `GET` request to the URL +`https://auth.docker.io/token` using the `service` and `scope` values from the +`WWW-Authenticate` header. + +## Requesting a token + +Defines getting a bearer and refresh token using the token endpoint. + +### Query parameters + +#### `service` + +The name of the service which hosts the resource. + +#### `offline_token` + +Whether to return a refresh token along with the bearer token. A refresh token +is capable of getting additional bearer tokens for the same subject with +different scopes. The refresh token does not have an expiration and should be +considered completely opaque to the client. + +#### `client_id` + +String identifying the client. This `client_id` does not need to be registered +with the authorization server but should be set to a meaningful value in order +to allow auditing keys created by unregistered clients. Accepted syntax is +defined in [RFC6749 Appendix +A.1](https://tools.ietf.org/html/rfc6749#appendix-A.1). + +#### `scope` + +The resource in question, formatted as one of the space-delimited entries from +the `scope` parameters from the `WWW-Authenticate` header shown previously. This +query parameter should be specified multiple times if there is more than one +`scope` entry from the `WWW-Authenticate` header. The previous example would be +specified as: `scope=repository:samalba/my-app:push`. The scope field may be +empty to request a refresh token without providing any resource permissions to +the returned bearer token. + +### Token response fields + +#### `token` + +An opaque `Bearer` token that clients should supply to subsequent +requests in the `Authorization` header. + +#### `access_token` + +For compatibility with OAuth 2.0, the `token` under the name `access_token` is +also accepted. At least one of these fields must be specified, but both may +also appear (for compatibility with older clients). When both are specified, +they should be equivalent; if they differ the client's choice is undefined. + +#### `expires_in` + +(Optional) The duration in seconds since the token was issued that it will +remain valid. When omitted, this defaults to 60 seconds. For compatibility +with older clients, a token should never be returned with less than 60 seconds +to live. + +#### `issued_at` + +(Optional) The [RFC3339](https://www.ietf.org/rfc/rfc3339.txt)-serialized UTC +standard time at which a given token was issued. If `issued_at` is omitted, the +expiration is from when the token exchange completed. + +#### `refresh_token` + +(Optional) Token which can be used to get additional access tokens for +the same subject with different scopes. This token should be kept secure +by the client and only sent to the authorization server which issues +bearer tokens. This field will only be set when `offline_token=true` is +provided in the request. + +### Example + +For this example, the client makes an HTTP GET request to the following URL: + +```text +https://auth.docker.io/token?service=registry.docker.io&scope=repository:samalba/my-app:pull,push +``` + +The token server should first attempt to authenticate the client using any +authentication credentials provided with the request. From Docker 1.11 the +Docker Engine supports both Basic Authentication and OAuth2 for +getting tokens. Docker 1.10 and before, the registry client in the Docker Engine +only supports Basic Authentication. If an attempt to authenticate to the token +server fails, the token server should return a `401 Unauthorized` response +indicating that the provided credentials are invalid. + +Whether the token server requires authentication is up to the policy of that +access control provider. Some requests may require authentication to determine +access (such as pushing or pulling a private repository) while others may not +(such as pulling from a public repository). + +After authenticating the client (which may simply be an anonymous client if +no attempt was made to authenticate), the token server must next query its +access control list to determine whether the client has the requested scope. In +this example request, if I have authenticated as user `jlhawn`, the token +server will determine what access I have to the repository `samalba/my-app` +hosted by the entity `registry.docker.io`. + +Once the token server has determined what access the client has to the +resources requested in the `scope` parameter, it will take the intersection of +the set of requested actions on each resource and the set of actions that the +client has in fact been granted. If the client only has a subset of the +requested access **it must not be considered an error** as it is not the +responsibility of the token server to indicate authorization errors as part of +this workflow. + +Continuing with the example request, the token server will find that the +client's set of granted access to the repository is `[pull, push]` which when +intersected with the requested access `[pull, push]` yields an equal set. If +the granted access set was found only to be `[pull]` then the intersected set +would only be `[pull]`. If the client has no access to the repository then the +intersected set would be empty, `[]`. + +It is this intersected set of access which is placed in the returned token. + +The server then constructs an implementation-specific token with this +intersected set of access, and returns it to the Docker client to use to +authenticate to the audience service (within the indicated window of time): + +```text +HTTP/1.1 200 OK +Content-Type: application/json + +{"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IlBZWU86VEVXVTpWN0pIOjI2SlY6QVFUWjpMSkMzOlNYVko6WEdIQTozNEYyOjJMQVE6WlJNSzpaN1E2In0.eyJpc3MiOiJhdXRoLmRvY2tlci5jb20iLCJzdWIiOiJqbGhhd24iLCJhdWQiOiJyZWdpc3RyeS5kb2NrZXIuY29tIiwiZXhwIjoxNDE1Mzg3MzE1LCJuYmYiOjE0MTUzODcwMTUsImlhdCI6MTQxNTM4NzAxNSwianRpIjoidFlKQ08xYzZjbnl5N2tBbjBjN3JLUGdiVjFIMWJGd3MiLCJhY2Nlc3MiOlt7InR5cGUiOiJyZXBvc2l0b3J5IiwibmFtZSI6InNhbWFsYmEvbXktYXBwIiwiYWN0aW9ucyI6WyJwdXNoIl19XX0.QhflHPfbd6eVF4lM9bwYpFZIV0PfikbyXuLx959ykRTBpe3CYnzs6YBK8FToVb5R47920PVLrh8zuLzdCr9t3w", "expires_in": 3600,"issued_at": "2009-11-10T23:00:00Z"} +``` + +## Using the Bearer token + +Once the client has a token, it will try the registry request again with the +token placed in the HTTP `Authorization` header like so: + +```text +Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IkJWM0Q6MkFWWjpVQjVaOktJQVA6SU5QTDo1RU42Ok40SjQ6Nk1XTzpEUktFOkJWUUs6M0ZKTDpQT1RMIn0.eyJpc3MiOiJhdXRoLmRvY2tlci5jb20iLCJzdWIiOiJCQ0NZOk9VNlo6UUVKNTpXTjJDOjJBVkM6WTdZRDpBM0xZOjQ1VVc6NE9HRDpLQUxMOkNOSjU6NUlVTCIsImF1ZCI6InJlZ2lzdHJ5LmRvY2tlci5jb20iLCJleHAiOjE0MTUzODczMTUsIm5iZiI6MTQxNTM4NzAxNSwiaWF0IjoxNDE1Mzg3MDE1LCJqdGkiOiJ0WUpDTzFjNmNueXk3a0FuMGM3cktQZ2JWMUgxYkZ3cyIsInNjb3BlIjoiamxoYXduOnJlcG9zaXRvcnk6c2FtYWxiYS9teS1hcHA6cHVzaCxwdWxsIGpsaGF3bjpuYW1lc3BhY2U6c2FtYWxiYTpwdWxsIn0.Y3zZSwaZPqy4y9oRBVRImZyv3m_S9XDHF1tWwN7mL52C_IiA73SJkWVNsvNqpJIn5h7A2F8biv_S2ppQ1lgkbw +``` + +This is also described in [Section 2.1 of RFC 6750: The OAuth 2.0 Authorization Framework: Bearer Token Usage](https://tools.ietf.org/html/rfc6750#section-2.1) \ No newline at end of file diff --git a/content/reference/api/registry/images/v2-registry-auth.png b/content/reference/api/registry/images/v2-registry-auth.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea8a4205bc33d1763dfce3a38a26c2644f32849 GIT binary patch literal 15859 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 B8PEU# literal 0 HcmV?d00001 diff --git a/content/reference/api/registry/latest.md b/content/reference/api/registry/latest.md new file mode 100644 index 000000000000..7df6e5971659 --- /dev/null +++ b/content/reference/api/registry/latest.md @@ -0,0 +1,7 @@ +--- +layout: api +title: Supported registry API for Docker Hub +linktitle: Latest +description: "Supported registry API endpoints." +keywords: registry, on-prem, images, tags, repository, distribution, api, advanced +--- diff --git a/content/reference/api/registry/latest.yaml b/content/reference/api/registry/latest.yaml new file mode 100644 index 000000000000..c38c9ffd718a --- /dev/null +++ b/content/reference/api/registry/latest.yaml @@ -0,0 +1,1345 @@ +openapi: 3.0.3 +info: + title: Supported registry API for Docker Hub + description: | + Docker Hub is an OCI-compliant registry, which means it adheres to the open + standards defined by the Open Container Initiative (OCI) for distributing + container images. This ensures compatibility with a wide range of tools and + platforms in the container ecosystem. + + This reference documents the Docker Hub-supported subset of the Registry HTTP API V2. + It focuses on pulling, pushing, and deleting images. It does not cover the full OCI Distribution Specification. + + For the complete OCI specification, see [OCI Distribution Specification](https://github.com/opencontainers/distribution-spec). +servers: + - description: Docker Hub registry API + x-audience: public + url: https://registry-1.docker.io + +tags: + - name: overview + x-displayName: Overview + description: | + All endpoints in this API are prefixed by the version and repository name, for example: + + ``` + /v2// + ``` + + This format provides structured access control and URI-based scoping of image operations. + + For example, to interact with the `library/ubuntu` repository, use: + + ``` + /v2/library/ubuntu/ + ``` + + Repository names must meet these requirements: + 1. Consist of path components matching `[a-z0-9]+(?:[._-][a-z0-9]+)*` + 2. If more than one component, they must be separated by `/` + 3. Full repository name must be fewer than 256 characters + + + - name: authentication + x-displayName: Authentication + description: | + Specifies registry authentication. + externalDocs: + description: Detailed authentication workflow and token usage + url: https://docs.docker.com/reference/api/registry/auth/ + + - name: Manifests + x-displayName: Manifests + description: | + Image manifests are JSON documents that describe an image: its configuration blob, the digests of each layer blob, and metadata such as media‑types and annotations. + + - name: Blobs + x-displayName: Blobs + description: | + Blobs are the binary objects referenced from manifests: + the config JSON and one or more compressed layer tarballs. + + - name: pull + x-displayName: Pulling Images + description: | + Pulling an image involves retrieving the manifest and downloading each of the image's layer blobs. This section outlines the general steps followed by a working example. + + 1. [Get a bearer token for the repository](https://docs.docker.com/reference/api/registry/auth/). + 2. [Get the image manifest](#operation/GetImageManifest). + 3. If the response in the previous step is a multi-architecture manifest list, you must do the following: + - Parse the `manifests[]` array to locate the digest for your target platform (e.g., `linux/amd64`). + - [Get the image manifest](#operation/GetImageManifest) using the located digest. + 4. [Check if the blob exists](#operation/CheckBlobExists) before downloading. The client should send a `HEAD` request for each layer digest. + 5. [Download each layer blob](#operation/GetBlob) using the digest obtained from the manifest. The client should send a `GET` request for each layer digest. + + The following bash script example pulls `library/ubuntu:latest` from Docker Hub. + + ```bash + #!/bin/bash + + # Step 1: Get a bearer token + TOKEN=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/ubuntu:pull" | jq -r .token) + + # Step 2: Get the image manifest. In this example, an image manifest list is returned. + curl -s -H "Authorization: Bearer $TOKEN" \ + -H "Accept: application/vnd.docker.distribution.manifest.list.v2+json" \ + https://registry-1.docker.io/v2/library/ubuntu/manifests/latest \ + -o manifest-list.json + + # Step 3a: Parse the `manifests[]` array to locate the digest for your target platform (e.g., `linux/amd64`). + IMAGE_MANIFEST_DIGEST=$(jq -r '.manifests[] | select(.platform.architecture == "amd64" and .platform.os == "linux") | .digest' manifest-list.json) + + # Step 3b: Get the platform-specific image manifest + curl -s -H "Authorization: Bearer $TOKEN" \ + -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \ + https://registry-1.docker.io/v2/library/ubuntu/manifests/$IMAGE_MANIFEST_DIGEST \ + -o manifest.json + + # Step 4: Send a HEAD request to check if the layer blob exists + DIGEST=$(jq -r '.layers[0].digest' manifest.json) + curl -I -H "Authorization: Bearer $TOKEN" \ + https://registry-1.docker.io/v2/library/ubuntu/blobs/$DIGEST + + # Step 5: Download the layer blob + curl -L -H "Authorization: Bearer $TOKEN" \ + https://registry-1.docker.io/v2/library/ubuntu/blobs/$DIGEST + ``` + + This example pulls the manifest and the first layer for the `ubuntu:latest` image on the `linux/amd64` platform. Repeat steps 4 and 5 for each digest in the `.layers[]` array in the manifest. + + + - name: push + x-displayName: Pushing Images + description: | + Pushing an image involves uploading any image blobs (such as the config or layers), and then uploading the manifest that references those blobs. + + This section outlines the basic steps to push an image using the registry API. + + 1. [Get a bearer token for the repository](https://docs.docker.com/reference/api/registry/auth/) + + 2. [Check if the blob exists](#operation/CheckBlobExists) using a `HEAD` request for each blob digest. + + 3. If the blob does not exist, [upload the blob](#operation/CompleteBlobUpload) using a monolithic `PUT` request: + - First, [initiate the upload](#operation/InitiateBlobUpload) with `POST`. + - Then [upload and complete](#operation/CompleteBlobUpload) with `PUT`. + + **Note**: Alternatively, you can upload the blob in multiple chunks by using `PATCH` requests to send each chunk, followed by a final `PUT` request to complete the upload. This is known as a [chunked upload](#operation/UploadBlobChunk) and is useful for large blobs or when resuming interrupted uploads. + + + 4. [Upload the image manifest](#operation/PutImageManifest) using a `PUT` request to associate the config and layers. + + The following bash script example pushes a dummy config blob and manifest to `yourusername/helloworld:latest` on Docker Hub. You can replace `yourusername` with your Docker Hub username and `dckr_pat` with your Docker Hub personal access token. + + ```bash + #!/bin/bash + + USERNAME=yourusername + PASSWORD=dckr_pat + REPO=yourusername/helloworld + TAG=latest + CONFIG=config.json + MIME_TYPE=application/vnd.docker.container.image.v1+json + + # Step 1: Get a bearer token + TOKEN=$(curl -s -u "$USERNAME:$PASSWORD" \ + "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$REPO:push,pull" \ + | jq -r .token) + + # Create a dummy config blob and compute its digest + echo '{"architecture":"amd64","os":"linux","config":{},"rootfs":{"type":"layers","diff_ids":[]}}' > $CONFIG + DIGEST="sha256:$(sha256sum $CONFIG | awk '{print $1}')" + + # Step 2: Check if the blob exists + STATUS=$(curl -s -o /dev/null -w "%{http_code}" -I \ + -H "Authorization: Bearer $TOKEN" \ + https://registry-1.docker.io/v2/$REPO/blobs/$DIGEST) + + if [ "$STATUS" != "200" ]; then + # Step 3: Upload blob using monolithic upload + LOCATION=$(curl -sI -X POST \ + -H "Authorization: Bearer $TOKEN" \ + https://registry-1.docker.io/v2/$REPO/blobs/uploads/ \ + | grep -i Location | tr -d '\r' | awk '{print $2}') + + curl -s -X PUT "$LOCATION&digest=$DIGEST" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/octet-stream" \ + --data-binary @$CONFIG + fi + + # Step 4: Upload the manifest that references the config blob + MANIFEST=$(cat <` header. + + x-codeSamples: + - lang: Bash + label: cURL + source: | + # GET a manifest (by tag or digest) + curl -H "Authorization: Bearer $TOKEN" \ + -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \ + https://registry-1.docker.io/v2/library/ubuntu/manifests/latest + parameters: + - name: name + in: path + required: true + description: Name of the target repository + example: library/ubuntu + schema: + type: string + - name: reference + in: path + required: true + description: Tag or digest of the target manifest + examples: + by-tag: + summary: Tag + value: latest + by-digest: + summary: Digest + value: sha256:abc123def456... + schema: + type: string + - name: Authorization + in: header + required: true + description: RFC7235-compliant authorization header (e.g., `Bearer `). + schema: + type: string + - name: Accept + in: header + required: false + description: | + Media type(s) the client supports for the manifest. + + The registry supports the following media types: + - application/vnd.docker.distribution.manifest.v2+json + - application/vnd.docker.distribution.manifest.list.v2+json + - application/vnd.oci.image.manifest.v1+json + - application/vnd.oci.image.index.v1+json + schema: + type: string + + responses: + "200": + description: Manifest fetched successfully. + headers: + Docker-Content-Digest: + description: Digest of the returned manifest content. + schema: + type: string + Content-Type: + description: Media type of the returned manifest. + schema: + type: string + content: + application/vnd.docker.distribution.manifest.v2+json: + schema: + type: object + required: + - schemaVersion + - mediaType + - config + - layers + properties: + schemaVersion: + type: integer + example: 2 + mediaType: + type: string + example: application/vnd.docker.distribution.manifest.v2+json + config: + type: object + properties: + mediaType: + type: string + example: application/vnd.docker.container.image.v1+json + size: + type: integer + example: 7023 + digest: + type: string + example: sha256:a3f3e...c1234 + layers: + type: array + items: + type: object + properties: + mediaType: + type: string + example: application/vnd.docker.image.rootfs.diff.tar.gzip + size: + type: integer + example: 32654 + digest: + type: string + example: sha256:bcf2...78901 + examples: + docker-manifest: + summary: Docker image manifest (schema v2) + value: + { + "schemaVersion": 2, + "mediaType": "application/vnd.docker.distribution.manifest.v2+json", + "config": { + "mediaType": "application/vnd.docker.container.image.v1+json", + "size": 7023, + "digest": "sha256:123456abcdef..." + }, + "layers": [ + { + "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "size": 32654, + "digest": "sha256:abcdef123456..." + }, + { + "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "size": 16724, + "digest": "sha256:7890abcdef12..." + } + ] + } + + "400": + description: Invalid name or reference. + "401": + description: Authentication required. + "403": + description: Access denied. + "404": + description: Repository or manifest not found. + "429": + description: Too many requests. + + + put: + tags: + - Manifests + summary: Put image manifest + operationId: PutImageManifest + description: | + Upload an image manifest for a given tag or digest. This operation registers a manifest in a repository, allowing it to be pulled using the specified reference. + + This endpoint is typically used after all layer and config blobs have been uploaded to the registry. + + The manifest must conform to the expected schema and media type. For Docker image manifest schema version 2, use: + `application/vnd.docker.distribution.manifest.v2+json` + + Requires authentication via a bearer token with `push` scope for the target repository. + x-codeSamples: + - lang: Bash + label: cURL + source: | + # PUT a manifest (tag = latest) + curl -X PUT \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/vnd.docker.distribution.manifest.v2+json" \ + --data-binary @manifest.json \ + https://registry-1.docker.io/v2/library/ubuntu/manifests/latest + parameters: + - name: name + in: path + required: true + description: Name of the target Repository + example: library/ubuntu + schema: + type: string + - name: reference + in: path + required: true + description: Tag or digest to associate with the uploaded Manifest + examples: + by-tag: + summary: Tag + value: latest + by-digest: + summary: Digest + value: sha256:abc123def456... + schema: + type: string + - name: Authorization + in: header + required: true + description: RFC7235-compliant authorization header (e.g., `Bearer `). + schema: + type: string + - name: Content-Type + in: header + required: true + description: Media type of the manifest being uploaded. + schema: + type: string + example: application/vnd.docker.distribution.manifest.v2+json + + requestBody: + required: true + content: + application/vnd.docker.distribution.manifest.v2+json: + schema: + type: object + required: + - schemaVersion + - mediaType + - config + - layers + properties: + schemaVersion: + type: integer + example: 2 + mediaType: + type: string + example: application/vnd.docker.distribution.manifest.v2+json + config: + type: object + required: + - mediaType + - size + - digest + properties: + mediaType: + type: string + example: application/vnd.docker.container.image.v1+json + size: + type: integer + example: 7023 + digest: + type: string + example: sha256:123456abcdef... + layers: + type: array + items: + type: object + required: + - mediaType + - size + - digest + properties: + mediaType: + type: string + example: application/vnd.docker.image.rootfs.diff.tar.gzip + size: + type: integer + example: 32654 + digest: + type: string + example: sha256:abcdef123456... + + examples: + sample-manifest: + summary: Sample Docker image manifest (schema v2) + value: + { + "schemaVersion": 2, + "mediaType": "application/vnd.docker.distribution.manifest.v2+json", + "config": { + "mediaType": "application/vnd.docker.container.image.v1+json", + "size": 7023, + "digest": "sha256:123456abcdef..." + }, + "layers": [ + { + "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "size": 32654, + "digest": "sha256:abcdef123456..." + } + ] + } + + responses: + "201": + description: Manifest created successfully. + headers: + Docker-Content-Digest: + description: Digest of the stored manifest. + schema: + type: string + example: sha256:abcdef123456... + Location: + description: Canonical location of the uploaded manifest. + schema: + type: string + example: /v2/library/ubuntu/manifests/latest + Content-Length: + description: Always zero. + schema: + type: integer + example: 0 + "400": + description: Invalid name, reference, or manifest. + "401": + description: Authentication required. + "403": + description: Access denied. + "404": + description: Repository not found. + "405": + description: Operation not allowed. + "429": + description: Too many requests. + head: + tags: + - Manifests + summary: Check if manifest exists + operationId: HeadImageManifest + description: | + Use this endpoint to verify whether a manifest exists by tag or digest. + + This is a lightweight operation that returns only headers (no body). It is useful for: + - Checking for the existence of a specific image version + - Determining the digest or size of a manifest before downloading or deleting + + This endpoint requires authentication with pull scope. + + parameters: + - name: name + in: path + required: true + description: Name of the Repository + example: library/ubuntu + schema: + type: string + - name: reference + in: path + required: true + description: Tag or digest to check + examples: + by-tag: + summary: Tag + value: latest + by-digest: + summary: Digest + value: sha256:abc123def456... + schema: + type: string + - name: Authorization + in: header + required: true + schema: + type: string + description: Bearer token for authentication + - name: Accept + in: header + required: false + schema: + type: string + example: application/vnd.docker.distribution.manifest.v2+json + description: | + Media type of the manifest to check. The response will match one of the accepted types. + x-codeSamples: + - lang: Bash + label: cURL + source: | + # HEAD /v2/{name}/manifests/{reference} + curl -I \ + -H "Authorization: Bearer $TOKEN" \ + -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \ + https://registry-1.docker.io/v2/library/ubuntu/manifests/latest + responses: + "200": + description: Manifest exists. + headers: + Content-Length: + description: Size of the manifest in bytes + schema: + type: integer + example: 7082 + Docker-Content-Digest: + description: Digest of the manifest + schema: + type: string + example: sha256:abc123... + Content-Type: + description: Media type of the manifest + schema: + type: string + example: application/vnd.docker.distribution.manifest.v2+json + "404": + description: Manifest not found. + "401": + description: Authentication required. + "403": + description: Access denied. + "429": + description: Too many requests. + delete: + tags: + - Manifests + summary: Delete image manifest + operationId: DeleteImageManifest + description: | + Delete an image manifest from a repository by digest. + + Only untagged or unreferenced manifests can be deleted. If the manifest is still referenced by a tag or another image, the registry will return `403 Forbidden`. + + This operation requires `delete` access to the repository. + parameters: + - name: name + in: path + required: true + description: Name of the repository + example: yourusername/helloworld + schema: + type: string + - name: reference + in: path + required: true + description: Digest of the manifest to delete (e.g., `sha256:...`) + example: sha256:abc123def456... + schema: + type: string + - name: Authorization + in: header + required: true + description: Bearer token with `delete` access + schema: + type: string + x-codeSamples: + - lang: Bash + label: cURL + source: | + # DELETE a manifest by digest + curl -X DELETE \ + -H "Authorization: Bearer $TOKEN" \ + https://registry-1.docker.io/v2/yourusername/helloworld/manifests/sha256:abc123def456... + responses: + "202": + description: Manifest deleted successfully. No content returned. + "401": + description: Authentication required. + "403": + description: Access denied. The manifest may still be referenced. + "404": + description: Manifest or repository not found. + "405": + description: Only digest-based deletion is allowed. + "429": + description: Too many requests. + /v2/{name}/blobs/uploads/: + post: + tags: + - Blobs + summary: Initiate blob upload or attempt cross-repository blob mount + operationId: InitiateBlobUpload + description: | + Initiate an upload session for a blob (layer or config) in a repository. + + This is the first step in uploading a blob. It returns a `Location` URL where the blob can be uploaded using `PATCH` (chunked) or `PUT` (monolithic). + + Instead of uploading a blob, a client may attempt to mount a blob from another repository (if it has read access) by including the `mount` and `from` query parameters. + + If successful, the registry responds with `201 Created` and the blob is reused without re-upload. + + If the mount fails, the upload proceeds as usual and returns a `202 Accepted`. + + You must authenticate with `push` access to the target repository. + x-codeSamples: + - lang: Bash + label: cURL (Initiate Standard Upload) + source: | + # Initiate a standard blob upload session + curl -i -X POST \ + -H "Authorization: Bearer $TOKEN" \ + https://registry-1.docker.io/v2/library/ubuntu/blobs/uploads/ + + - lang: Bash + label: cURL (Cross-Repository Blob Mount) + source: | + # Attempt a cross-repository blob mount + curl -i -X POST \ + -H "Authorization: Bearer $TOKEN" \ + "https://registry-1.docker.io/v2/library/ubuntu/blobs/uploads/?mount=sha256:abc123def456...&from=library/busybox" + + parameters: + - name: name + in: path + required: true + description: Name of the target repository + example: library/ubuntu + schema: + type: string + - name: mount + in: query + required: false + description: Digest of the blob to mount from another repository + schema: + type: string + example: sha256:abc123def456... + - name: from + in: query + required: false + description: Source repository to mount the blob from + schema: + type: string + example: library/busybox + - name: Authorization + in: header + required: true + schema: + type: string + description: Bearer token for authentication with `push` scope + + responses: + "201": + description: Blob successfully mounted from another repository. + headers: + Location: + description: URL where the mounted blob is accessible + schema: + type: string + example: /v2/library/ubuntu/blobs/sha256:abc123... + Docker-Content-Digest: + description: Canonical digest of the mounted blob + schema: + type: string + example: sha256:abc123... + Content-Length: + description: Always zero + schema: + type: integer + example: 0 + "202": + description: Upload initiated successfully (fallback if mount fails). + headers: + Location: + description: Upload location URL for `PATCH` or `PUT` requests + schema: + type: string + example: /v2/library/ubuntu/blobs/uploads/abc123 + Docker-Upload-UUID: + description: Server-generated UUID for the upload session + schema: + type: string + example: abc123 + Range: + description: Current upload byte range (typically `0-0` at init) + schema: + type: string + example: 0-0 + Content-Length: + description: Always zero + schema: + type: integer + example: 0 + "401": + description: Authentication required. + "403": + description: Access denied. + "404": + description: Repository not found. + "429": + description: Too many requests. + /v2/{name}/blobs/{digest}: + head: + tags: + - Blobs + summary: Check existence of blob + operationId: CheckBlobExists + description: | + Check whether a blob (layer or config) exists in the registry. + + This is useful before uploading a blob to avoid duplicates. + + If the blob is present, the registry returns a `200 OK` response with headers like `Content-Length` and `Docker-Content-Digest`. + + If the blob does not exist, the response will be `404 Not Found`. + x-codeSamples: + - lang: Bash + label: cURL + source: | + # HEAD to check if a blob exists + curl -I \ + -H "Authorization: Bearer $TOKEN" \ + https://registry-1.docker.io/v2/library/ubuntu/blobs/sha256:abc123... + parameters: + - name: name + in: path + required: true + description: Name of the Repository + example: library/ubuntu + schema: + type: string + - name: digest + in: path + required: true + description: Digest of the blob + schema: + type: string + example: sha256:abc123def4567890... + - name: Authorization + in: header + required: true + description: Bearer token with pull or push scope + schema: + type: string + example: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6... + + responses: + "200": + description: Blob exists + headers: + Content-Length: + description: Size of the blob in bytes + schema: + type: integer + example: 32654 + Docker-Content-Digest: + description: Digest of the blob + schema: + type: string + example: sha256:abc123def4567890... + Content-Type: + description: MIME type of the blob content + schema: + type: string + example: application/octet-stream + content: + application/json: + examples: + blob-check-request: + summary: Sample request + value: + method: HEAD + url: /v2/library/ubuntu/blobs/sha256:abc123def4567890... + headers: + Authorization: Bearer + Accept: '*/*' + blob-check-response: + summary: Sample 200 response headers + value: + status: 200 OK + headers: + Docker-Content-Digest: sha256:abc123def4567890... + Content-Length: 32654 + Content-Type: application/octet-stream + + "404": + description: Blob not found + "401": + description: Authentication required + "403": + description: Access denied + "429": + description: Too many requests + get: + tags: + - Blobs + summary: Retrieve blob + operationId: GetBlob + description: | + Download the blob identified by digest from the registry. + + Blobs include image layers and configuration objects. Clients must use the digest from the manifest to retrieve a blob. + + This endpoint may return a `307 Temporary Redirect` to a CDN or storage location. Clients must follow the redirect to obtain the actual blob content. + + The blob content is typically a gzipped tarball (for layers) or JSON (for configs). The MIME type is usually `application/octet-stream`. + x-codeSamples: + - lang: Bash + label: cURL + source: | + # GET (download) a blob + curl -L \ + -H "Authorization: Bearer $TOKEN" \ + https://registry-1.docker.io/v2/library/ubuntu/blobs/sha256:abc123... \ + -o layer.tar.gz + parameters: + - name: name + in: path + required: true + description: Repository Name + example: library/ubuntu + schema: + type: string + - name: digest + in: path + required: true + description: Digest of the Blob + schema: + type: string + example: sha256:abc123def456... + - name: Authorization + in: header + required: true + schema: + type: string + description: Bearer token with pull scope + example: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6... + + responses: + "200": + description: Blob content returned directly + headers: + Content-Length: + description: Size of the blob in bytes + schema: + type: integer + example: 32768 + Content-Type: + description: MIME type of the blob + schema: + type: string + example: application/octet-stream + Docker-Content-Digest: + description: Digest of the returned blob + schema: + type: string + example: sha256:abc123def456... + content: + application/octet-stream: + schema: + type: string + format: binary + examples: + small-layer: + summary: Example binary blob (gzipped tar layer) + value: "" + + "307": + description: Temporary redirect to blob location + headers: + Location: + description: Redirect URL for blob download (e.g., S3 or CDN) + schema: + type: string + example: https://cdn.docker.io/blobs/library/ubuntu/abc123... + "401": + description: Authentication required + "403": + description: Access denied + "404": + description: Blob not found + "429": + description: Too many requests + /v2/{name}/blobs/uploads/{uuid}: + get: + tags: + - Blobs + summary: Get blob upload status + operationId: GetBlobUploadStatus + description: | + Retrieve the current status of an in-progress blob upload. + + This is useful for: + - Resuming an interrupted upload + - Determining how many bytes have been accepted so far + - Retrying from the correct offset in chunked uploads + + The response includes the `Range` header indicating the byte range received so far, and a `Docker-Upload-UUID` for identifying the session. + x-codeSamples: + - lang: Bash + label: cURL + source: | + # GET upload status + curl -I \ + -H "Authorization: Bearer $TOKEN" \ + https://registry-1.docker.io/v2/library/ubuntu/blobs/uploads/abc123 + parameters: + - name: name + in: path + required: true + description: Repository Name + example : library/ubuntu + schema: + type: string + - name: uuid + in: path + required: true + description: Upload session UUID + schema: + type: string + example: abc123 + - name: Authorization + in: header + required: true + schema: + type: string + example: Bearer eyJhbGciOi... + + responses: + "204": + description: Upload in progress. No body is returned. + headers: + Range: + description: Current byte range uploaded (inclusive) + schema: + type: string + example: 0-16383 + Docker-Upload-UUID: + description: UUID of the upload session + schema: + type: string + example: abc123 + Location: + description: URL to continue or complete the upload + schema: + type: string + example: /v2/library/ubuntu/blobs/uploads/abc123 + "401": + description: Authentication required + "403": + description: Access denied + "404": + description: Upload session not found + "429": + description: Too many requests + + put: + tags: + - Blobs + summary: Complete blob upload + operationId: CompleteBlobUpload + description: | + Complete the upload of a blob by finalizing an upload session. + + This request must include the `digest` query parameter and optionally the last chunk of data. When the registry receives this request, it verifies the digest and stores the blob. + + This endpoint supports: + - Monolithic uploads (upload entire blob in this request) + - Finalizing chunked uploads (last chunk plus `digest`) + + x-codeSamples: + - lang: Bash + label: cURL + source: | + # PUT – complete upload (monolithic or final chunk) + curl -X PUT \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/octet-stream" \ + --data-binary @layer.tar.gz \ + "https://registry-1.docker.io/v2/library/ubuntu/blobs/uploads/abc123?digest=sha256:abcd1234..." + + + parameters: + - name: name + in: path + required: true + description: Repository name + schema: + type: string + example: library/ubuntu + - name: uuid + in: path + required: true + description: Upload session UUID returned from the POST request + schema: + type: string + example: abc123 + - name: digest + in: query + required: true + description: Digest of the uploaded blob + schema: + type: string + example: sha256:abcd1234... + - name: Authorization + in: header + required: true + schema: + type: string + example: Bearer eyJhbGciOi... + + requestBody: + required: false + content: + application/octet-stream: + schema: + type: string + format: binary + examples: + layer-upload: + summary: Layer tarball blob + value: "" + + responses: + "201": + description: Upload completed successfully + headers: + Docker-Content-Digest: + description: Canonical digest of the stored blob + schema: + type: string + example: sha256:abcd1234... + Location: + description: URL where the blob is now accessible + schema: + type: string + example: /v2/library/ubuntu/blobs/sha256:abcd1234... + Content-Length: + description: Always zero for completed uploads + schema: + type: integer + example: 0 + "400": + description: Invalid digest or missing parameters + "401": + description: Authentication required + "403": + description: Access denied + "404": + description: Upload session not found + "416": + description: Requested range not satisfiable (if used in chunked mode) + "429": + description: Too many requests + + patch: + tags: + - Blobs + summary: Upload blob chunk + operationId: UploadBlobChunk + description: | + Upload a chunk of a blob to an active upload session. + + Use this method for **chunked uploads**, especially for large blobs or when resuming interrupted uploads. + + The client sends binary data using `PATCH`, optionally including a `Content-Range` header. + + After each chunk is accepted, the registry returns a `202 Accepted` response with: + - `Range`: current byte range stored + - `Docker-Upload-UUID`: identifier for the upload session + - `Location`: URL to continue the upload or finalize with `PUT` + x-codeSamples: + - lang: Bash + label: cURL + source: | + # PATCH – upload a chunk (first 64 KiB) + curl -X PATCH \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/octet-stream" \ + --data-binary @chunk-0.bin \ + "https://registry-1.docker.io/v2/library/ubuntu/blobs/uploads/abc123" + parameters: + - name: name + in: path + required: true + description: Repository name + schema: + type: string + example: library/ubuntu + - name: uuid + in: path + required: true + description: Upload session UUID + schema: + type: string + example: abc123 + - name: Authorization + in: header + required: true + schema: + type: string + example: Bearer eyJhbGciOi... + - name: Content-Range + in: header + required: false + schema: + type: string + example: bytes 0-65535 + description: Optional. Byte range of the chunk being sent + + requestBody: + required: true + content: + application/octet-stream: + schema: + type: string + format: binary + examples: + chunk-0: + summary: Upload chunk 0 of a blob + value: "" + + responses: + "202": + description: Chunk accepted and stored + headers: + Location: + description: URL to continue or finalize the upload + schema: + type: string + example: /v2/library/ubuntu/blobs/uploads/abc123 + Range: + description: Byte range uploaded so far (inclusive) + schema: + type: string + example: 0-65535 + Docker-Upload-UUID: + description: Upload session UUID + schema: + type: string + example: abc123 + "400": + description: Malformed content or range + "401": + description: Authentication required + "403": + description: Access denied + "404": + description: Upload session not found + "416": + description: Range error (e.g., chunk out of order) + "429": + description: Too many requests + delete: + tags: + - Blobs + summary: Cancel blob upload + operationId: CancelBlobUpload + description: | + Cancel an in-progress blob upload session. + + This operation discards any data that has been uploaded and invalidates the upload session. + + Use this when: + - An upload fails or is aborted mid-process + - The client wants to clean up unused upload sessions + + After cancellation, the UUID is no longer valid and a new `POST` must be issued to restart the upload. + + x-codeSamples: + - lang: Bash + label: cURL + source: | + # DELETE – cancel an upload session + curl -X DELETE \ + -H "Authorization: Bearer $TOKEN" \ + https://registry-1.docker.io/v2/library/ubuntu/blobs/uploads/abc123` + + parameters: + - name: name + in: path + required: true + description: Name of the repository + schema: + type: string + example: library/ubuntu + - name: uuid + in: path + required: true + description: Upload session UUID + schema: + type: string + example: abc123 + - name: Authorization + in: header + required: true + schema: + type: string + example: Bearer eyJhbGciOi... + + responses: + "204": + description: Upload session cancelled successfully. No body is returned. + headers: + Content-Length: + description: Always zero + schema: + type: integer + example: 0 + "401": + description: Authentication required + "403": + description: Access denied + "404": + description: Upload session not found + "429": + description: Too many requests + + +x-tagGroups: + - name: General + tags: + - overview + - authentication + - pull + - push + - delete + - name: API + tags: + - Manifests + - Blobs From f830087f223c9cc41746bf14874810f1e8fea2db Mon Sep 17 00:00:00 2001 From: Igor Martynyuk Date: Mon, 26 May 2025 19:16:59 +0300 Subject: [PATCH 429/699] Update outdated url to ubuntu source code (#22626) ## Description I set a new URL for the source code because the old ones refer to the commit of the file, which is not used now, because Ubuntu for Docker is built from livecd scripts. ## Related issues or tickets ## Reviews - [ ] Technical review - [x] Editorial review - [ ] Product review --------- Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> Co-authored-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> Co-authored-by: Tianon Gravi --- content/manuals/build/building/best-practices.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/build/building/best-practices.md b/content/manuals/build/building/best-practices.md index c351630ac372..3ceab08aa648 100644 --- a/content/manuals/build/building/best-practices.md +++ b/content/manuals/build/building/best-practices.md @@ -442,7 +442,7 @@ reduces the image size, since the apt cache isn't stored in a layer. Since the `RUN` statement starts with `apt-get update`, the package cache is always refreshed prior to `apt-get install`. -Official Debian and Ubuntu images [automatically run `apt-get clean`](https://github.com/moby/moby/blob/03e2923e42446dbb830c654d0eec323a0b4ef02a/contrib/mkimage/debootstrap#L82-L105), so explicit invocation is not required. +Official Debian and Ubuntu images [automatically run `apt-get clean`](https://github.com/debuerreotype/debuerreotype/blob/c9542ab785e72696eb2908a6dbc9220abbabef39/scripts/debuerreotype-minimizing-config#L87-L109), so explicit invocation is not required. #### Using pipes From d84f2245e373c0aecd6f243e92fa0dfa7f25e8d7 Mon Sep 17 00:00:00 2001 From: bri <284789+b-@users.noreply.github.com> Date: Tue, 27 May 2025 03:06:40 -0400 Subject: [PATCH 430/699] Merge pull request #22662 from b-/patch-1 Remove quotes from octal value in reference/compose-file/services.md --- content/reference/compose-file/services.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/reference/compose-file/services.md b/content/reference/compose-file/services.md index f663085c0a7a..dfa1267e948d 100644 --- a/content/reference/compose-file/services.md +++ b/content/reference/compose-file/services.md @@ -1889,7 +1889,7 @@ services: target: server.cert uid: "103" gid: "103" - mode: "0o440" + mode: 0o440 secrets: server-certificate: file: ./server.cert From b3280b168c8220e7d4ff40a825fae994e54b9416 Mon Sep 17 00:00:00 2001 From: nkmryu <59592962+nkmrrrr@users.noreply.github.com> Date: Tue, 27 May 2025 16:12:33 +0900 Subject: [PATCH 431/699] Doc: correct typo in DockerDesktopClient entrypoint reference (#22701) ## Description Fix typo `DockerDesktopCLient` -> `DockerDesktopClient` ## Related issues or tickets ## Reviews - [ ] Technical review - [ ] Editorial review - [ ] Product review --- content/manuals/extensions/extensions-sdk/dev/api/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/manuals/extensions/extensions-sdk/dev/api/overview.md b/content/manuals/extensions/extensions-sdk/dev/api/overview.md index 730a78619296..fe129ddb4ab0 100644 --- a/content/manuals/extensions/extensions-sdk/dev/api/overview.md +++ b/content/manuals/extensions/extensions-sdk/dev/api/overview.md @@ -14,7 +14,7 @@ and communicate with the Docker Desktop dashboard or the underlying system. JavaScript API libraries, with Typescript support, are available in order to get all the API definitions in to your extension code. -- [@docker/extension-api-client](https://www.npmjs.com/package/@docker/extension-api-client) gives access to the extension API entrypoint `DockerDesktopCLient`. +- [@docker/extension-api-client](https://www.npmjs.com/package/@docker/extension-api-client) gives access to the extension API entrypoint `DockerDesktopClient`. - [@docker/extension-api-client-types](https://www.npmjs.com/package/@docker/extension-api-client-types) can be added as a dev dependency in order to get types auto-completion in your IDE. ```Typescript From f23f120cd61606fe777db1280b21ef213661e6eb Mon Sep 17 00:00:00 2001 From: Kristiyan Velkov <40764277+kristiyan-velkov@users.noreply.github.com> Date: Wed, 28 May 2025 00:46:31 +0300 Subject: [PATCH 432/699] docs: added a guide for Dockerized Angular 19 application (#22535) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR introduces a comprehensive, language-specific guide for containerizing Angular applications using Docker, aimed at helping developers streamline development, testing, and deployment workflows. It includes practical steps and examples to set up CI/CD pipelines using GitHub Actions, aligning with modern DevOps best practices. **What’s Included** - Step-by-step instructions to containerize Angular apps using Docker - Configuration for a local development environment inside containers - Guidance on running unit tests (Karma/Jasmine) inside Docker containers - Full CI/CD pipeline setup using GitHub Actions for automated builds and deployments - Deployment instructions for a local Kubernetes cluster to validate production readiness **Credits** [Kristiyan Velkov](https://www.linkedin.com/in/kristiyan-velkov-763130b3/), Docker Captain and experienced Front-end Engineer --- content/guides/angular/_index.md | 50 ++ .../angular/configure-github-actions.md | 323 +++++++++++ content/guides/angular/containerize.md | 503 ++++++++++++++++++ content/guides/angular/deploy.md | 201 +++++++ content/guides/angular/develop.md | 179 +++++++ content/guides/angular/run-tests.md | 138 +++++ ...e-ci-cd.md => configure-github-actions.md} | 4 +- content/guides/reactjs/containerize.md | 9 +- content/guides/reactjs/deploy.md | 4 +- content/guides/reactjs/develop.md | 4 +- 10 files changed, 1404 insertions(+), 11 deletions(-) create mode 100644 content/guides/angular/_index.md create mode 100644 content/guides/angular/configure-github-actions.md create mode 100644 content/guides/angular/containerize.md create mode 100644 content/guides/angular/deploy.md create mode 100644 content/guides/angular/develop.md create mode 100644 content/guides/angular/run-tests.md rename content/guides/reactjs/{configure-ci-cd.md => configure-github-actions.md} (99%) diff --git a/content/guides/angular/_index.md b/content/guides/angular/_index.md new file mode 100644 index 000000000000..6f28a0f99cf9 --- /dev/null +++ b/content/guides/angular/_index.md @@ -0,0 +1,50 @@ +--- +title: Angular language-specific guide +linkTitle: Angular +description: Containerize and develop Angular apps using Docker +keywords: getting started, angular, docker, language, Dockerfile +summary: | + This guide explains how to containerize Angular applications using Docker. +toc_min: 1 +toc_max: 2 +languages: [js] +params: + time: 20 minutes + +--- + +The Angular language-specific guide shows you how to containerize an Angular application using Docker, following best practices for creating efficient, production-ready containers. + +[Angular](https://angular.dev/) is a robust and widely adopted framework for building dynamic, enterprise-grade web applications. However, managing dependencies, environments, and deployments can become complex as applications scale. Docker streamlines these challenges by offering a consistent, isolated environment for development and production. + +> +> **Acknowledgment** +> +> Docker extends its sincere gratitude to [Kristiyan Velkov](https://www.linkedin.com/in/kristiyan-velkov-763130b3/) for authoring this guide. As a Docker Captain and experienced Front-end engineer, his expertise in Docker, DevOps, and modern web development has made this resource essential for the community, helping developers navigate and optimize their Docker workflows. + +--- + +## What will you learn? + +In this guide, you will learn how to: + +- Containerize and run an Angular application using Docker. +- Set up a local development environment for Angular inside a container. +- Run tests for your Angular application within a Docker container. +- Configure a CI/CD pipeline using GitHub Actions for your containerized app. +- Deploy the containerized Angular application to a local Kubernetes cluster for testing and debugging. + +You'll start by containerizing an existing Angular application and work your way up to production-level deployments. + +--- + +## Prerequisites + +Before you begin, ensure you have a working knowledge of: + +- Basic understanding of [TypeScript](https://www.typescriptlang.org/) and [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript). +- Familiarity with [Node.js](https://nodejs.org/en) and [npm](https://docs.npmjs.com/about-npm) for managing dependencies and running scripts. +- Familiarity with [Angular](https://angular.io/) fundamentals. +- Understanding of core Docker concepts such as images, containers, and Dockerfiles. If you're new to Docker, start with the [Docker basics](/get-started/docker-concepts/the-basics/what-is-a-container.md) guide. + +Once you've completed the Angular getting started modules, you’ll be fully prepared to containerize your own Angular application using the detailed examples and best practices outlined in this guide. \ No newline at end of file diff --git a/content/guides/angular/configure-github-actions.md b/content/guides/angular/configure-github-actions.md new file mode 100644 index 000000000000..d7d7576e022e --- /dev/null +++ b/content/guides/angular/configure-github-actions.md @@ -0,0 +1,323 @@ +--- +title: Automate your builds with GitHub Actions +linkTitle: Automate your builds with GitHub Actions +weight: 60 +keywords: CI/CD, GitHub( Actions), Angular +description: Learn how to configure CI/CD using GitHub Actions for your Angular application. + +--- + +## Prerequisites + +Complete all the previous sections of this guide, starting with [Containerize an Angular application](containerize.md). + +You must also have: +- A [GitHub](https://github.com/signup) account. +- A [Docker Hub](https://hub.docker.com/signup) account. + +--- + +## Overview + +In this section, you'll set up a CI/CD pipeline using [GitHub Actions](https://docs.github.com/en/actions) to automatically: + +- Build your Angular application inside a Docker container. +- Run tests in a consistent environment. +- Push the production-ready image to [Docker Hub](https://hub.docker.com). + +--- + +## Connect your GitHub repository to Docker Hub + +To enable GitHub Actions to build and push Docker images, you’ll securely store your Docker Hub credentials in your new GitHub repository. + +### Step 1: Generate Docker Hub Credentials and Set GitHub Secrets" + +1. Create a Personal Access Token (PAT) from [Docker Hub](https://hub.docker.com) + 1. Go to your **Docker Hub account → Account Settings → Security**. + 2. Generate a new Access Token with **Read/Write** permissions. + 3. Name it something like `docker-angular-sample`. + 4. Copy and save the token — you’ll need it in Step 4. + +2. Create a repository in [Docker Hub](https://hub.docker.com/repositories/) + 1. Go to your **Docker Hub account → Create a repository**. + 2. For the Repository Name, use something descriptive — for example: `angular-sample`. + 3. Once created, copy and save the repository name — you’ll need it in Step 4. + +3. Create a new [GitHub repository](https://github.com/new) for your Angular project + +4. Add Docker Hub credentials as GitHub repository secrets + + In your newly created GitHub repository: + + 1. Navigate to: + **Settings → Secrets and variables → Actions → New repository secret**. + + 2. Add the following secrets: + + | Name | Value | + |-------------------|--------------------------------| + | `DOCKER_USERNAME` | Your Docker Hub username | + | `DOCKERHUB_TOKEN` | Your Docker Hub access token (created in Step 1) | + | `DOCKERHUB_PROJECT_NAME` | Your Docker Project Name (created in Step 2) | + + These secrets allow GitHub Actions to authenticate securely with Docker Hub during automated workflows. + +5. Connect Your Local Project to GitHub + + Link your local project `docker-angular-sample` to the GitHub repository you just created by running the following command from your project root: + + ```console + $ git remote set-url origin https://github.com/{your-username}/{your-repository-name}.git + ``` + + >[!IMPORTANT] + >Replace `{your-username}` and `{your-repository}` with your actual GitHub username and repository name. + + To confirm that your local project is correctly connected to the remote GitHub repository, run: + + ```console + $ git remote -v + ``` + + You should see output similar to: + + ```console + origin https://github.com/{your-username}/{your-repository-name}.git (fetch) + origin https://github.com/{your-username}/{your-repository-name}.git (push) + ``` + + This confirms that your local repository is properly linked and ready to push your source code to GitHub. + +6. Push your source code to GitHub + + Follow these steps to commit and push your local project to your GitHub repository: + + 1. Stage all files for commit. + + ```console + $ git add -A + ``` + This command stages all changes — including new, modified, and deleted files — preparing them for commit. + + + 2. Commit the staged changes with a descriptive message. + + ```console + $ git commit -m "Initial commit" + ``` + This command creates a commit that snapshots the staged changes with a descriptive message. + + 3. Push the code to the `main` branch. + + ```console + $ git push -u origin main + ``` + This command pushes your local commits to the `main` branch of the remote GitHub repository and sets the upstream branch. + +Once completed, your code will be available on GitHub, and any GitHub Actions workflow you’ve configured will run automatically. + +> [!NOTE] +> Learn more about the Git commands used in this step: +> - [Git add](https://git-scm.com/docs/git-add) – Stage changes (new, modified, deleted) for commit +> - [Git commit](https://git-scm.com/docs/git-commit) – Save a snapshot of your staged changes +> - [Git push](https://git-scm.com/docs/git-push) – Upload local commits to your GitHub repository +> - [Git remote](https://git-scm.com/docs/git-remote) – View and manage remote repository URLs + +--- + +### Step 2: Set up the workflow + +Now you'll create a GitHub Actions workflow that builds your Docker image, runs tests, and pushes the image to Docker Hub. + +1. Go to your repository on GitHub and select the **Actions** tab in the top menu. + +2. Select **Set up a workflow yourself** when prompted. + + This opens an inline editor to create a new workflow file. By default, it will be saved to: + `.github/workflows/main.yml` + + +3. Add the following workflow configuration to the new file: + +```yaml +name: CI/CD – Angular Application with Docker + +on: + push: + branches: [main] + pull_request: + branches: [main] + types: [opened, synchronize, reopened] + +jobs: + build-test-push: + name: Build, Test, and Push Docker Image + runs-on: ubuntu-latest + + steps: + # 1. Checkout source code + - name: Checkout source code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # 2. Set up Docker Buildx + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + # 3. Cache Docker layers + - name: Cache Docker layers + uses: actions/cache@v4 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- + + # 4. Cache npm dependencies + - name: Cache npm dependencies + uses: actions/cache@v4 + with: + path: ~/.npm + key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-npm- + + # 5. Extract metadata + - name: Extract metadata + id: meta + run: | + echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> "$GITHUB_OUTPUT" + echo "SHORT_SHA=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT" + + # 6. Build dev Docker image + - name: Build Docker image for tests + uses: docker/build-push-action@v6 + with: + context: . + file: Dockerfile.dev + tags: ${{ steps.meta.outputs.REPO_NAME }}-dev:latest + load: true + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache,mode=max + + # 7. Run Angular tests with Jasmine + - name: Run Angular Jasmine tests inside container + run: | + docker run --rm \ + --workdir /app \ + --entrypoint "" \ + ${{ steps.meta.outputs.REPO_NAME }}-dev:latest \ + sh -c "npm ci && npm run test -- --ci --runInBand" + env: + CI: true + NODE_ENV: test + timeout-minutes: 10 + + # 8. Log in to Docker Hub + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + # 9. Build and push production image + - name: Build and push production image + uses: docker/build-push-action@v6 + with: + context: . + file: Dockerfile + push: true + platforms: linux/amd64,linux/arm64 + tags: | + ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKERHUB_PROJECT_NAME }}:latest + ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKERHUB_PROJECT_NAME }}:${{ steps.meta.outputs.SHORT_SHA }} + cache-from: type=local,src=/tmp/.buildx-cache +``` + +This workflow performs the following tasks for your Angular application: +- Triggers on every `push` or `pull request` targeting the `main` branch. +- Builds a development Docker image using `Dockerfile.dev`, optimized for testing. +- Executes unit tests using Vitest inside a clean, containerized environment to ensure consistency. +- Halts the workflow immediately if any test fails — enforcing code quality. +- Caches both Docker build layers and npm dependencies for faster CI runs. +- Authenticates securely with Docker Hub using GitHub repository secrets. +- Builds a production-ready image using the `prod` stage in `Dockerfile`. +- Tags and pushes the final image to Docker Hub with both `latest` and short SHA tags for traceability. + +> [!NOTE] +> For more information about `docker/build-push-action`, refer to the [GitHub Action README](https://github.com/docker/build-push-action/blob/master/README.md). + +--- + +### Step 3: Run the workflow + +After you've added your workflow file, it's time to trigger and observe the CI/CD process in action. + +1. Commit and push your workflow file + + - Select "Commit changes…" in the GitHub editor. + + - This push will automatically trigger the GitHub Actions pipeline. + +2. Monitor the workflow execution + + - Go to the Actions tab in your GitHub repository. + - Click into the workflow run to follow each step: **build**, **test**, and (if successful) **push**. + +3. Verify the Docker image on Docker Hub + + - After a successful workflow run, visit your [Docker Hub repositories](https://hub.docker.com/repositories). + - You should see a new image under your repository with: + - Repository name: `${your-repository-name}` + - Tags include: + - `latest` – represents the most recent successful build; ideal for quick testing or deployment. + - `` – a unique identifier based on the commit hash, useful for version tracking, rollbacks, and traceability. + +> [!TIP] Protect your main branch +> To maintain code quality and prevent accidental direct pushes, enable branch protection rules: +> - Navigate to your **GitHub repo → Settings → Branches**. +> - Under Branch protection rules, click **Add rule**. +> - Specify `main` as the branch name. +> - Enable options like: +> - *Require a pull request before merging*. +> - *Require status checks to pass before merging*. +> +> This ensures that only tested and reviewed code is merged into `main` branch. +--- + +## Summary + +In this section, you set up a complete CI/CD pipeline for your containerized Angular application using GitHub Actions. + +Here's what you accomplished: + +- Created a new GitHub repository specifically for your project. +- Generated a secure Docker Hub access token and added it to GitHub as a secret. +- Defined a GitHub Actions workflow that: + - Build your application inside a Docker container. + - Run tests in a consistent, containerized environment. + - Push a production-ready image to Docker Hub if tests pass. +- Triggered and verified the workflow execution through GitHub Actions. +- Confirmed that your image was successfully published to Docker Hub. + +With this setup, your Angular application is now ready for automated testing and deployment across environments — increasing confidence, consistency, and team productivity. + +--- + +## Related resources + +Deepen your understanding of automation and best practices for containerized apps: + +- [Introduction to GitHub Actions](/guides/gha.md) – Learn how GitHub Actions automate your workflows +- [Docker Build GitHub Actions](/manuals/build/ci/github-actions/_index.md) – Set up container builds with GitHub Actions +- [Workflow syntax for GitHub Actions](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions) – Full reference for writing GitHub workflows +- [Compose file reference](/compose/compose-file/) – Full configuration reference for `compose.yaml` +- [Best practices for writing Dockerfiles](/develop/develop-images/dockerfile_best-practices/) – Optimize your image for performance and security + +--- + +## Next steps + +Next, learn how you can locally test and debug your Angular workloads on Kubernetes before deploying. This helps you ensure your application behaves as expected in a production-like environment, reducing surprises during deployment. diff --git a/content/guides/angular/containerize.md b/content/guides/angular/containerize.md new file mode 100644 index 000000000000..18603ecbaa5a --- /dev/null +++ b/content/guides/angular/containerize.md @@ -0,0 +1,503 @@ +--- +title: Containerize an Angular Application +linkTitle: Containerize +weight: 10 +keywords: angular, node, image, initialize, build +description: Learn how to containerize an Angular application with Docker by creating an optimized, production-ready image using best practices for performance, security, and scalability. + +--- + +## Prerequisites + +Before you begin, make sure the following tools are installed and available on your system: + +- You have installed the latest version of [Docker Desktop](/get-started/get-docker.md). +- You have a [git client](https://git-scm.com/downloads). The examples in this section use a command-line based git client, but you can use any client. + +> **New to Docker?** +> Start with the [Docker basics](/get-started/docker-concepts/the-basics/what-is-a-container.md) guide to get familiar with key concepts like images, containers, and Dockerfiles. + +--- + +## Overview + +This guide walks you through the complete process of containerizing an Angular application with Docker. You’ll learn how to create a production-ready Docker image using best practices that improve performance, security, scalability, and deployment efficiency. + +By the end of this guide, you will: + +- Containerize an Angular application using Docker. +- Create and optimize a Dockerfile for production builds. +- Use multi-stage builds to minimize image size. +- Serve the application efficiently with a custom NGINX configuration. +- Build secure and maintainable Docker images by following best practices. + +--- + +## Get the sample application + +Clone the sample application to use with this guide. Open a terminal, navigate to the directory where you want to work, and run the following command +to clone the git repository: + +```console +$ git clone https://github.com/kristiyan-velkov/docker-angular-sample +``` +--- + +## Generate a Dockerfile + +Docker provides an interactive CLI tool called `docker init` that helps scaffold the necessary configuration files for containerizing your application. This includes generating a `Dockerfile`, `.dockerignore`, `compose.yaml`, and `README.Docker.md`. + +To begin, navigate to the root of your project directory: + +```console +$ cd docker-angular-sample +``` + +Then run the following command: + +```console +$ docker init +``` +You’ll see output similar to: + +```text +Welcome to the Docker Init CLI! + +This utility will walk you through creating the following files with sensible defaults for your project: + - .dockerignore + - Dockerfile + - compose.yaml + - README.Docker.md + +Let's get started! +``` + +The CLI will prompt you with a few questions about your app setup. +For consistency, please use the same responses shown in the example below when prompted: +| Question | Answer | +|------------------------------------------------------------|-----------------| +| What application platform does your project use? | Node | +| What version of Node do you want to use? | 23.11.0-alpine | +| Which package manager do you want to use? | npm | +| Do you want to run "npm run build" before starting server? | yes | +| What directory is your build output to? | dist | +| What command do you want to use to start the app? | npm run start | +| What port does your server listen on? | 8080 | + +After completion, your project directory will contain the following new files: + +```text +├── docker-angular-sample/ +│ ├── Dockerfile +│ ├── .dockerignore +│ ├── compose.yaml +│ └── README.Docker.md +``` + +--- + +## Build the Docker image + +The default Dockerfile generated by `docker init` serves as a solid starting point for general Node.js applications. However, Angular is a front-end framework that compiles into static assets, so we need to tailor the Dockerfile to optimize for how Angular applications are built and served in a production environment. + +### Step 1: Improve the generated Dockerfile and configuration + +In this step, you’ll improve the Dockerfile and configuration files by following best practices: + +- Use multi-stage builds to keep the final image clean and small +- Serve the app using NGINX, a fast and secure web server +- Improve performance and security by only including what’s needed + +These updates help ensure your app is easy to deploy, fast to load, and production-ready. + +> [!NOTE] +> A `Dockerfile` is a plain text file that contains step-by-step instructions to build a Docker image. It automates packaging your application along with its dependencies and runtime environment. +> For full details, see the [Dockerfile reference](/reference/dockerfile/). + + +### Step 2: Configure the Dockerfile + +Copy and replace the contents of your existing `Dockerfile` with the configuration below: + +```dockerfile +# ========================================= +# Stage 1: Build the Angular Application +# ========================================= +# ========================================= +# Stage 1: Build the Angular Application +# ========================================= +ARG NODE_VERSION=22.14.0-alpine +ARG NGINX_VERSION=alpine3.21 + +# Use a lightweight Node.js image for building (customizable via ARG) +FROM node:${NODE_VERSION} AS builder + +# Set the working directory inside the container +WORKDIR /app + +# Copy package-related files first to leverage Docker's caching mechanism +COPY package.json package-lock.json ./ + +# Install project dependencies using npm ci (ensures a clean, reproducible install) +RUN --mount=type=cache,target=/root/.npm npm ci + +# Copy the rest of the application source code into the container +COPY . . + +# Build the Angular application +RUN npm run build + +# ========================================= +# Stage 2: Prepare Nginx to Serve Static Files +# ========================================= + +FROM nginxinc/nginx-unprivileged:${NGINX_VERSION} AS runner + +# Use a built-in non-root user for security best practices +USER nginx + +# Copy custom Nginx config +COPY nginx.conf /etc/nginx/nginx.conf + +# Copy the static build output from the build stage to Nginx's default HTML serving directory +COPY --chown=nginx:nginx --from=builder /app/dist/*/browser /usr/share/nginx/html + +# Expose port 8080 to allow HTTP traffic +# Note: The default NGINX container now listens on port 8080 instead of 80 +EXPOSE 8080 + +# Start Nginx directly with custom config +ENTRYPOINT ["nginx", "-c", "/etc/nginx/nginx.conf"] +CMD ["-g", "daemon off;"] + +``` + +> [!NOTE] +> We are using nginx-unprivileged instead of the standard NGINX image to follow security best practices. +> Running as a non-root user in the final image: +>- Reduces the attack surface +>- Aligns with Docker’s recommendations for container hardening +>- Helps comply with stricter security policies in production environments + +### Step 3: Configure the .dockerignore file + +The `.dockerignore` file tells Docker which files and folders to exclude when building the image. + +> [!NOTE] +>This helps: +>- Reduce image size +>- Speed up the build process +>- Prevent sensitive or unnecessary files (like `.env`, `.git`, or `node_modules`) from being added to the final image. +> +> To learn more, visit the [.dockerignore reference](/reference/dockerfile.md#dockerignore-file). + +Copy and replace the contents of your existing `.dockerignore` with the configuration below: + +```dockerignore +# ================================ +# Node and build output +# ================================ +node_modules +dist +out-tsc +.angular +.cache +.tmp + +# ================================ +# Testing & Coverage +# ================================ +coverage +jest +cypress +cypress/screenshots +cypress/videos +reports +playwright-report +.vite +.vitepress + +# ================================ +# Environment & log files +# ================================ +*.env* +!*.env.production +*.log +*.tsbuildinfo + +# ================================ +# IDE & OS-specific files +# ================================ +.vscode +.idea +.DS_Store +Thumbs.db +*.swp + +# ================================ +# Version control & CI files +# ================================ +.git +.gitignore + +# ================================ +# Docker & local orchestration +# ================================ +Dockerfile +Dockerfile.* +.dockerignore +docker-compose.yml +docker-compose*.yml + +# ================================ +# Miscellaneous +# ================================ +*.bak +*.old +*.tmp +``` + +### Step 4: Create the `nginx.conf` file + +To serve your Angular application efficiently inside the container, you’ll configure NGINX with a custom setup. This configuration is optimized for performance, browser caching, gzip compression, and support for client-side routing. + +Create a file named `nginx.conf` in the root of your project directory, and add the following content: + +> [!NOTE] +> To learn more about configuring NGINX, see the [official NGINX documentation](https://nginx.org/en/docs/). + + +```nginx +worker_processes auto; + +pid /tmp/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # Logging + access_log off; + error_log /dev/stderr warn; + + # Performance + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + keepalive_requests 1000; + + # Compression + gzip on; + gzip_vary on; + gzip_proxied any; + gzip_min_length 256; + gzip_comp_level 6; + gzip_types + text/plain + text/css + text/xml + text/javascript + application/javascript + application/x-javascript + application/json + application/xml + application/xml+rss + font/ttf + font/otf + image/svg+xml; + + server { + listen 8080; + server_name localhost; + + root /usr/share/nginx/html; + index index.html; + + # Angular Routing + location / { + try_files $uri $uri/ /index.html; + } + + # Static Assets Caching + location ~* \.(?:ico|css|js|gif|jpe?g|png|woff2?|eot|ttf|svg|map)$ { + expires 1y; + access_log off; + add_header Cache-Control "public, immutable"; + } + + # Optional: Explicit asset route + location /assets/ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + } +} +``` + +### Step 5: Build the Angular application image + +With your custom configuration in place, you're now ready to build the Docker image for your Angular application. + +The updated setup includes: + +- The updated setup includes a clean, production-ready NGINX configuration tailored specifically for Angular. +- Efficient multi-stage Docker build, ensuring a small and secure final image. + +After completing the previous steps, your project directory should now contain the following files: + +```text +├── docker-angular-sample/ +│ ├── Dockerfile +│ ├── .dockerignore +│ ├── compose.yaml +│ ├── nginx.conf +│ └── README.Docker.md +``` + +Now that your Dockerfile is configured, you can build the Docker image for your Angular application. + +> [!NOTE] +> The `docker build` command packages your application into an image using the instructions in the Dockerfile. It includes all necessary files from the current directory (called the [build context](/build/concepts/context/#what-is-a-build-context)). + +Run the following command from the root of your project: + +```console +$ docker build --tag docker-angular-sample . +``` + +What this command does: +- Uses the Dockerfile in the current directory (.) +- Packages the application and its dependencies into a Docker image +- Tags the image as docker-angular-sample so you can reference it later + + +#### Step 6: View local images + +After building your Docker image, you can check which images are available on your local machine using either the Docker CLI or [Docker Desktop](/manuals/desktop/use-desktop/images.md). Since you're already working in the terminal, let's use the Docker CLI. + +To list all locally available Docker images, run the following command: + +```console +$ docker images +``` + +Example Output: + +```shell +REPOSITORY TAG IMAGE ID CREATED SIZE +docker-angular-sample latest 34e66bdb9d40 14 seconds ago 76.4MB +``` + +This output provides key details about your images: + +- **Repository** – The name assigned to the image. +- **Tag** – A version label that helps identify different builds (e.g., latest). +- **Image ID** – A unique identifier for the image. +- **Created** – The timestamp indicating when the image was built. +- **Size** – The total disk space used by the image. + +If the build was successful, you should see `docker-angular-sample` image listed. + +--- + +## Run the containerized application + +In the previous step, you created a Dockerfile for your Angular application and built a Docker image using the docker build command. Now it’s time to run that image in a container and verify that your application works as expected. + + +Inside the `docker-angular-sample` directory, run the following command in a +terminal. + +```console +$ docker compose up --build +``` + +Open a browser and view the application at [http://localhost:8080](http://localhost:8080). You should see a simple Angular web application. + +Press `ctrl+c` in the terminal to stop your application. + +### Run the application in the background + +You can run the application detached from the terminal by adding the `-d` +option. Inside the `docker-angular-sample` directory, run the following command +in a terminal. + +```console +$ docker compose up --build -d +``` + +Open a browser and view the application at [http://localhost:8080](http://localhost:8080). You should see your Angular application running in the browser. + + +To confirm that the container is running, use `docker ps` command: + +```console +$ docker ps +``` + +This will list all active containers along with their ports, names, and status. Look for a container exposing port 8080. + +Example Output: + +```shell +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +eb13026806d1 docker-angular-sample-server "nginx -c /etc/nginx…" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp docker-angular-sample-server-1 +``` + + +To stop the application, run: + +```console +$ docker compose down +``` + + +> [!NOTE] +> For more information about Compose commands, see the [Compose CLI +> reference](/reference/cli/docker/compose/_index.md). + +--- + +## Summary + +In this guide, you learned how to containerize, build, and run an Angular application using Docker. By following best practices, you created a secure, optimized, and production-ready setup. + +What you accomplished: +- Initialized your project using `docker init` to scaffold essential Docker configuration files. +- Replaced the default `Dockerfile` with a multi-stage build that compiles the Angular application and serves the static files using Nginx. +- Replaced the default `.dockerignore` file to exclude unnecessary files and keep the image clean and efficient. +- Built your Docker image using `docker build`. +- Ran the container using `docker compose up`, both in the foreground and in detached mode. +- Verified that the app was running by visiting [http://localhost:8080](http://localhost:8080). +- Learned how to stop the containerized application using `docker compose down`. + +You now have a fully containerized Angular application, running in a Docker container, and ready for deployment across any environment with confidence and consistency. + +--- + +## Related resources + +Explore official references and best practices to sharpen your Docker workflow: + +- [Multi-stage builds](/build/building/multi-stage/) – Learn how to separate build and runtime stages. +- [Best practices for writing Dockerfiles](/develop/develop-images/dockerfile_best-practices/) – Write efficient, maintainable, and secure Dockerfiles. +- [Build context in Docker](/build/concepts/context/) – Learn how context affects image builds. +- [`docker init` CLI reference](/reference/cli/docker/init/) – Scaffold Docker assets automatically. +- [`docker build` CLI reference](/reference/cli/docker/build/) – Build Docker images from a Dockerfile. +- [`docker images` CLI reference](/reference/cli/docker/images/) – Manage and inspect local Docker images. +- [`docker compose up` CLI reference](/reference/cli/docker/compose/up/) – Start and run multi-container applications. +- [`docker compose down` CLI reference](/reference/cli/docker/compose/down/) – Stop and remove containers, networks, and volumes. + +--- + +## Next steps + +With your Angular application now containerized, you're ready to move on to the next step. + +In the next section, you'll learn how to develop your application using Docker containers, enabling a consistent, isolated, and reproducible development environment across any machine. + diff --git a/content/guides/angular/deploy.md b/content/guides/angular/deploy.md new file mode 100644 index 000000000000..a76778166413 --- /dev/null +++ b/content/guides/angular/deploy.md @@ -0,0 +1,201 @@ +--- +title: Test your Angular deployment +linkTitle: Test your deployment +weight: 60 +keywords: deploy, kubernetes, angular +description: Learn how to deploy locally to test and debug your Kubernetes deployment + +--- + +## Prerequisites + +Before you begin, make sure you’ve completed the following: +- Complete all the previous sections of this guide, starting with [Containerize Angular application](containerize.md). +- [Enable Kubernetes](/manuals/desktop/features/kubernetes.md#install-and-turn-on-kubernetes) in Docker Desktop. + +> **New to Kubernetes?** +> Visit the [Kubernetes basics tutorial](https://kubernetes.io/docs/tutorials/kubernetes-basics/) to get familiar with how clusters, pods, deployments, and services work. + +--- + +## Overview + +This section guides you through deploying your containerized Angular application locally using [Docker Desktop’s built-in Kubernetes](/desktop/kubernetes/). Running your app in a local Kubernetes cluster closely simulates a real production environment, enabling you to test, validate, and debug your workloads with confidence before promoting them to staging or production. + +--- + +## Create a Kubernetes YAML file + +Follow these steps to define your deployment configuration: + +1. In the root of your project, create a new file named: angular-sample-kubernetes.yaml + +2. Open the file in your IDE or preferred text editor. + +3. Add the following configuration, and be sure to replace `{DOCKER_USERNAME}` and `{DOCKERHUB_PROJECT_NAME}` with your actual Docker Hub username and repository name from the previous [Automate your builds with GitHub Actions](configure-github-actions.md). + + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: angular-sample + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app: angular-sample + template: + metadata: + labels: + app: angular-sample + spec: + containers: + - name: angular-container + image: {DOCKER_USERNAME}/{DOCKERHUB_PROJECT_NAME}:latest + imagePullPolicy: Always + ports: + - containerPort: 8080 + resources: + limits: + cpu: "500m" + memory: "256Mi" + requests: + cpu: "250m" + memory: "128Mi" +--- +apiVersion: v1 +kind: Service +metadata: + name: angular-sample-service + namespace: default +spec: + type: NodePort + selector: + app: angular-sample + ports: + - port: 8080 + targetPort: 8080 + nodePort: 30001 +``` + +This manifest defines two key Kubernetes resources, separated by `---`: + +- Deployment + Deploys a single replica of your Angular application inside a pod. The pod uses the Docker image built and pushed by your GitHub Actions CI/CD workflow + (refer to [Automate your builds with GitHub Actions](configure-github-actions.md)). + The container listens on port `8080`, which is typically used by [Nginx](https://nginx.org/en/docs/) to serve your production Angular app. + +- Service (NodePort) + Exposes the deployed pod to your local machine. + It forwards traffic from port `30001` on your host to port `8080` inside the container. + This lets you access the application in your browser at [http://localhost:30001](http://localhost:30001). + +> [!NOTE] +> To learn more about Kubernetes objects, see the [Kubernetes documentation](https://kubernetes.io/docs/home/). + +--- + +## Deploy and check your application + +Follow these steps to deploy your containerized Angular app into a local Kubernetes cluster and verify that it’s running correctly. + +### Step 1. Apply the Kubernetes configuration + +In your terminal, navigate to the directory where your `angular-sample-kubernetes.yaml` file is located, then deploy the resources using: + +```console + $ kubectl apply -f angular-sample-kubernetes.yaml +``` + +If everything is configured properly, you’ll see confirmation that both the Deployment and the Service were created: + +```shell + deployment.apps/angular-sample created + service/angular-sample-service created +``` + +This confirms that both the Deployment and the Service were successfully created and are now running inside your local cluster. + +### Step 2. Check the Deployment status + +Run the following command to check the status of your deployment: + +```console + $ kubectl get deployments +``` + +You should see output similar to the following: + +```shell + NAME READY UP-TO-DATE AVAILABLE AGE + angular-sample 1/1 1 1 14s +``` + +This confirms that your pod is up and running with one replica available. + +### Step 3. Verify the Service exposure + +Check if the NodePort service is exposing your app to your local machine: + +```console +$ kubectl get services +``` + +You should see something like: + +```shell +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +angular-sample-service NodePort 10.100.185.105 8080:30001/TCP 1m +``` + +This output confirms that your app is available via NodePort on port 30001. + +### Step 4. Access your app in the browser + +Open your browser and navigate to [http://localhost:30001](http://localhost:30001). + +You should see your production-ready Angular Sample application running — served by your local Kubernetes cluster. + +### Step 5. Clean up Kubernetes resources + +Once you're done testing, you can delete the deployment and service using: + +```console + $ kubectl delete -f angular-sample-kubernetes.yaml +``` + +Expected output: + +```shell + deployment.apps "angular-sample" deleted + service "angular-sample-service" deleted +``` + +This ensures your cluster stays clean and ready for the next deployment. + +--- + +## Summary + +In this section, you learned how to deploy your Angular application to a local Kubernetes cluster using Docker Desktop. This setup allows you to test and debug your containerized app in a production-like environment before deploying it to the cloud. + +What you accomplished: + +- Created a Kubernetes Deployment and NodePort Service for your Angular app +- Used `kubectl apply` to deploy the application locally +- Verified the app was running and accessible at `http://localhost:30001` +- Cleaned up your Kubernetes resources after testing + +--- + +## Related resources + +Explore official references and best practices to sharpen your Kubernetes deployment workflow: + +- [Kubernetes documentation](https://kubernetes.io/docs/home/) – Learn about core concepts, workloads, services, and more. +- [Deploy on Kubernetes with Docker Desktop](/manuals/desktop/features/kubernetes.md) – Use Docker Desktop’s built-in Kubernetes support for local testing and development. +- [`kubectl` CLI reference](https://kubernetes.io/docs/reference/kubectl/) – Manage Kubernetes clusters from the command line. +- [Kubernetes Deployment resource](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) – Understand how to manage and scale applications using Deployments. +- [Kubernetes Service resource](https://kubernetes.io/docs/concepts/services-networking/service/) – Learn how to expose your application to internal and external traffic. \ No newline at end of file diff --git a/content/guides/angular/develop.md b/content/guides/angular/develop.md new file mode 100644 index 000000000000..4447859e7492 --- /dev/null +++ b/content/guides/angular/develop.md @@ -0,0 +1,179 @@ +--- +title: Use containers for Angular development +linkTitle: Develop your app +weight: 30 +keywords: angular, development, node +description: Learn how to develop your Angular application locally using containers. + +--- + +## Prerequisites + +Complete [Containerize Angular application](containerize.md). + +--- + +## Overview + +In this section, you'll learn how to set up both production and development environments for your containerized Angular application using Docker Compose. This setup allows you to serve a static production build via Nginx and to develop efficiently inside containers using a live-reloading dev server with Compose Watch. + +You’ll learn how to: +- Configure separate containers for production and development +- Enable automatic file syncing using Compose Watch in development +- Debug and live-preview your changes in real-time without manual rebuilds + +--- + +## Automatically update services (Development Mode) + +Use Compose Watch to automatically sync source file changes into your containerized development environment. This provides a seamless, efficient development experience without restarting or rebuilding containers manually. + +## Step 1: Create a development Dockerfile + +Create a file named `Dockerfile.dev` in your project root with the following content: + +```dockerfile +# ========================================= +# Stage 1: Development - Angular Application +# ========================================= + +# Define the Node.js version to use (Alpine for a small footprint) +ARG NODE_VERSION=22.14.0-alpine + +# Set the base image for development +FROM node:${NODE_VERSION} AS dev + +# Set environment variable to indicate development mode +ENV NODE_ENV=development + +# Set the working directory inside the container +WORKDIR /app + +# Copy only the dependency files first to optimize Docker caching +COPY package.json package-lock.json ./ + +# Install dependencies using npm with caching to speed up subsequent builds +RUN --mount=type=cache,target=/root/.npm npm ci + +# Copy all application source files into the container +COPY . . + +# Expose the port Angular uses for the dev server (default is 4200) +EXPOSE 4200 + +# Start the Angular dev server and bind it to all network interfaces +CMD ["npm", "start", "--", "--host=0.0.0.0"] + +``` + +This file sets up a lightweight development environment for your Angular application using the dev server. + + +### Step 2: Update your `compose.yaml` file + +Open your `compose.yaml` file and define two services: one for production (`angular-prod`) and one for development (`angular-dev`). + +Here’s an example configuration for an Angular application: + +```yaml +services: + angular-prod: + build: + context: . + dockerfile: Dockerfile + image: docker-angular-sample + ports: + - "8080:8080" + + angular-dev: + build: + context: . + dockerfile: Dockerfile.dev + ports: + - "4200:4200" + develop: + watch: + - action: sync + path: . + target: /app +``` +- The `angular-prod` service builds and serves your static production app using Nginx. +- The `angular-dev` service runs your Angular development server with live reload and hot module replacement. +- `watch` triggers file sync with Compose Watch. + +> [!NOTE] +> For more details, see the official guide: [Use Compose Watch](/manuals/compose/how-tos/file-watch.md). + +After completing the previous steps, your project directory should now contain the following files: + +```text +├── docker-angular-sample/ +│ ├── Dockerfile +│ ├── Dockerfile.dev +│ ├── .dockerignore +│ ├── compose.yaml +│ ├── nginx.conf +│ └── README.Docker.md +``` + +### Step 4: Start Compose Watch + +Run the following command from the project root to start the container in watch mode + +```console +$ docker compose watch angular-dev +``` + +### Step 5: Test Compose Watch with Angular + +To verify that Compose Watch is working correctly: + +1. Open the `src/app/app.component.html` file in your text editor. + +2. Locate the following line: + + ```html +

Docker Angular Sample Application

+ ``` + +3. Change it to: + + ```html +

Hello from Docker Compose Watch

+ ``` + +4. Save the file. + +5. Open your browser at [http://localhost:4200](http://localhost:4200). + +You should see the updated text appear instantly, without needing to rebuild the container manually. This confirms that file watching and automatic synchronization are working as expected. + +--- + +## Summary + +In this section, you set up a complete development and production workflow for your Angular application using Docker and Docker Compose. + +Here’s what you accomplished: +- Created a `Dockerfile.dev` to streamline local development with hot reloading +- Defined separate `angular-dev` and `angular-prod` services in your `compose.yaml` file +- Enabled real-time file syncing using Compose Watch for a smoother development experience +- Verified that live updates work seamlessly by modifying and previewing a component + +With this setup, you're now equipped to build, run, and iterate on your Angular app entirely within containers—efficiently and consistently across environments. + +--- + +## Related resources + +Deepen your knowledge and improve your containerized development workflow with these guides: + +- [Using Compose Watch](/manuals/compose/how-tos/file-watch.md) – Automatically sync source changes during development +- [Multi-stage builds](/manuals/build/building/multi-stage.md) – Create efficient, production-ready Docker images +- [Dockerfile best practices](/build/building/best-practices/) – Write clean, secure, and optimized Dockerfiles. +- [Compose file reference](/compose/compose-file/) – Learn the full syntax and options available for configuring services in `compose.yaml`. +- [Docker volumes](/storage/volumes/) – Persist and manage data between container runs + +## Next steps + +In the next section, you'll learn how to run unit tests for your Angular application inside Docker containers. This ensures consistent testing across all environments and removes dependencies on local machine setup. diff --git a/content/guides/angular/run-tests.md b/content/guides/angular/run-tests.md new file mode 100644 index 000000000000..1e14971bba33 --- /dev/null +++ b/content/guides/angular/run-tests.md @@ -0,0 +1,138 @@ +--- +title: Run Angular tests in a container +linkTitle: Run your tests +weight: 40 +keywords: angular, test, jasmine +description: Learn how to run your Angular tests in a container. + +--- + +## Prerequisites + +Complete all the previous sections of this guide, starting with [Containerize Angular application](containerize.md). + +## Overview + +Testing is a critical part of the development process. In this section, you'll learn how to: + +- Run Jasmine unit tests using the Angular CLI inside a Docker container. +- Use Docker Compose to isolate your test environment. +- Ensure consistency between local and container-based testing. + + +The `docker-angular-sample` project comes pre-configured with Jasmine, so you can get started quickly without extra setup. + +--- + +## Run tests during development + +The `docker-angular-sample` application includes a sample test file at the following location: + +```console +$ src/app/app.component.spec.ts +``` + +This test uses Jasmine to validate the AppComponent logic. + +### Step 1: Update compose.yaml + +Add a new service named `angular-test` to your `compose.yaml` file. This service allows you to run your test suite in an isolated, containerized environment. + +```yaml {hl_lines="22-26",linenos=true} +services: + angular-dev: + build: + context: . + dockerfile: Dockerfile.dev + ports: + - "5173:5173" + develop: + watch: + - action: sync + path: . + target: /app + + angular-prod: + build: + context: . + dockerfile: Dockerfile + image: docker-angular-sample + ports: + - "8080:8080" + + angular-test: + build: + context: . + dockerfile: Dockerfile.dev + command: ["npm", "run", "test"] + +``` + +The angular-test service reuses the same `Dockerfile.dev` used for [development](develop.md) and overrides the default command to run tests with `npm run test`. This setup ensures a consistent test environment that matches your local development configuration. + + +After completing the previous steps, your project directory should contain the following files: + +```text +├── docker-angular-sample/ +│ ├── Dockerfile +│ ├── Dockerfile.dev +│ ├── .dockerignore +│ ├── compose.yaml +│ ├── nginx.conf +│ └── README.Docker.md +``` + +### Step 2: Run the tests + +To execute your test suite inside the container, run the following command from your project root: + +```console +$ docker compose run --rm angular-test +``` + +This command will: +- Start the `angular-test` service defined in your `compose.yaml` file. +- Execute the `npm run test` script using the same environment as development. +- Automatically removes the container after tests complete, using the [`docker compose run --rm`](/engine/reference/commandline/compose_run) command. + +You should see output similar to the following: + +```shell +Test Suites: 1 passed, 1 total +Tests: 3 passed, 3 total +Snapshots: 0 total +Time: 1.529 s +``` + +> [!NOTE] +> For more information about Compose commands, see the [Compose CLI +> reference](/reference/cli/docker/compose/_index.md). + +--- + +## Summary + +In this section, you learned how to run unit tests for your Angular application inside a Docker container using Jasmine and Docker Compose. + +What you accomplished: +- Created a `angular-test` service in `compose.yaml` to isolate test execution. +- Reused the development `Dockerfile.dev` to ensure consistency between dev and test environments. +- Ran tests inside the container using `docker compose run --rm angular-test`. +- Ensured reliable, repeatable testing across environments without depending on your local machine setup. + +--- + +## Related resources + +Explore official references and best practices to sharpen your Docker testing workflow: + +- [Dockerfile reference](/reference/dockerfile/) – Understand all Dockerfile instructions and syntax. +- [Best practices for writing Dockerfiles](/develop/develop-images/dockerfile_best-practices/) – Write efficient, maintainable, and secure Dockerfiles. +- [Compose file reference](/compose/compose-file/) – Learn the full syntax and options available for configuring services in `compose.yaml`. +- [`docker compose run` CLI reference](/reference/cli/docker/compose/run/) – Run one-off commands in a service container. +--- + +## Next steps + +Next, you’ll learn how to set up a CI/CD pipeline using GitHub Actions to automatically build and test your Angular application in a containerized environment. This ensures your code is validated on every push or pull request, maintaining consistency and reliability across your development workflow. diff --git a/content/guides/reactjs/configure-ci-cd.md b/content/guides/reactjs/configure-github-actions.md similarity index 99% rename from content/guides/reactjs/configure-ci-cd.md rename to content/guides/reactjs/configure-github-actions.md index bced3a22e841..d83ae8dc8f19 100644 --- a/content/guides/reactjs/configure-ci-cd.md +++ b/content/guides/reactjs/configure-github-actions.md @@ -1,6 +1,6 @@ --- -title: Configure CI/CD for your React.js application -linkTitle: Configure CI/CD +title: Automate your builds with GitHub Actions +linkTitle: Automate your builds with GitHub Actions weight: 60 keywords: CI/CD, GitHub( Actions), React.js, Next.js description: Learn how to configure CI/CD using GitHub Actions for your React.js application. diff --git a/content/guides/reactjs/containerize.md b/content/guides/reactjs/containerize.md index f1d4f6673d50..35330dcad9b8 100644 --- a/content/guides/reactjs/containerize.md +++ b/content/guides/reactjs/containerize.md @@ -7,7 +7,6 @@ description: Learn how to containerize a React.js application with Docker by cre --- - ## Prerequisites Before you begin, make sure the following tools are installed and available on your system: @@ -135,13 +134,13 @@ FROM node:${NODE_VERSION} AS builder WORKDIR /app # Copy package-related files first to leverage Docker's caching mechanism -COPY --link package.json package-lock.json ./ +COPY package.json package-lock.json ./ # Install project dependencies using npm ci (ensures a clean, reproducible install) RUN --mount=type=cache,target=/root/.npm npm ci # Copy the rest of the application source code into the container -COPY --link . . +COPY . . # Build the React.js application (outputs to /app/dist) RUN npm run build @@ -156,10 +155,10 @@ FROM nginxinc/nginx-unprivileged:${NGINX_VERSION} AS runner USER nginx # Copy custom Nginx config -COPY --link nginx.conf /etc/nginx/nginx.conf +COPY nginx.conf /etc/nginx/nginx.conf # Copy the static build output from the build stage to Nginx's default HTML serving directory -COPY --link --from=builder /app/dist /usr/share/nginx/html +COPY --chown=nginx:nginx --from=builder /app/dist /usr/share/nginx/html # Expose port 8080 to allow HTTP traffic # Note: The default NGINX container now listens on port 8080 instead of 80 diff --git a/content/guides/reactjs/deploy.md b/content/guides/reactjs/deploy.md index c02301b8d015..86d25d3dbf47 100644 --- a/content/guides/reactjs/deploy.md +++ b/content/guides/reactjs/deploy.md @@ -32,7 +32,7 @@ Follow these steps to define your deployment configuration: 2. Open the file in your IDE or preferred text editor. -3. Add the following configuration, and be sure to replace `{DOCKER_USERNAME}` and `{DOCKERHUB_PROJECT_NAME}` with your actual Docker Hub username and repository name from the previous [Configure CI/CD for your React.js application](configure-ci-cd.md). +3. Add the following configuration, and be sure to replace `{DOCKER_USERNAME}` and `{DOCKERHUB_PROJECT_NAME}` with your actual Docker Hub username and repository name from the previous [Automate your builds with GitHub Actions](configure-github-actions.md). ```yaml @@ -77,7 +77,7 @@ This manifest defines two key Kubernetes resources, separated by `---`: - Deployment Deploys a single replica of your React.js application inside a pod. The pod uses the Docker image built and pushed by your GitHub Actions CI/CD workflow - (refer to [Configure CI/CD for your React.js application](configure-ci-cd.md)). + (refer to [Automate your builds with GitHub Actions](configure-github-actions.md)). The container listens on port `8080`, which is typically used by [Nginx](https://nginx.org/en/docs/) to serve your production React app. - Service (NodePort) diff --git a/content/guides/reactjs/develop.md b/content/guides/reactjs/develop.md index caf711938e5e..ea326cec1b7b 100644 --- a/content/guides/reactjs/develop.md +++ b/content/guides/reactjs/develop.md @@ -45,13 +45,13 @@ FROM node:${NODE_VERSION} AS dev WORKDIR /app # Copy package-related files first to leverage Docker's caching mechanism -COPY --link package.json package-lock.json ./ +COPY package.json package-lock.json ./ # Install project dependencies RUN --mount=type=cache,target=/root/.npm npm install # Copy the rest of the application source code into the container -COPY --link . . +COPY . . # Expose the port used by the Vite development server EXPOSE 5173 From 038e6dc6824586c9c9081274f7716ec0e119d6a2 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 28 May 2025 09:37:10 +0200 Subject: [PATCH 433/699] chore: update Tailwind to v4 (#22666) - Extract classes to utilities and components. - Reduce number of colors used. - Harmonize button colors. - Restyle admonitions. - Move **Page options** button to main article. - Various color tweaks. --- .github/labeler.yml | 1 - assets/css/code.css | 81 - assets/css/components.css | 100 + assets/css/global.css | 149 +- assets/css/icons.css | 29 - assets/css/lists.css | 12 - assets/css/style.css | 45 + assets/css/styles.css | 16 - assets/css/syntax-dark.css | 681 +++-- assets/css/syntax-light.css | 681 +++-- assets/css/theme.css | 203 ++ assets/css/toc.css | 14 - assets/css/typography.css | 77 - assets/css/utilities.css | 242 ++ assets/icons/AppleMac.svg | 8 + {static/assets => assets}/icons/Compose.svg | 0 assets/icons/Linux.svg | 8 + {static/assets => assets}/icons/Scout.svg | 0 .../icons/Testcontainers.svg | 0 {static/assets => assets}/icons/Whale.svg | 0 assets/icons/Windows.svg | 8 + {static/assets => assets}/icons/go.svg | 0 {static/assets => assets}/icons/java.svg | 0 .../icons}/logo-build-cloud.svg | 0 assets/icons/toolbox.svg | 7 + assets/theme/icons/edit.svg | 8 + assets/theme/icons/issue.svg | 8 + content/get-started/get-docker.md | 12 +- .../introduction/get-docker-desktop.md | 12 +- content/manuals/_index.md | 10 +- .../ai/mcp-catalog-and-toolkit/toolkit.md | 2 +- content/manuals/ai/model-runner.md | 11 + content/manuals/testcontainers.md | 4 +- hugo.yaml | 9 +- hugo_stats.json | 262 +- .../_default/_markup/render-blockquote.html | 55 +- .../_default/_markup/render-codeblock.html | 83 +- layouts/_default/_markup/render-image.html | 19 +- layouts/_default/_markup/render-table.html | 11 +- layouts/_default/baseof.html | 97 +- layouts/_default/cli.html | 4 +- layouts/_default/search.html | 39 +- layouts/_default/wide.html | 4 +- layouts/guides/landing.html | 274 +- layouts/guides/single.html | 14 +- layouts/index.html | 490 ++-- layouts/partials/admonitions/icons/error.svg | 8 + .../partials/admonitions/icons/important.svg | 8 + layouts/partials/admonitions/icons/info.svg | 3 + .../partials/admonitions/icons/lightbulb.svg | 8 + .../partials/admonitions/icons/warning.svg | 8 + layouts/partials/breadcrumbs.html | 15 +- layouts/partials/components/accordion.html | 19 +- layouts/partials/components/badge.html | 15 +- layouts/partials/components/card.html | 66 +- .../partials/components/guide-summary.html | 10 +- .../partials/components/support-button.html | 8 +- layouts/partials/content-default.html | 17 +- layouts/partials/footer.html | 74 +- layouts/partials/github-links.html | 20 +- layouts/partials/guides-stepper.html | 32 +- layouts/partials/head.html | 59 +- layouts/partials/header.html | 54 +- layouts/partials/languages.html | 16 +- layouts/partials/md-dropdown.html | 13 +- layouts/partials/pagemeta.html | 19 +- layouts/partials/pagination.html | 123 +- layouts/partials/search-bar.html | 57 +- layouts/partials/sidebar/guides.html | 47 +- layouts/partials/sidebar/mainnav.html | 41 +- layouts/partials/sidebar/sections.html | 95 +- layouts/partials/sidebar/tags.html | 18 +- layouts/partials/tags.html | 11 +- layouts/partials/tooltip.html | 21 +- layouts/partials/utils/css.html | 35 +- layouts/partials/utils/svg.html | 10 + layouts/samples/single.html | 4 +- layouts/shortcodes/button.html | 8 +- layouts/shortcodes/card.html | 9 +- layouts/shortcodes/cta.html | 11 +- layouts/shortcodes/desktop-install-v2.html | 69 +- layouts/shortcodes/grid.html | 4 +- layouts/shortcodes/release-date.html | 4 +- layouts/shortcodes/summary-bar.html | 4 +- layouts/shortcodes/tabs.html | 15 +- layouts/tag/taxonomy.html | 20 +- layouts/tag/term.html | 2 +- package-lock.json | 2554 ++++++----------- package.json | 9 +- postcss.config.js | 8 - static/assets/images/apple_48.svg | 17 - static/assets/images/linux_48.svg | 17 - static/assets/images/windows_48.svg | 17 - tailwind.config.js | 271 -- 94 files changed, 3738 insertions(+), 4025 deletions(-) delete mode 100644 assets/css/code.css create mode 100644 assets/css/components.css delete mode 100644 assets/css/icons.css delete mode 100644 assets/css/lists.css create mode 100644 assets/css/style.css delete mode 100644 assets/css/styles.css create mode 100644 assets/css/theme.css delete mode 100644 assets/css/toc.css delete mode 100644 assets/css/typography.css create mode 100644 assets/css/utilities.css create mode 100644 assets/icons/AppleMac.svg rename {static/assets => assets}/icons/Compose.svg (100%) create mode 100644 assets/icons/Linux.svg rename {static/assets => assets}/icons/Scout.svg (100%) rename {static/assets => assets}/icons/Testcontainers.svg (100%) rename {static/assets => assets}/icons/Whale.svg (100%) create mode 100644 assets/icons/Windows.svg rename {static/assets => assets}/icons/go.svg (100%) rename {static/assets => assets}/icons/java.svg (100%) rename {static/assets/images => assets/icons}/logo-build-cloud.svg (100%) create mode 100644 assets/icons/toolbox.svg create mode 100644 assets/theme/icons/edit.svg create mode 100644 assets/theme/icons/issue.svg create mode 100644 layouts/partials/admonitions/icons/error.svg create mode 100644 layouts/partials/admonitions/icons/important.svg create mode 100644 layouts/partials/admonitions/icons/info.svg create mode 100644 layouts/partials/admonitions/icons/lightbulb.svg create mode 100644 layouts/partials/admonitions/icons/warning.svg create mode 100644 layouts/partials/utils/svg.html delete mode 100644 postcss.config.js delete mode 100644 static/assets/images/apple_48.svg delete mode 100644 static/assets/images/linux_48.svg delete mode 100644 static/assets/images/windows_48.svg delete mode 100644 tailwind.config.js diff --git a/.github/labeler.yml b/.github/labeler.yml index c610f1df6207..a4fd92c0e1be 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -179,7 +179,6 @@ hugo: - hugo_stats.json - i18n/** - layouts/** - - postcss.config.js - static/** - tailwind.config.js diff --git a/assets/css/code.css b/assets/css/code.css deleted file mode 100644 index fa4bb4bd34b6..000000000000 --- a/assets/css/code.css +++ /dev/null @@ -1,81 +0,0 @@ -@layer components { - .prose { - .highlight, - :not(pre) > code { - font-size: 0.875em; - border: 1px solid; - border-radius: theme("spacing.1"); - background: theme("colors.white"); - border-color: theme("colors.gray.light.300"); - .dark & { - background: theme("colors.gray.dark.200"); - border-color: theme("colors.gray.dark.300"); - } - } - - :not(pre) > code { - background: theme("colors.gray.light.200"); - display: inline-block; - margin: 0; - font-weight: 400; - overflow-wrap: anywhere; - padding: 0 4px; - } - - table:not(.lntable) code { - overflow-wrap: unset; - white-space: nowrap; - } - - /* Indented code blocks */ - pre:not(.chroma) { - @apply my-4 overflow-x-auto p-3; - font-size: 0.875em; - border: 1px solid; - border-radius: theme("spacing.1"); - background: theme("colors.white"); - border-color: theme("colors.gray.light.300"); - .dark & { - background: theme("colors.gray.dark.200"); - border-color: theme("colors.gray.dark.300"); - } - } - - .highlight { - @apply my-4 overflow-x-auto p-3; - - /* LineTableTD */ - .lntd { - vertical-align: top; - padding: 0; - margin: 0; - font-weight: 400; - padding: 0 4px; - &:first-child { - width: 0; - } - } - - /* LineTableTD */ - .lntd { - vertical-align: top; - padding: 0; - margin: 0; - border: 0; - } - /* LineTable */ - .lntable { - display: table; - width: 100%; - border-spacing: 0; - padding: 0; - margin: 0; - border: 0; - /* LineNumberColumnHighlight */ - .lntd:first-child .hl { - display: block; - } - } - } - } -} diff --git a/assets/css/components.css b/assets/css/components.css new file mode 100644 index 000000000000..c77f6ec01a45 --- /dev/null +++ b/assets/css/components.css @@ -0,0 +1,100 @@ +@layer components { + .card { + @apply mt-2 mb-2 flex flex-col gap-2 rounded-sm border border-gray-200 p-3; + @apply dark:border-gray-700 dark:bg-gray-900; + @apply transition-shadow duration-200; + &:hover, + &:focus { + @apply border-gray-300 dark:border-gray-600; + } + } + .card-link:hover { + @apply !no-underline; + } + .card-header { + @apply mb-2 flex items-center gap-2; + @apply text-gray-700 dark:text-gray-100; + } + .card-icon { + @apply text-gray-700 dark:text-gray-100; + } + .card-img, + .card-img svg { + @apply m-0 flex max-h-5 min-h-5 max-w-5 min-w-5 items-center justify-center fill-current; + } + .card-title { + @apply font-semibold; + } + .card-link { + @apply block text-inherit no-underline hover:underline; + } + .card-description { + @apply text-gray-600; + @apply dark:text-gray-300; + } + + .admonition { + @apply relative mb-4 flex w-full flex-col items-start gap-3 rounded-sm px-6 py-4; + @apply bg-gray-50 dark:bg-gray-900; + } + .admonition-header { + @apply flex flex-wrap items-center gap-2; + } + .admonition-title { + @apply font-semibold; + } + .admonition-content { + @apply w-full min-w-0 flex-1 flex-wrap overflow-x-auto break-words; + color: var(--tw-prose-body); + } + .admonition-note { + @apply border-blue-400 bg-blue-50 text-blue-900; + @apply dark:border-blue-600 dark:bg-blue-950 dark:text-blue-100; + } + .admonition-tip { + @apply border-green-400 bg-green-100 text-green-900; + @apply dark:border-green-600 dark:bg-green-950 dark:text-green-100; + } + .admonition-warning { + @apply border-yellow-400 bg-yellow-50 text-yellow-900; + @apply dark:border-yellow-600 dark:bg-yellow-950 dark:text-yellow-100; + } + .admonition-danger { + @apply border-red-400 bg-red-50 text-red-900; + @apply dark:border-red-600 dark:bg-red-950 dark:text-red-100; + } + .admonition-important { + @apply border-purple-400 bg-purple-50 text-purple-900; + @apply dark:border-purple-600 dark:bg-purple-950 dark:text-purple-100; + } + .admonition-icon { + @apply flex-shrink-0; + width: 24px; + height: 24px; + min-width: 24px; + min-height: 24px; + display: flex; + align-items: center; + justify-content: center; + } + + .download-links { + @apply block; + @apply text-gray-800; + @apply dark:text-gray-200; + } + .download-links a { + @apply link; + } + .download-links-subcontainer { + @apply flex flex-wrap gap-2; + } + + .card-image { + @apply h-12 w-12 overflow-hidden; + } +} + +.summary-bar { + @apply my-1 mt-4 flex flex-col rounded-sm border-1 border-gray-100 bg-gray-50 p-4 dark:border-gray-800 dark:bg-gray-900; +} diff --git a/assets/css/global.css b/assets/css/global.css index fa6742830e81..e1d27a0b3227 100644 --- a/assets/css/global.css +++ b/assets/css/global.css @@ -1,89 +1,106 @@ /* global styles */ -@layer base { - [x-cloak=""] { +[x-cloak=""] { + display: none !important; +} +/* alpine cloak for small screens only */ +[x-cloak="sm"] { + @media (width <= 768px) { display: none !important; } - /* alpine cloak for small screens only */ - [x-cloak="sm"] { - @media (width <= 768px) { - display: none !important; - } +} +:root { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + scrollbar-color: var(--color-gray-400) rgba(0, 0, 0, 0.05); + &.dark { + scrollbar-color: var(--color-gray-700) rgba(255, 255, 255, 0.1); } +} + +mark { + @apply bg-transparent font-bold text-blue-500 dark:text-blue-800; +} - :root { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; +/* Hide the clear (X) button for search inputs */ +/* Chrome, Safari, Edge, and Opera */ +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; + appearance: none; +} - scrollbar-color: theme(colors.gray.light.400) theme(colors.black / 0.05); - &.dark { - scrollbar-color: theme(colors.gray.dark.800) theme(colors.white / 0.10); +/* Firefox */ +input[type="search"]::-moz-search-cancel-button { + display: none; +} + +/* Internet Explorer and Edge (legacy) */ +input[type="search"]::-ms-clear { + display: none; +} +.prose { + code { + @apply !bg-gray-100; + } + & .highlight, + & :not(pre) > code { + .dark & { + background: var(--color-gray-900) !important; + border-color: var(--color-gray-700) !important; } } +} - mark { - @apply bg-transparent font-bold text-blue-light dark:text-blue-dark; +.prose { + li { + @apply my-2; + > :last-child, + > :first-child { + margin: 0; + } } - - /* Hide the clear (X) button for search inputs */ - /* Chrome, Safari, Edge, and Opera */ - input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; - appearance: none; + hr { + @apply mt-8 mb-4; } - - /* Firefox */ - input[type="search"]::-moz-search-cancel-button { - display: none; + :where(h1):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 500 !important; + margin-top: 0; + margin-bottom: 0.2em !important; + line-height: 1.1111111; } - - /* Internet Explorer and Edge (legacy) */ - input[type="search"]::-ms-clear { - display: none; + > h2 { + @apply mt-5! mb-3! text-3xl!; + a { + @apply hover:no-underline!; + } } -} - -/* utility classes */ - -@layer utilities { - .link { - @apply text-blue-light underline underline-offset-2 dark:text-blue-dark; + > h3 { + @apply text-2xl!; + a { + @apply hover:no-underline!; + } } - - .invertible { - @apply dark:hue-rotate-180 dark:invert dark:filter; + > h4 { + a { + @apply hover:no-underline!; + } } - - .bg-pattern-blue { - background-color: theme(colors.white / 50%); - background-image: url('/assets/images/bg-pattern-blue.webp'); - background-blend-mode: overlay; - background-size: cover; - background-repeat: none; - .dark & { - background-color: theme(colors.black / 70%); + > h5 { + a { + @apply hover:no-underline!; } } + ol { + list-style-type: decimal; + } - .bg-pattern-purple { - background-color: theme(colors.white / 50%); - background-image: url('/assets/images/bg-pattern-purple.webp'); - background-blend-mode: overlay; - background-size: cover; - background-repeat: none; - .dark & { - background-color: theme(colors.black / 70%); - } + ol ol { + list-style-type: lower-alpha; } - .bg-pattern-verde { - background-color: theme(colors.white / 50%); - background-image: url('/assets/images/bg-pattern-verde.webp'); - background-blend-mode: overlay; - background-size: cover; - background-repeat: none; - .dark & { - background-color: theme(colors.black / 70%); - } + ol ol ol { + list-style-type: lower-roman; } } diff --git a/assets/css/icons.css b/assets/css/icons.css deleted file mode 100644 index 08428273b262..000000000000 --- a/assets/css/icons.css +++ /dev/null @@ -1,29 +0,0 @@ -@layer utilities { - .icon-svg { - svg { - font-size: 24px; - width: 1em; - height: 1em; - display: inline-block; - fill: currentColor; - } - } - - .icon-xs { - svg { - font-size: 12px; - } - } - - .icon-sm { - svg { - font-size: 16px; - } - } - - .icon-lg { - svg { - font-size: 32px; - } - } -} diff --git a/assets/css/lists.css b/assets/css/lists.css deleted file mode 100644 index 249f71f4f2a3..000000000000 --- a/assets/css/lists.css +++ /dev/null @@ -1,12 +0,0 @@ -.prose ol { - list-style-type: decimal; -} - -.prose ol ol { - list-style-type: lower-alpha; -} - -.prose ol ol ol { - list-style-type: lower-roman; -} - diff --git a/assets/css/style.css b/assets/css/style.css new file mode 100644 index 000000000000..d8469b419a5f --- /dev/null +++ b/assets/css/style.css @@ -0,0 +1,45 @@ +/* Main CSS entry point */ +@import "tailwindcss"; +@plugin "@tailwindcss/typography"; +@source "hugo_stats.json"; + +@font-face { + font-family: "Roboto Flex"; + src: url("/assets/fonts/RobotoFlex.woff2") format("woff2"); + font-weight: 100 1000; /* Range of weights Roboto Flex supports */ + font-stretch: 100%; /* Range of width Roboto Flex supports */ + font-style: oblique 0deg 10deg; /* Range of oblique angle Roboto Flex supports */ + font-display: fallback; +} + +/* Roboto Mono */ +@font-face { + font-family: "Roboto Mono"; + src: url("/assets/fonts/RobotoMono-Regular.woff2") format("woff2"); + font-weight: 100 700; /* Define the range of weight the variable font supports */ + font-style: normal; + font-display: fallback; +} + +/* Roboto Mono Italic */ +@font-face { + font-family: "Roboto Mono"; + src: url("/assets/fonts/RobotoMono-Italic.woff2") format("woff2"); + font-weight: 100 700; /* Define the range of weight the variable font supports */ + font-style: italic; + font-display: fallback; +} + +@layer theme { + @import "theme.css"; +} + +@layer base { + @import "global.css"; +} +@import "utilities.css"; +@import "syntax-dark.css"; +@import "syntax-light.css"; +@import "components.css"; + +@variant dark (&:where(.dark, .dark *)); diff --git a/assets/css/styles.css b/assets/css/styles.css deleted file mode 100644 index 377c07bcc22a..000000000000 --- a/assets/css/styles.css +++ /dev/null @@ -1,16 +0,0 @@ -/* see also: tailwind.config.js */ - -@import "tailwindcss/base"; -@import "/assets/css/global"; -@import "/assets/css/typography"; -@import "/assets/css/hack"; - -@import "tailwindcss/components"; -@import "/assets/css/code"; -@import "/assets/css/toc"; - -@import "tailwindcss/utilities"; -@import "/assets/css/syntax-light"; -@import "/assets/css/syntax-dark"; -@import "/assets/css/icons"; -@import "/assets/css/lists"; diff --git a/assets/css/syntax-dark.css b/assets/css/syntax-dark.css index ff24a1954882..74b0b7b2d2d8 100644 --- a/assets/css/syntax-dark.css +++ b/assets/css/syntax-dark.css @@ -1,343 +1,342 @@ -@layer utilities { - .syntax-dark { - /* Other */ - .x { - color: theme("colors.white"); - } - /* Error */ - .err { - color: theme("colors.red.dark.500"); - } - /* CodeLine */ - .cl { - } - /* LineHighlight */ - .hl { - min-width: fit-content; - background-color: theme("colors.gray.dark.300"); - } - .lntd:first-child .hl, - & > .chroma > code > .hl { - margin-left: -4px; - border-left: 4px solid theme("colors.gray.dark.400"); - } - /* LineNumbersTable */ - .lnt { - white-space: pre; - user-select: none; - margin-right: 0.4em; - padding: 0 0.4em 0 0.4em; - color: theme("colors.gray.dark.400"); - } - /* LineNumbers */ - .ln { - white-space: pre; - user-select: none; - margin-right: 0.4em; - padding: 0 0.4em 0 0.4em; - color: theme("colors.gray.dark.400"); - } - /* Line */ - .line { - display: flex; - } - /* Keyword */ - .k { - color: theme("colors.amber.dark.700"); - } - /* KeywordConstant */ - .kc { - color: theme("colors.violet.dark.700"); - } - /* KeywordDeclaration */ - .kd { - color: theme("colors.amber.dark.700"); - } - /* KeywordNamespace */ - .kn { - color: theme("colors.amber.dark.700"); - } - /* KeywordPseudo */ - .kp { - color: theme("colors.amber.dark.700"); - } - /* KeywordReserved */ - .kr { - color: theme("colors.amber.dark.700"); - } - /* KeywordType */ - .kt { - color: theme("colors.amber.dark.700"); - } - /* Name */ - .n { - color: theme("colors.violet.dark.700"); - } - /* NameAttribute */ - .na { - color: theme("colors.amber.dark.700"); - } - /* NameBuiltin */ - .nb { - color: theme("colors.amber.dark.700"); - } - /* NameBuiltinPseudo */ - .bp { - color: theme("colors.violet.dark.700"); - } - /* NameClass */ - .nc { - color: theme("colors.white"); - } - /* NameConstant */ - .no { - color: theme("colors.white"); - } - /* NameDecorator */ - .nd { - color: theme("colors.violet.dark.700"); - } - /* NameEntity */ - .ni { - color: theme("colors.amber.dark.700"); - } - /* NameException */ - .ne { - color: theme("colors.red.dark.700"); - } - /* NameFunction */ - .nf { - color: theme("colors.blue.dark.600"); - } - /* NameFunctionMagic */ - .fm { - color: theme("colors.blue.dark.600"); - } - /* NameLabel */ - .nl { - color: theme("colors.amber.dark.500"); - } - /* NameNamespace */ - .nn { - color: theme("colors.white"); - } - /* NameOther */ - .nx { - color: theme("colors.white"); - } - /* NameProperty */ - .py { - color: theme("colors.white"); - } - /* NameTag */ - .nt { - color: theme("colors.green.dark.600"); - } - /* NameVariable */ - .nv { - color: theme("colors.white"); - } - /* NameVariableClass */ - .vc { - color: theme("colors.violet.dark.600"); - } - /* NameVariableGlobal */ - .vg { - color: theme("colors.violet.dark.600"); - } - /* NameVariableInstance */ - .vi { - color: theme("colors.violet.dark.600"); - } - /* NameVariableMagic */ - .vm { - color: theme("colors.violet.dark.600"); - } - /* Literal */ - .l { - color: theme("colors.white"); - } - /* LiteralDate */ - .ld { - color: theme("colors.green.dark.600"); - } - /* LiteralString */ - .s { - color: theme("colors.white"); - } - /* LiteralStringAffix */ - .sa { - color: theme("colors.green.dark.600"); - } - /* LiteralStringBacktick */ - .sb { - color: theme("colors.green.dark.600"); - } - /* LiteralStringChar */ - .sc { - color: theme("colors.green.dark.600"); - } - /* LiteralStringDelimiter */ - .dl { - color: theme("colors.green.dark.600"); - } - /* LiteralStringDoc */ - .sd { - color: theme("colors.green.dark.600"); - } - /* LiteralStringDouble */ - .s2 { - color: theme("colors.green.dark.600"); - } - /* LiteralStringEscape */ - .se { - color: theme("colors.white"); - } - /* LiteralStringHeredoc */ - .sh { - color: theme("colors.green.dark.600"); - } - /* LiteralStringInterpol */ - .si { - color: theme("colors.green.dark.600"); - } - /* LiteralStringOther */ - .sx { - color: theme("colors.green.dark.600"); - } - /* LiteralStringRegex */ - .sr { - color: theme("colors.blue.dark.500"); - } - /* LiteralStringSingle */ - .s1 { - color: theme("colors.green.dark.600"); - } - /* LiteralStringSymbol */ - .ss { - color: theme("colors.blue.dark.600"); - } - /* LiteralNumber */ - .m { - color: theme("colors.blue.dark.600"); - } - /* LiteralNumberBin */ - .mb { - color: theme("colors.blue.dark.600"); - } - /* LiteralNumberFloat */ - .mf { - color: theme("colors.blue.dark.600"); - } - /* LiteralNumberHex */ - .mh { - color: theme("colors.blue.dark.600"); - } - /* LiteralNumberInteger */ - .mi { - color: theme("colors.blue.dark.600"); - } - /* LiteralNumberIntegerLong */ - .il { - color: theme("colors.blue.dark.600"); - } - /* LiteralNumberOct */ - .mo { - color: theme("colors.blue.dark.600"); - } - /* Operator */ - .o { - color: theme("colors.blue.dark.700"); - } - /* OperatorWord */ - .ow { - color: theme("colors.amber.dark.700"); - } - /* Punctuation */ - .p { - color: theme("colors.gray.dark.500"); - } - /* Comment */ - .c { - color: theme("colors.gray.dark.500"); - } - /* CommentHashbang */ - .ch { - color: theme("colors.gray.dark.500"); - } - /* CommentMultiline */ - .cm { - color: theme("colors.gray.dark.500"); - } - /* CommentSingle */ - .c1 { - color: theme("colors.gray.dark.500"); - } - /* CommentSpecial */ - .cs { - color: theme("colors.gray.dark.500"); - } - /* CommentPreproc */ - .cp { - color: theme("colors.gray.dark.500"); - } - /* CommentPreprocFile */ - .cpf { - color: theme("colors.gray.dark.500"); - } - /* Generic */ - .g { - color: theme("colors.white"); - } - /* GenericDeleted */ - .gd { - color: theme("colors.red.dark.500"); - } - /* GenericEmph */ - .ge { - color: theme("colors.white"); - } - /* GenericError */ - .gr { - color: theme("colors.red.dark.500"); - } - /* GenericHeading */ - .gh { - color: theme("colors.gray.dark.600"); - } - /* GenericInserted */ - .gi { - color: theme("colors.green.dark.500"); - } - /* GenericOutput */ - .go { - color: theme("colors.white"); - } - /* GenericPrompt */ - .gp { - user-select: none; - color: theme("colors.green.dark.400"); - } - /* GenericStrong */ - .gs { - color: theme("colors.white"); - } - /* GenericSubheading */ - .gu { - color: theme("colors.gray.dark.600"); - } - /* GenericTraceback */ - .gt { - color: theme("colors.red.dark.500"); - } - /* GenericUnderline */ - .gl { - color: theme("colors.white"); - text-decoration: underline; - } - /* TextWhitespace */ - .w { - color: theme("colors.gray.dark.100"); - } +@utility syntax-dark { + /* Other */ + .x { + color: var(--color-white-main); + } + /* Error */ + .err { + color: var(--color-red-500); + } + /* CodeLine */ + .cl { + color: var(--color-gray-200); + } + /* LineHighlight */ + .hl { + min-width: fit-content; + background-color: var(--color-gray-800); + } + .lntd:first-child .hl, + & > .chroma > code > .hl { + margin-left: -4px; + border-left: 4px solid var(--color-gray-900); + } + /* LineNumbersTable */ + .lnt { + white-space: pre; + user-select: none; + margin-right: 0.4em; + padding: 0 0.4em 0 0.4em; + color: var(--color-gray-900); + } + /* LineNumbers */ + .ln { + white-space: pre; + user-select: none; + margin-right: 0.4em; + padding: 0 0.4em 0 0.4em; + color: var(--color-gray-900); + } + /* Line */ + .line { + display: flex; + } + /* Keyword */ + .k { + color: var(--color-yellow-700); + } + /* KeywordConstant */ + .kc { + color: var(--color-violet-300); + } + /* KeywordDeclaration */ + .kd { + color: var(--color-yellow-700); + } + /* KeywordNamespace */ + .kn { + color: var(--color-yellow-700); + } + /* KeywordPseudo */ + .kp { + color: var(--color-yellow-700); + } + /* KeywordReserved */ + .kr { + color: var(--color-yellow-700); + } + /* KeywordType */ + .kt { + color: var(--color-yellow-700); + } + /* Name */ + .n { + color: var(--color-violet-300); + } + /* NameAttribute */ + .na { + color: var(--color-yellow-700); + } + /* NameBuiltin */ + .nb { + color: var(--color-yellow-700); + } + /* NameBuiltinPseudo */ + .bp { + color: var(--color-violet-300); + } + /* NameClass */ + .nc { + color: var(--color-white-main); + } + /* NameConstant */ + .no { + color: var(--color-white-main); + } + /* NameDecorator */ + .nd { + color: var(--color-violet-300); + } + /* NameEntity */ + .ni { + color: var(--color-yellow-700); + } + /* NameException */ + .ne { + color: var(--color-red-700); + } + /* NameFunction */ + .nf { + color: var(--color-blue-400); + } + /* NameFunctionMagic */ + .fm { + color: var(--color-blue-400); + } + /* NameLabel */ + .nl { + color: var(--color-yellow-500); + } + /* NameNamespace */ + .nn { + color: var(--color-white-main); + } + /* NameOther */ + .nx { + color: var(--color-white-main); + } + /* NameProperty */ + .py { + color: var(--color-violet-300); + } + /* NameTag */ + .nt { + color: var(--color-green-300); + } + /* NameVariable */ + .nv { + color: var(--color-green-500); + } + /* NameVariableClass */ + .vc { + color: var(--color-violet-600); + } + /* NameVariableGlobal */ + .vg { + color: var(--color-violet-600); + } + /* NameVariableInstance */ + .vi { + color: var(--color-violet-600); + } + /* NameVariableMagic */ + .vm { + color: var(--color-violet-600); + } + /* Literal */ + .l { + color: var(--color-white-main); + } + /* LiteralDate */ + .ld { + color: var(--color-green-600); + } + /* LiteralString */ + .s { + color: var(--color-white-main); + } + /* LiteralStringAffix */ + .sa { + color: var(--color-green-600); + } + /* LiteralStringBacktick */ + .sb { + color: var(--color-green-600); + } + /* LiteralStringChar */ + .sc { + color: var(--color-green-600); + } + /* LiteralStringDelimiter */ + .dl { + color: var(--color-green-600); + } + /* LiteralStringDoc */ + .sd { + color: var(--color-green-600); + } + /* LiteralStringDouble */ + .s2 { + color: var(--color-green-600); + } + /* LiteralStringEscape */ + .se { + color: var(--color-white-main); + } + /* LiteralStringHeredoc */ + .sh { + color: var(--color-green-600); + } + /* LiteralStringInterpol */ + .si { + color: var(--color-green-600); + } + /* LiteralStringOther */ + .sx { + color: var(--color-green-600); + } + /* LiteralStringRegex */ + .sr { + color: var(--color-blue-400); + } + /* LiteralStringSingle */ + .s1 { + color: var(--color-green-600); + } + /* LiteralStringSymbol */ + .ss { + color: var(--color-blue-400); + } + /* LiteralNumber */ + .m { + color: var(--color-blue-400); + } + /* LiteralNumberBin */ + .mb { + color: var(--color-blue-400); + } + /* LiteralNumberFloat */ + .mf { + color: var(--color-blue-400); + } + /* LiteralNumberHex */ + .mh { + color: var(--color-blue-400); + } + /* LiteralNumberInteger */ + .mi { + color: var(--color-blue-400); + } + /* LiteralNumberIntegerLong */ + .il { + color: var(--color-blue-400); + } + /* LiteralNumberOct */ + .mo { + color: var(--color-blue-400); + } + /* Operator */ + .o { + color: var(--color-blue-200); + } + /* OperatorWord */ + .ow { + color: var(--color-yellow-700); + } + /* Punctuation */ + .p { + color: var(--color-gray-500); + } + /* Comment */ + .c { + color: var(--color-gray-500); + } + /* CommentHashbang */ + .ch { + color: var(--color-gray-500); + } + /* CommentMultiline */ + .cm { + color: var(--color-gray-500); + } + /* CommentSingle */ + .c1 { + color: var(--color-gray-500); + } + /* CommentSpecial */ + .cs { + color: var(--color-gray-500); + } + /* CommentPreproc */ + .cp { + color: var(--color-gray-500); + } + /* CommentPreprocFile */ + .cpf { + color: var(--color-gray-500); + } + /* Generic */ + .g { + color: var(--color-white-main); + } + /* GenericDeleted */ + .gd { + color: var(--color-red-500); + } + /* GenericEmph */ + .ge { + color: var(--color-white-main); + } + /* GenericError */ + .gr { + color: var(--color-red-500); + } + /* GenericHeading */ + .gh { + color: var(--color-gray-600); + } + /* GenericInserted */ + .gi { + color: var(--color-green-500); + } + /* GenericOutput */ + .go { + color: var(--color-white-main); + } + /* GenericPrompt */ + .gp { + user-select: none; + color: var(--color-green-500); + } + /* GenericStrong */ + .gs { + color: var(--color-white-main); + } + /* GenericSubheading */ + .gu { + color: var(--color-gray-600); + } + /* GenericTraceback */ + .gt { + color: var(--color-red-500); + } + /* GenericUnderline */ + .gl { + color: var(--color-white-main); + text-decoration: underline; + } + /* TextWhitespace */ + .w { + color: var(--color-gray-100); } } diff --git a/assets/css/syntax-light.css b/assets/css/syntax-light.css index ba0bb789f853..c43ffa79cac3 100644 --- a/assets/css/syntax-light.css +++ b/assets/css/syntax-light.css @@ -1,343 +1,342 @@ -@layer utilities { - .syntax-light { - /* Other */ - .x { - color: theme("colors.black"); - } - /* Error */ - .err { - color: theme("colors.red.light.500"); - } - /* CodeLine */ - .cl { - } - /* LineHighlight */ - .hl { - min-width: fit-content; - background-color: theme("colors.blue.light.100"); - } - .lntd:first-child .hl, - & > .chroma > code > .hl { - margin-left: -4px; - border-left: 4px solid theme("colors.blue.light.300"); - } - /* LineNumbersTable */ - .lnt { - white-space: pre; - user-select: none; - margin-right: 0.4em; - padding: 0 0.4em 0 0.4em; - color: theme("colors.gray.light.400"); - } - /* LineNumbers */ - .ln { - white-space: pre; - user-select: none; - margin-right: 0.4em; - padding: 0 0.4em 0 0.4em; - color: theme("colors.gray.light.400"); - } - /* Line */ - .line { - display: flex; - } - /* Keyword */ - .k { - color: theme("colors.amber.light.500"); - } - /* KeywordConstant */ - .kc { - color: theme("colors.violet.light.400"); - } - /* KeywordDeclaration */ - .kd { - color: theme("colors.amber.light.500"); - } - /* KeywordNamespace */ - .kn { - color: theme("colors.amber.light.500"); - } - /* KeywordPseudo */ - .kp { - color: theme("colors.amber.light.500"); - } - /* KeywordReserved */ - .kr { - color: theme("colors.amber.light.500"); - } - /* KeywordType */ - .kt { - color: theme("colors.amber.light.500"); - } - /* Name */ - .n { - color: theme("colors.violet.light.400"); - } - /* NameAttribute */ - .na { - color: theme("colors.amber.light.500"); - } - /* NameBuiltin */ - .nb { - color: theme("colors.amber.light.500"); - } - /* NameBuiltinPseudo */ - .bp { - color: theme("colors.violet.light.400"); - } - /* NameClass */ - .nc { - color: theme("colors.black"); - } - /* NameConstant */ - .no { - color: theme("colors.black"); - } - /* NameDecorator */ - .nd { - color: theme("colors.violet.light.400"); - } - /* NameEntity */ - .ni { - color: theme("colors.amber.light.500"); - } - /* NameException */ - .ne { - color: theme("colors.red.light.700"); - } - /* NameFunction */ - .nf { - color: theme("colors.blue.light.600"); - } - /* NameFunctionMagic */ - .fm { - color: theme("colors.blue.light.600"); - } - /* NameLabel */ - .nl { - color: theme("colors.amber.light.700"); - } - /* NameNamespace */ - .nn { - color: theme("colors.black"); - } - /* NameOther */ - .nx { - color: theme("colors.black"); - } - /* NameProperty */ - .py { - color: theme("colors.black"); - } - /* NameTag */ - .nt { - color: theme("colors.green.light.600"); - } - /* NameVariable */ - .nv { - color: theme("colors.black"); - } - /* NameVariableClass */ - .vc { - color: theme("colors.violet.light.600"); - } - /* NameVariableGlobal */ - .vg { - color: theme("colors.violet.light.600"); - } - /* NameVariableInstance */ - .vi { - color: theme("colors.violet.light.600"); - } - /* NameVariableMagic */ - .vm { - color: theme("colors.violet.light.600"); - } - /* Literal */ - .l { - color: theme("colors.black"); - } - /* LiteralDate */ - .ld { - color: theme("colors.black"); - } - /* LiteralString */ - .s { - color: theme("colors.black"); - } - /* LiteralStringAffix */ - .sa { - color: theme("colors.green.light.600"); - } - /* LiteralStringBacktick */ - .sb { - color: theme("colors.green.light.600"); - } - /* LiteralStringChar */ - .sc { - color: theme("colors.green.light.600"); - } - /* LiteralStringDelimiter */ - .dl { - color: theme("colors.green.light.600"); - } - /* LiteralStringDoc */ - .sd { - color: #8f5902; - } - /* LiteralStringDouble */ - .s2 { - color: theme("colors.green.light.600"); - } - /* LiteralStringEscape */ - .se { - color: theme("colors.black"); - } - /* LiteralStringHeredoc */ - .sh { - color: theme("colors.green.light.600"); - } - /* LiteralStringInterpol */ - .si { - color: theme("colors.green.light.600"); - } - /* LiteralStringOther */ - .sx { - color: theme("colors.green.light.600"); - } - /* LiteralStringRegex */ - .sr { - color: theme("colors.blue.light.500"); - } - /* LiteralStringSingle */ - .s1 { - color: theme("colors.green.light.600"); - } - /* LiteralStringSymbol */ - .ss { - color: theme("colors.green.light.600"); - } - /* LiteralNumber */ - .m { - color: theme("colors.blue.light.600"); - } - /* LiteralNumberBin */ - .mb { - color: theme("colors.blue.light.600"); - } - /* LiteralNumberFloat */ - .mf { - color: theme("colors.blue.light.600"); - } - /* LiteralNumberHex */ - .mh { - color: theme("colors.blue.light.600"); - } - /* LiteralNumberInteger */ - .mi { - color: theme("colors.blue.light.600"); - } - /* LiteralNumberIntegerLong */ - .il { - color: theme("colors.blue.light.600"); - } - /* LiteralNumberOct */ - .mo { - color: theme("colors.blue.light.600"); - } - /* Operator */ - .o { - color: theme("colors.blue.light.400"); - } - /* OperatorWord */ - .ow { - color: theme("colors.amber.light.500"); - } - /* Punctuation */ - .p { - color: theme("colors.gray.light.400"); - } - /* Comment */ - .c { - color: theme("colors.gray.light.400"); - } - /* CommentHashbang */ - .ch { - color: theme("colors.gray.light.400"); - } - /* CommentMultiline */ - .cm { - color: theme("colors.gray.light.400"); - } - /* CommentSingle */ - .c1 { - color: theme("colors.gray.light.400"); - } - /* CommentSpecial */ - .cs { - color: theme("colors.gray.light.400"); - } - /* CommentPreproc */ - .cp { - color: theme("colors.gray.light.400"); - } - /* CommentPreprocFile */ - .cpf { - color: theme("colors.gray.light.400"); - } - /* Generic */ - .g { - color: theme("colors.black"); - } - /* GenericDeleted */ - .gd { - color: theme("colors.red.light.500"); - } - /* GenericEmph */ - .ge { - color: theme("colors.black"); - } - /* GenericError */ - .gr { - color: theme("colors.red.light.500"); - } - /* GenericHeading */ - .gh { - color: theme("colors.gray.light.600"); - } - /* GenericInserted */ - .gi { - color: theme("colors.green.light.500"); - } - /* GenericOutput */ - .go { - color: theme("colors.black"); - } - /* GenericPrompt */ - .gp { - user-select: none; - color: theme("colors.green.light.400"); - } - /* GenericStrong */ - .gs { - color: theme("colors.black"); - } - /* GenericSubheading */ - .gu { - color: theme("colors.gray.light.600"); - } - /* GenericTraceback */ - .gt { - color: theme("colors.red.light.500"); - } - /* GenericUnderline */ - .gl { - color: theme("colors.black"); - text-decoration: underline; - } - /* TextWhitespace */ - .w { - color: theme("colors.gray.light.100"); - } +@utility syntax-light { + /* Other */ + .x { + color: var(--color-black-main); + } + /* Error */ + .err { + color: var(--color-red-500); + } + /* CodeLine */ + .cl { + color: var(--color-gray-700); + } + /* LineHighlight */ + .hl { + min-width: fit-content; + background-color: var(--color-blue-100); + } + .lntd:first-child .hl, + & > .chroma > code > .hl { + margin-left: -4px; + border-left: 4px solid var(--color-blue-300); + } + /* LineNumbersTable */ + .lnt { + white-space: pre; + user-select: none; + margin-right: 0.4em; + padding: 0 0.4em 0 0.4em; + color: var(--color-gray-400); + } + /* LineNumbers */ + .ln { + white-space: pre; + user-select: none; + margin-right: 0.4em; + padding: 0 0.4em 0 0.4em; + color: var(--color-gray-400); + } + /* Line */ + .line { + display: flex; + } + /* Keyword */ + .k { + color: var(--color-yellow-700); + } + /* KeywordConstant */ + .kc { + color: var(--color-violet-400); + } + /* KeywordDeclaration */ + .kd { + color: var(--color-yellow-700); + } + /* KeywordNamespace */ + .kn { + color: var(--color-yellow-700); + } + /* KeywordPseudo */ + .kp { + color: var(--color-yellow-700); + } + /* KeywordReserved */ + .kr { + color: var(--color-yellow-700); + } + /* KeywordType */ + .kt { + color: var(--color-yellow-700); + } + /* Name */ + .n { + color: var(--color-violet-400); + } + /* NameAttribute */ + .na { + color: var(--color-yellow-700); + } + /* NameBuiltin */ + .nb { + color: var(--color-yellow-800); + } + /* NameBuiltinPseudo */ + .bp { + color: var(--color-violet-400); + } + /* NameClass */ + .nc { + color: var(--color-black-main); + } + /* NameConstant */ + .no { + color: var(--color-black-main); + } + /* NameDecorator */ + .nd { + color: var(--color-violet-400); + } + /* NameEntity */ + .ni { + color: var(--color-yellow-700); + } + /* NameException */ + .ne { + color: var(--color-red-700); + } + /* NameFunction */ + .nf { + color: var(--color-blue-500); + } + /* NameFunctionMagic */ + .fm { + color: var(--color-blue-500); + } + /* NameLabel */ + .nl { + color: var(--color-yellow-700); + } + /* NameNamespace */ + .nn { + color: var(--color-black-main); + } + /* NameOther */ + .nx { + color: var(--color-black-main); + } + /* NameProperty */ + .py { + color: var(--color-black-main); + } + /* NameTag */ + .nt { + color: var(--color-blue-400); + } + /* NameVariable */ + .nv { + color: var(--color-black-main); + } + /* NameVariableClass */ + .vc { + color: var(--color-violet-600); + } + /* NameVariableGlobal */ + .vg { + color: var(--color-violet-600); + } + /* NameVariableInstance */ + .vi { + color: var(--color-violet-600); + } + /* NameVariableMagic */ + .vm { + color: var(--color-violet-600); + } + /* Literal */ + .l { + color: var(--color-black-main); + } + /* LiteralDate */ + .ld { + color: var(--color-black-main); + } + /* LiteralString */ + .s { + color: var(--color-black-main); + } + /* LiteralStringAffix */ + .sa { + color: var(--color-green-700); + } + /* LiteralStringBacktick */ + .sb { + color: var(--color-green-700); + } + /* LiteralStringChar */ + .sc { + color: var(--color-green-700); + } + /* LiteralStringDelimiter */ + .dl { + color: var(--color-green-700); + } + /* LiteralStringDoc */ + .sd { + color: #8f5902; + } + /* LiteralStringDouble */ + .s2 { + color: var(--color-green-700); + } + /* LiteralStringEscape */ + .se { + color: var(--color-black-main); + } + /* LiteralStringHeredoc */ + .sh { + color: var(--color-green-700); + } + /* LiteralStringInterpol */ + .si { + color: var(--color-green-700); + } + /* LiteralStringOther */ + .sx { + color: var(--color-green-700); + } + /* LiteralStringRegex */ + .sr { + color: var(--color-blue-500); + } + /* LiteralStringSingle */ + .s1 { + color: var(--color-green-700); + } + /* LiteralStringSymbol */ + .ss { + color: var(--color-green-700); + } + /* LiteralNumber */ + .m { + color: var(--color-blue-500); + } + /* LiteralNumberBin */ + .mb { + color: var(--color-blue-500); + } + /* LiteralNumberFloat */ + .mf { + color: var(--color-blue-500); + } + /* LiteralNumberHex */ + .mh { + color: var(--color-blue-500); + } + /* LiteralNumberInteger */ + .mi { + color: var(--color-blue-500); + } + /* LiteralNumberIntegerLong */ + .il { + color: var(--color-blue-500); + } + /* LiteralNumberOct */ + .mo { + color: var(--color-blue-500); + } + /* Operator */ + .o { + color: var(--color-blue-400); + } + /* OperatorWord */ + .ow { + color: var(--color-yellow-700); + } + /* Punctuation */ + .p { + color: var(--color-gray-400); + } + /* Comment */ + .c { + color: var(--color-gray-400); + } + /* CommentHashbang */ + .ch { + color: var(--color-gray-400); + } + /* CommentMultiline */ + .cm { + color: var(--color-gray-400); + } + /* CommentSingle */ + .c1 { + color: var(--color-gray-400); + } + /* CommentSpecial */ + .cs { + color: var(--color-gray-400); + } + /* CommentPreproc */ + .cp { + color: var(--color-gray-400); + } + /* CommentPreprocFile */ + .cpf { + color: var(--color-gray-400); + } + /* Generic */ + .g { + color: var(--color-black-main); + } + /* GenericDeleted */ + .gd { + color: var(--color-red-500); + } + /* GenericEmph */ + .ge { + color: var(--color-black-main); + } + /* GenericError */ + .gr { + color: var(--color-red-500); + } + /* GenericHeading */ + .gh { + color: var(--color-gray-600); + } + /* GenericInserted */ + .gi { + color: var(--color-green-500); + } + /* GenericOutput */ + .go { + color: var(--color-black-main); + } + /* GenericPrompt */ + .gp { + user-select: none; + color: var(--color-green-400); + } + /* GenericStrong */ + .gs { + color: var(--color-black-main); + } + /* GenericSubheading */ + .gu { + color: var(--color-gray-600); + } + /* GenericTraceback */ + .gt { + color: var(--color-red-500); + } + /* GenericUnderline */ + .gl { + color: var(--color-black-main); + text-decoration: underline; + } + /* TextWhitespace */ + .w { + color: var(--color-gray-100); } } diff --git a/assets/css/theme.css b/assets/css/theme.css new file mode 100644 index 000000000000..c47a582eec1e --- /dev/null +++ b/assets/css/theme.css @@ -0,0 +1,203 @@ +@theme inline { + --font-sans: "roboto flex", sans-serif; + --font-mono: "roboto flex mono", ui-monospace, SFMono-Regular, monospace; + --default-font-family: var(--font-sans); + + --text-xs: 0.7143rem; + --text-xs--letter-spacing: 0.015em; + --text-xs--font-weight: 500; + --text-sm: 0.851rem; + --text-base: 14px; + --text-lg: 1.1429rem; + --text-lg--line-height: 1.75; + --text-xl: 1.2857rem; + --text-xl--letter-spacing: -0.015em; + --text-xl--font-weight: 500; + --text-2xl: 1.5rem; + --text-2xl--letter-spacing: -0.015em; + --text-2xl--font-weight: 500; + --text-3xl: 2rem; + --text-3xl--font-weight: 500; + --text-4xl: 2.5rem; + --text-4xl--letter-spacing: -0.015em; + --text-4xl--font-weight: 500; + + --color-background-light: #f9f9fa; + --color-background-dark: #10151b; + --color-primary-blue: var(--color-blue); + + --color-divider-light: hsla(0, 0%, 0%, 0.1); + --color-divider-dark: hsla(0, 0%, 100%, 0.05); + + --card-bg-dark: #1d262d; + --card-border-dark: #516980; + --card-bg-dark: var(--color-gray-900); + --card-border-dark: var(--color-gray-700); + + --color-navbar-bg: var(--color-background-light); + --color-navbar-bg-dark: var(--color-background-dark); + --color-navbar-text: var(--color-gray-700); + --color-navbar-text-dark: var(--tw-prose-body); + --color-navbar-border-color-light: var(--tw-prose-inverse-body); + --navbar-font-size: 1rem; + --navbar-group-font-title-size: 1rem; + --color-navbar-text-dark: var(--color-gray-200); + --color-navbar-group-text-dark: var(--tw-prose-body); + + --color-blue: var(--color-blue-400); + --color-blue-100: rgba(217, 229, 252, 1); + --color-blue-200: rgba(170, 196, 248, 1); + --color-blue-300: rgba(123, 164, 244, 1); + --color-blue-400: rgba(75, 131, 241, 1); + --color-blue-50: rgba(246, 248, 254, 1); + --color-blue-500: rgba(37, 96, 255, 1); + --color-blue-600: rgba(13, 77, 242, 1); + --color-blue-700: rgba(0, 61, 181, 1); + --color-blue-800: rgba(0, 41, 120, 1); + --color-blue-900: rgba(0, 29, 86, 1); + --color-blue-950: rgba(0, 21, 60, 1); + --color-blue-focus: rgba(37, 96, 255, 0.24); + --color-blue-focusvisible: rgba(37, 96, 255, 0.32); + --color-blue-hover: rgba(37, 96, 255, 0.12); + --color-blue-outlinedborder: rgba(37, 96, 255, 0.56); + --color-blue-selected: rgba(37, 96, 255, 0.16); + + --color-gray: var(--color-gray-600); + --color-gray-100: rgba(231, 234, 239, 1); + --color-gray-200: rgba(200, 207, 218, 1); + --color-gray-300: rgba(169, 180, 198, 1); + --color-gray-400: rgba(139, 153, 178, 1); + --color-gray-50: rgba(249, 250, 251, 1); + --color-gray-500: rgba(108, 126, 157, 1); + --color-gray-600: rgba(86, 101, 129, 1); + --color-gray-700: rgba(67, 76, 95, 1); + --color-gray-800: rgba(44, 51, 63, 1); + --color-gray-900: rgba(30, 33, 41, 1); + --color-gray-950: rgb(18, 21, 31); + --color-gray-focus: rgba(108, 126, 157, 0.24); + --color-gray-focusvisible: rgba(108, 126, 157, 0.32); + --color-gray-hover: rgba(108, 126, 157, 0.12); + --color-gray-outlinedborder: rgba(108, 126, 157, 0.56); + --color-gray-selected: rgba(108, 126, 157, 0.16); + + --color-green-100: rgba(235, 249, 238, 1); + --color-green-200: rgba(208, 241, 215, 1); + --color-green-300: rgba(169, 229, 189, 1); + --color-green-400: rgba(129, 217, 162, 1); + --color-green-50: rgba(245, 252, 247, 1); + --color-green-500: rgba(90, 206, 140, 1); + --color-green-600: rgba(56, 189, 125, 1); + --color-green-700: rgba(45, 149, 104, 1); + --color-green-800: rgba(33, 110, 75, 1); + --color-green-900: rgba(23, 75, 50, 1); + --color-green-950: rgba(17, 55, 26, 1); + --color-green-focus: rgba(56, 189, 125, 0.24); + --color-green-focusvisible: rgba(56, 189, 125, 0.32); + --color-green-hover: rgba(56, 189, 125, 0.12); + --color-green-outlinedborder: rgba(56, 189, 125, 0.56); + --color-green-selected: rgba(56, 189, 125, 0.16); + + --color-orange-100: rgba(255, 233, 217, 1); + --color-orange-200: rgba(255, 216, 187, 1); + --color-orange-300: rgba(255, 196, 153, 1); + --color-orange-400: rgba(255, 169, 107, 1); + --color-orange-50: rgba(255, 249, 245, 1); + --color-orange-500: rgba(255, 135, 49, 1); + --color-orange-600: rgba(255, 107, 0, 1); + --color-orange-700: rgba(218, 92, 0, 1); + --color-orange-800: rgba(173, 72, 0, 1); + --color-orange-900: rgba(137, 58, 1, 1); + --color-orange-950: rgba(94, 40, 0, 1); + --color-orange-focus: rgba(255, 107, 0, 0.24); + --color-orange-focusvisible: rgba(255, 107, 0, 0.32); + --color-orange-hover: rgba(255, 107, 0, 0.12); + --color-orange-outlinedborder: rgba(255, 107, 0, 0.56); + --color-orange-selected: rgba(255, 107, 0, 0.16); + + --color-pink-100: rgba(255, 230, 251, 1); + --color-pink-200: rgba(255, 201, 246, 1); + --color-pink-300: rgba(255, 166, 240, 1); + --color-pink-400: rgba(252, 113, 220, 1); + --color-pink-50: rgba(255, 247, 254, 1); + --color-pink-500: rgba(237, 73, 199, 1); + --color-pink-600: rgba(201, 24, 171, 1); + --color-pink-700: rgba(171, 0, 137, 1); + --color-pink-800: rgba(131, 0, 105, 1); + --color-pink-900: rgba(109, 0, 81, 1); + --color-pink-950: rgba(85, 0, 51, 1); + --color-pink-focus: rgba(201, 24, 171, 0.24); + --color-pink-focusvisible: rgba(201, 24, 171, 0.32); + --color-pink-hover: rgba(201, 24, 171, 0.12); + --color-pink-outlinedborder: rgba(201, 24, 171, 0.56); + --color-pink-selected: rgba(201, 24, 171, 0.16); + + --color-red-100: rgba(255, 223, 223, 1); + --color-red-200: rgba(255, 194, 194, 1); + --color-red-300: rgba(255, 168, 168, 1); + --color-red-400: rgba(255, 117, 117, 1); + --color-red-50: rgba(255, 245, 245, 1); + --color-red-500: rgba(255, 87, 87, 1); + --color-red-600: rgba(244, 47, 57, 1); + --color-red-700: rgba(228, 12, 44, 1); + --color-red-800: rgba(179, 9, 9, 1); + --color-red-900: rgba(137, 0, 0, 1); + --color-red-950: rgba(110, 0, 0, 1); + --color-red-focus: rgba(244, 47, 57, 0.24); + --color-red-focusvisible: rgba(244, 47, 57, 0.32); + --color-red-hover: rgba(244, 47, 57, 0.12); + --color-red-outlinedborder: rgba(244, 47, 57, 0.56); + --color-red-selected: rgba(244, 47, 57, 0.16); + + --color-teal-100: rgba(223, 246, 246, 1); + --color-teal-200: rgba(195, 240, 241, 1); + --color-teal-300: rgba(160, 229, 232, 1); + --color-teal-400: rgba(106, 220, 222, 1); + --color-teal-50: rgba(243, 252, 252, 1); + --color-teal-500: rgba(47, 208, 210, 1); + --color-teal-600: rgba(27, 189, 191, 1); + --color-teal-700: rgba(44, 158, 160, 1); + --color-teal-800: rgba(24, 116, 115, 1); + --color-teal-900: rgba(18, 85, 85, 1); + --color-teal-950: rgba(9, 61, 61, 1); + --color-teal-focus: rgba(27, 189, 191, 0.24); + --color-teal-focusvisible: rgba(27, 189, 191, 0.32); + --color-teal-hover: rgba(27, 189, 191, 0.12); + --color-teal-outlinedborder: rgba(27, 189, 191, 0.56); + --color-teal-selected: rgba(27, 189, 191, 0.16); + + --color-violet: var(--color-violet-500); + --color-violet-100: rgba(239, 224, 255, 1); + --color-violet-200: rgba(211, 183, 255, 1); + --color-violet-300: rgba(174, 130, 255, 1); + --color-violet-400: rgba(152, 96, 255, 1); + --color-violet-50: rgba(252, 249, 255, 1); + --color-violet-500: rgba(125, 46, 255, 1); + --color-violet-600: rgba(109, 0, 235, 1); + --color-violet-700: rgba(87, 0, 187, 1); + --color-violet-800: rgba(69, 0, 147, 1); + --color-violet-900: rgba(55, 0, 118, 1); + --color-violet-950: rgba(37, 0, 80, 1); + --color-violet-focus: rgba(125, 46, 255, 0.24); + --color-violet-focusvisible: rgba(125, 46, 255, 0.32); + --color-violet-hover: rgba(125, 46, 255, 0.12); + --color-violet-outlinedborder: rgba(125, 46, 255, 0.56); + --color-violet-selected: rgba(125, 46, 255, 0.16); + + --color-white-main: rgba(255, 255, 255, 1); + --color-yellow-100: rgba(255, 245, 219, 1); + --color-yellow-200: rgba(255, 241, 204, 1); + --color-yellow-300: rgba(255, 232, 173, 1); + --color-yellow-400: rgba(255, 218, 122, 1); + --color-yellow-50: rgba(255, 251, 240, 1); + --color-yellow-500: rgba(255, 204, 72, 1); + --color-yellow-600: rgba(248, 182, 15, 1); + --color-yellow-700: rgba(235, 156, 0, 1); + --color-yellow-800: rgba(184, 110, 0, 1); + --color-yellow-900: rgba(133, 73, 0, 1); + --color-yellow-950: rgba(100, 55, 0, 1); + --color-yellow-focus: rgba(235, 156, 0, 0.24); + --color-yellow-focusvisible: rgba(235, 156, 0, 0.32); + --color-yellow-hover: rgba(235, 156, 0, 0.12); + --color-yellow-outlinedborder: rgba(235, 156, 0, 0.56); + --color-yellow-selected: rgba(235, 156, 0, 0.16); +} diff --git a/assets/css/toc.css b/assets/css/toc.css deleted file mode 100644 index 91ff92d7cd99..000000000000 --- a/assets/css/toc.css +++ /dev/null @@ -1,14 +0,0 @@ -@layer components { - #TableOfContents { - .toc a { - @apply block max-w-full truncate py-1 pl-2 hover:font-medium hover:no-underline; - &[aria-current="true"], - &:hover { - @apply border-l-2 border-l-gray-light bg-gradient-to-r from-gray-light-100 font-medium text-black dark:border-l-gray-dark dark:from-gray-dark-200 dark:text-white; - } - &:not([aria-current="true"]) { - @apply text-gray-light-600 hover:text-black dark:text-gray-dark-700 dark:hover:text-white; - } - } - } -} diff --git a/assets/css/typography.css b/assets/css/typography.css deleted file mode 100644 index 008e7af70494..000000000000 --- a/assets/css/typography.css +++ /dev/null @@ -1,77 +0,0 @@ -@layer base { - - /* - * Font faces for Roboto Flex and Roboto Mono. - * - * - https://fonts.google.com/specimen/Roboto+Flex - * - https://fonts.google.com/specimen/Roboto+Mono - * - * The TTF fonts have been compressed to woff2, - * preserving the latin character subset. - * - * */ - - /* Roboto Flex */ - @font-face { - font-family: 'Roboto Flex'; - src: url('/assets/fonts/RobotoFlex.woff2') format('woff2'); - font-weight: 100 1000; /* Range of weights Roboto Flex supports */ - font-stretch: 100%; /* Range of width Roboto Flex supports */ - font-style: oblique 0deg 10deg; /* Range of oblique angle Roboto Flex supports */ - font-display: fallback; - } - - /* Roboto Mono */ - @font-face { - font-family: 'Roboto Mono'; - src: url('/assets/fonts/RobotoMono-Regular.woff2') format('woff2'); - font-weight: 100 700; /* Define the range of weight the variable font supports */ - font-style: normal; - font-display: fallback; - } - - /* Roboto Mono Italic */ - @font-face { - font-family: 'Roboto Mono'; - src: url('/assets/fonts/RobotoMono-Italic.woff2') format('woff2'); - font-weight: 100 700; /* Define the range of weight the variable font supports */ - font-style: italic; - font-display: fallback; - } - - .prose { - li { - @apply my-2; - > :last-child, - > :first-child { - margin: 0; - } - } - a { - font-weight: 400; - } - hr { - @apply mb-4 mt-8; - } - h1 { - @apply my-4 text-4xl; - line-height: 1.167; - } - h2 { - @apply mb-4 mt-8 text-3xl; - line-height: 1.2; - } - h3 { - @apply text-2xl; - line-height: 1.167; - } - h4 { - @apply text-xl; - line-height: 1.235; - } - h5 { - @apply text-lg; - line-height: 1.75; - } - } -} diff --git a/assets/css/utilities.css b/assets/css/utilities.css new file mode 100644 index 000000000000..5bd521f8f195 --- /dev/null +++ b/assets/css/utilities.css @@ -0,0 +1,242 @@ +@utility icon-svg { + svg { + font-size: 24px; + width: 1em; + height: 1em; + display: inline-block; + fill: currentColor; + } +} + +@utility icon-xs { + svg { + font-size: 12px; + } +} + +@utility icon-sm { + svg { + font-size: 16px; + } +} + +@utility icon-lg { + svg { + font-size: 32px; + } +} + +@utility text-primary-blue { + color: var(--color-primary-blue); +} + +@utility link { + @apply text-blue no-underline dark:text-blue-400; + font-weight: inherit; + &:hover { + @apply underline underline-offset-3; + } +} + +@utility invertible { + @apply dark:hue-rotate-180 dark:invert dark:filter; +} + +@utility bg-pattern-blue { + background-color: rgba(255, 255, 255, 0.5); + background-image: url("/assets/images/bg-pattern-blue.webp"); + background-blend-mode: overlay; + background-size: cover; + background-repeat: no-repeat; + .dark & { + background-color: rgba(0, 0, 0, 0.741); + } +} + +@utility bg-pattern-purple { + background-color: rgba(255, 255, 255, 0.5); + background-image: url("/assets/images/bg-pattern-purple.webp"); + background-blend-mode: overlay; + background-size: cover; + background-repeat: no-repeat; + .dark & { + background-color: rgba(0, 0, 0, 0.741); + } +} + +@utility bg-background-toc { + background-color: var(--color-navbar-bg); + .dark & { + background-color: var(--color-navbar-bg-dark); + } +} + +@utility bg-pattern-verde { + background-color: rgba(255, 255, 255, 0.5); + background-image: url("/assets/images/bg-pattern-verde.webp"); + background-blend-mode: overlay; + background-size: cover; + background-repeat: no-repeat; + .dark & { + background-color: rgba(0, 0, 0, 0.741); + } +} + +@utility icon-svg { + svg { + font-size: 24px; + width: 1em; + height: 1em; + display: inline-block; + fill: currentColor; + } +} + +@utility icon-xs { + svg { + font-size: 12px; + } +} + +@utility icon-sm { + svg { + font-size: 16px; + } +} + +@utility icon-lg { + svg { + font-size: 32px; + } +} + +@utility navbar-font { + font-size: var(--navbar-font-size); + color: var(--color-navbar-text); + .dark & { + color: var(--color-navbar-text-dark); + } +} + +@utility navbar-group-font-title { + font-size: var(--color-navbar-group-font-title-size); + @apply font-semibold uppercase; + color: var(--color-navbar-text); + .dark & { + color: var(--color-navbar-text-dark); + } +} + +@utility prose { + .highlight, + :not(pre) > code { + font-size: 0.875em; + border: 1px solid; + border-radius: 0.25rem; /* theme("spacing.1") fallback */ + background: var(--color-white-main); + border-color: var(--color-gray-300); + .dark & { + background: var(--color-gray-200); + border-color: var(--color-gray-400); + } + &::before, + &::after { + content: none !important; + } + } + + :not(pre) > code { + background: var(--color-gray-200); + display: inline-block; + margin: 0; + font-weight: 400; + overflow-wrap: anywhere; + padding: 0 4px; + } + + table:not(.lntable) code { + overflow-wrap: unset; + white-space: nowrap; + } + + /* Indented code blocks */ + pre:not(.chroma) { + @apply my-4 overflow-x-auto p-3; + font-size: 0.875em; + border: 1px solid; + border-radius: 0.25rem; /* theme("spacing.1") fallback */ + background: var(--color-white-main); + border-color: var(--color-gray-300); + .dark & { + background: var(--color-gray-200); + border-color: var(--color-gray-400); + } + } + + .highlight { + @apply my-4 overflow-x-auto p-3; + + /* LineTableTD */ + .lntd { + vertical-align: top; + padding: 0; + margin: 0; + font-weight: 400; + padding: 0 4px; + &:first-child { + width: 0; + } + } + + /* LineTableTD */ + .lntd { + vertical-align: top; + padding: 0; + margin: 0; + border: 0; + } + /* LineTable */ + .lntable { + display: table; + width: 100%; + border-spacing: 0; + padding: 0; + margin: 0; + border: 0; + /* LineNumberColumnHighlight */ + .lntd:first-child .hl { + display: block; + } + } + } +} + +@utility section-card { + @apply flex h-full flex-col gap-2 rounded-sm border p-4 drop-shadow-xs hover:drop-shadow-lg; + @apply text-gray dark:text-gray-200; + @apply border-gray-100 bg-gray-50 hover:border-gray-200 dark:border-gray-600 dark:bg-gray-900 hover:dark:border-gray-500; +} + +@utility section-card-text { + @apply leading-snug text-gray-800 dark:text-gray-200; +} +@utility section-card-title { + @apply text-xl font-semibold text-gray-900 dark:text-gray-100; +} + +@utility sub-button { + @apply flex w-full items-start gap-2 rounded-sm px-2 py-2 text-left text-gray-700 transition-colors hover:bg-gray-50 dark:text-gray-100 dark:hover:bg-gray-800; +} + +@utility toc { + a { + @apply block max-w-full truncate py-1 pl-2 hover:font-medium hover:no-underline; + &[aria-current="true"], + &:hover { + @apply border-l-2 border-x-gray-200 bg-gradient-to-r from-gray-50 font-medium text-black dark:border-l-gray-300 dark:from-gray-900 dark:text-white; + } + &:not([aria-current="true"]) { + @apply text-gray-600 hover:text-black dark:text-gray-100 dark:hover:text-white; + } + } +} diff --git a/assets/icons/AppleMac.svg b/assets/icons/AppleMac.svg new file mode 100644 index 000000000000..b218d8cdcafd --- /dev/null +++ b/assets/icons/AppleMac.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/assets/icons/Compose.svg b/assets/icons/Compose.svg similarity index 100% rename from static/assets/icons/Compose.svg rename to assets/icons/Compose.svg diff --git a/assets/icons/Linux.svg b/assets/icons/Linux.svg new file mode 100644 index 000000000000..55554f63b637 --- /dev/null +++ b/assets/icons/Linux.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/assets/icons/Scout.svg b/assets/icons/Scout.svg similarity index 100% rename from static/assets/icons/Scout.svg rename to assets/icons/Scout.svg diff --git a/static/assets/icons/Testcontainers.svg b/assets/icons/Testcontainers.svg similarity index 100% rename from static/assets/icons/Testcontainers.svg rename to assets/icons/Testcontainers.svg diff --git a/static/assets/icons/Whale.svg b/assets/icons/Whale.svg similarity index 100% rename from static/assets/icons/Whale.svg rename to assets/icons/Whale.svg diff --git a/assets/icons/Windows.svg b/assets/icons/Windows.svg new file mode 100644 index 000000000000..7244da36d971 --- /dev/null +++ b/assets/icons/Windows.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/assets/icons/go.svg b/assets/icons/go.svg similarity index 100% rename from static/assets/icons/go.svg rename to assets/icons/go.svg diff --git a/static/assets/icons/java.svg b/assets/icons/java.svg similarity index 100% rename from static/assets/icons/java.svg rename to assets/icons/java.svg diff --git a/static/assets/images/logo-build-cloud.svg b/assets/icons/logo-build-cloud.svg similarity index 100% rename from static/assets/images/logo-build-cloud.svg rename to assets/icons/logo-build-cloud.svg diff --git a/assets/icons/toolbox.svg b/assets/icons/toolbox.svg new file mode 100644 index 000000000000..ef4c016dc5c0 --- /dev/null +++ b/assets/icons/toolbox.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/theme/icons/edit.svg b/assets/theme/icons/edit.svg new file mode 100644 index 000000000000..2ee5ec5d2be3 --- /dev/null +++ b/assets/theme/icons/edit.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/theme/icons/issue.svg b/assets/theme/icons/issue.svg new file mode 100644 index 000000000000..eef2863fdf56 --- /dev/null +++ b/assets/theme/icons/issue.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/content/get-started/get-docker.md b/content/get-started/get-docker.md index 17217e7654fc..b34af06fa7b1 100644 --- a/content/get-started/get-docker.md +++ b/content/get-started/get-docker.md @@ -31,27 +31,25 @@ section and choose the best installation path for you. > employees OR more than $10 million USD in annual revenue) requires a [paid > subscription](https://www.docker.com/pricing/). +
{{< card title="Docker Desktop for Mac" description="A native application using the macOS sandbox security model that delivers all Docker tools to your Mac." link="/desktop/setup/install/mac-install/" - icon="/assets/images/apple_48.svg" >}} - -
+ icon="/icons/AppleMac.svg" >}} {{< card title="Docker Desktop for Windows" description="A native Windows application that delivers all Docker tools to your Windows computer." link="/desktop/setup/install/windows-install/" - icon="/assets/images/windows_48.svg" >}} - -
+ icon="/icons/Windows.svg" >}} {{< card title="Docker Desktop for Linux" description="A native Linux application that delivers all Docker tools to your Linux computer." link="/desktop/setup/install/linux/" - icon="/assets/images/linux_48.svg" >}} + icon="/icons/Linux.svg" >}} +
> [!NOTE] > diff --git a/content/get-started/introduction/get-docker-desktop.md b/content/get-started/introduction/get-docker-desktop.md index 123c0ef1cefe..7bb25be36e60 100644 --- a/content/get-started/introduction/get-docker-desktop.md +++ b/content/get-started/introduction/get-docker-desktop.md @@ -29,21 +29,18 @@ This guide will walk you through the installation process, enabling you to exper {{< card title="Docker Desktop for Mac" description="[Download (Apple Silicon)](https://desktop.docker.com/mac/main/arm64/Docker.dmg?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-mac-arm64) | [Download (Intel)](https://desktop.docker.com/mac/main/amd64/Docker.dmg?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-mac-amd64) | [Install instructions](/desktop/setup/install/mac-install)" - icon="/assets/images/apple_48.svg" >}} - -
+ icon="/icons/AppleMac.svg" >}} {{< card title="Docker Desktop for Windows" description="[Download](https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-windows) | [Install instructions](/desktop/setup/install/windows-install)" - icon="/assets/images/windows_48.svg" >}} - -
+ icon="/icons/Windows.svg" >}} {{< card title="Docker Desktop for Linux" description="[Install instructions](/desktop/setup/install/linux/)" - icon="/assets/images/linux_48.svg" >}} + icon="/icons/Linux.svg" >}} + Once it's installed, complete the setup process and you're all set to run a Docker container. @@ -94,4 +91,3 @@ Docker Desktop simplifies container management for developers by streamlining th Now that you have Docker Desktop installed and ran your first container, it's time to start developing with containers. {{< button text="Develop with containers" url="develop-with-containers" >}} - diff --git a/content/manuals/_index.md b/content/manuals/_index.md index 558924bf1067..16007f912b4b 100644 --- a/content/manuals/_index.md +++ b/content/manuals/_index.md @@ -25,11 +25,11 @@ params: link: /engine/ - title: Docker Compose description: Define and run multi-container applications. - icon: /assets/icons/Compose.svg + icon: /icons/Compose.svg link: /compose/ - title: Testcontainers description: Run containers programmatically in your preferred programming language. - icon: /assets/icons/Testcontainers.svg + icon: /icons/Testcontainers.svg link: /testcontainers/ ai: - title: Ask Gordon @@ -47,11 +47,11 @@ params: products: - title: Docker Desktop description: Your command center for container development. - icon: /assets/icons/Whale.svg + icon: /icons/Whale.svg link: /desktop/ - title: Build Cloud description: Build your images faster in the cloud. - icon: /assets/images/logo-build-cloud.svg + icon: /icons/logo-build-cloud.svg link: /build-cloud/ - title: Docker Hub description: Discover, share, and integrate container images. @@ -59,7 +59,7 @@ params: link: /docker-hub/ - title: Docker Scout description: Image analysis and policy evaluation. - icon: /assets/icons/Scout.svg + icon: /icons/Scout.svg link: /scout/ - title: Docker for GitHub Copilot description: Integrate Docker's capabilities with GitHub Copilot. diff --git a/content/manuals/ai/mcp-catalog-and-toolkit/toolkit.md b/content/manuals/ai/mcp-catalog-and-toolkit/toolkit.md index 3af9971dbab9..5fbc0208f45b 100644 --- a/content/manuals/ai/mcp-catalog-and-toolkit/toolkit.md +++ b/content/manuals/ai/mcp-catalog-and-toolkit/toolkit.md @@ -50,4 +50,4 @@ The following example assumes you have already installed and set up Claude Deskt Take a screenshot of docs.docker.com and then invert the colors ``` -Once you've given your consent to use the new tools, Claude spins up the Puppeteer MCP server inside a container, navigates to the target URL, captures and modify the page, and returns the screenshot. \ No newline at end of file +Once you've given your consent to use the new tools, Claude spins up the Puppeteer MCP server inside a container, navigates to the target URL, captures and modify the page, and returns the screenshot. diff --git a/content/manuals/ai/model-runner.md b/content/manuals/ai/model-runner.md index 680c87fec5a0..7ef5f376793b 100644 --- a/content/manuals/ai/model-runner.md +++ b/content/manuals/ai/model-runner.md @@ -32,6 +32,8 @@ Models are pulled from Docker Hub the first time they're used and stored locally ## Enable Docker Model Runner +### Enable DMR in Docker Desktop + 1. Navigate to the **Features in development** tab in settings. 2. Under the **Experimental features** tab, select **Access experimental features**. 3. Select **Apply and restart**. @@ -42,6 +44,15 @@ Models are pulled from Docker Hub the first time they're used and stored locally You can now use the `docker model` command in the CLI and view and interact with your local models in the **Models** tab in the Docker Desktop Dashboard. +### Enable DMR in Docker Engine + +1. Ensure you have installed [Docker Engine](/engine/install/). +2. DMR is available as a package. To install it, run: + + ```console + apt install docker-model-plugin + ``` + ## Available commands ### Model runner status diff --git a/content/manuals/testcontainers.md b/content/manuals/testcontainers.md index 73b538a27506..52a5c26560dd 100644 --- a/content/manuals/testcontainers.md +++ b/content/manuals/testcontainers.md @@ -18,11 +18,11 @@ intro: quickstart: - title: Testcontainers for Go description: A Go package that makes it simple to create and clean up container-based dependencies for automated integration/smoke tests. - icon: /assets/icons/go.svg + icon: /icons/go.svg link: https://golang.testcontainers.org/quickstart/ - title: Testcontainers for Java description: A Java library that supports JUnit tests, providing lightweight, throwaway instances of anything that can run in a Docker container. - icon: /assets/icons/java.svg + icon: /icons/java.svg link: https://java.testcontainers.org/ --- diff --git a/hugo.yaml b/hugo.yaml index 3677727b3179..7bc30bdc40fe 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -46,8 +46,8 @@ build: disableTags: true # Ensure that CSS/assets changes trigger a dev server rebuild cachebusters: - - source: assets/watching/hugo_stats\.json - target: styles\.css + - source: assets/notwatching/hugo_stats\.json + target: css - source: (postcss|tailwind)\.config\.js target: css - source: assets/.*\.js @@ -278,8 +278,9 @@ module: - source: assets target: assets # Mount hugo_stats.json to the assets dir to trigger cachebust - - source: hugo_stats.json - target: assets/watching/hugo_stats.json + - disableWatch: true + source: hugo_stats.json + target: assets/notwatching/hugo_stats.json # Mount the icon files to assets so we can access them with resources.Get - source: node_modules/@material-symbols/svg-400/rounded target: assets/icons diff --git a/hugo_stats.json b/hugo_stats.json index 357cc9d7dc6d..aa5f14ad77d1 100644 --- a/hugo_stats.json +++ b/hugo_stats.json @@ -5,10 +5,8 @@ "!mt-0", "--mount", "--tmpfs", - "-mb-3", "-mr-8", "-mt-0.5", - "-mt-4", "-mt-8", "-top-16", "-v", @@ -133,126 +131,143 @@ "Without-systemd", "[display:none]", "absolute", + "admonition", + "admonition-content", + "admonition-danger", + "admonition-header", + "admonition-icon", + "admonition-note", + "admonition-tip", + "admonition-title", + "admonition-warning", "aspect-video", "bake-action", - "bg-amber-light", + "bg-amber-500", "bg-background-light", + "bg-background-toc", "bg-black/50", "bg-black/70", - "bg-blue-light", - "bg-blue-light-400", - "bg-blue-light-500", - "bg-cover", + "bg-blue", + "bg-blue-400", + "bg-blue-500", "bg-gradient-to-br", "bg-gradient-to-r", - "bg-gradient-to-t", - "bg-gray-light-100", - "bg-gray-light-200", - "bg-gray-light-400", - "bg-gray-light-700", - "bg-green-light", - "bg-green-light-400", - "bg-opacity-75", + "bg-gray-00", + "bg-gray-100", + "bg-gray-200", + "bg-gray-400", + "bg-gray-50", + "bg-gray-700", + "bg-green-400", + "bg-green-500", + "bg-navbar-bg", "bg-pattern-blue", "bg-pattern-purple", "bg-pattern-verde", - "bg-red-light", + "bg-red-500", "bg-transparent", - "bg-violet-light", + "bg-violet-500", "bg-white", "bg-white/10", "block", "border", "border-0", - "border-amber-light", "border-b", "border-b-4", - "border-blue-light", - "border-blue-light-500", + "border-blue", "border-divider-light", - "border-gray-light-100", - "border-gray-light-200", - "border-gray-light-400", - "border-green-light", - "border-green-light-400", + "border-gray-200", + "border-gray-300", + "border-gray-400", + "border-gray-600", + "border-green-400", "border-l-2", - "border-l-4", "border-l-magenta-light", - "border-red-light", "border-transparent", - "border-violet-light", "border-white", "bottom-0", "build-push-action", + "card", + "card-content", + "card-description", + "card-header", + "card-icon", + "card-img", + "card-link", + "card-title", "chroma", + "cls-1", + "cls-2", "col-start-2", "containerd-image-store", "cursor-pointer", - "dark:bg-amber-dark", + "dark:bg-amber-300", "dark:bg-background-dark", - "dark:bg-blue-dark", - "dark:bg-blue-dark-400", - "dark:bg-gray-dark-100", - "dark:bg-gray-dark-200", - "dark:bg-gray-dark-300", - "dark:bg-gray-dark-400", - "dark:bg-green-dark", + "dark:bg-background-toc", + "dark:bg-blue", + "dark:bg-blue-300", + "dark:bg-blue-400", + "dark:bg-blue-500", + "dark:bg-blue-800", + "dark:bg-gray-300", + "dark:bg-gray-400", + "dark:bg-gray-500", + "dark:bg-gray-800", + "dark:bg-gray-900", + "dark:bg-gray-950", + "dark:bg-green-300", + "dark:bg-green-700", "dark:bg-green-dark-400", - "dark:bg-opacity-75", - "dark:bg-red-dark", - "dark:bg-violet-dark", + "dark:bg-navbar-bg-dark", + "dark:bg-red-300", + "dark:bg-violet-300", + "dark:bg-violet-400", "dark:block", - "dark:border-amber-dark", - "dark:border-b-blue-dark-600", - "dark:border-blue-dark", + "dark:border-b-blue-600", "dark:border-divider-dark", - "dark:border-gray-dark-200", - "dark:border-gray-dark-400", - "dark:border-green-dark", - "dark:border-green-dark-400", + "dark:border-gray-100", + "dark:border-gray-400", + "dark:border-gray-50", + "dark:border-gray-700", + "dark:border-green-400", "dark:border-l-magenta-dark", - "dark:border-red-dark", - "dark:border-violet-dark", - "dark:fill-blue-dark", - "dark:focus:ring-blue-dark", - "dark:from-background-dark", - "dark:from-blue-dark-200", - "dark:from-blue-dark-400", - "dark:from-gray-dark-100", + "dark:fill-blue-300", + "dark:focus:ring-3-blue-dark", + "dark:from-blue-300", + "dark:from-blue-600", "dark:hidden", - "dark:hover:bg-blue-dark", - "dark:hover:bg-blue-dark-500", - "dark:hover:bg-gray-dark-200", - "dark:hover:bg-gray-dark-400", - "dark:hover:bg-gray-dark-500", - "dark:hover:text-blue-dark", + "dark:hover:bg-blue-400", + "dark:hover:bg-blue-500", + "dark:hover:bg-blue-700", + "dark:hover:bg-gray-500", + "dark:hover:bg-gray-800", + "dark:hover:bg-gray-900", + "dark:hover:text-blue", "dark:prose-invert", - "dark:ring-blue-dark-400", - "dark:ring-gray-dark-400", + "dark:ring-3-blue-dark-400", + "dark:ring-3-gray-dark-400", "dark:syntax-dark", - "dark:text-amber-dark", - "dark:text-blue-dark", + "dark:text-blue", + "dark:text-blue-700", "dark:text-divider-dark", - "dark:text-gray-dark", - "dark:text-gray-dark-300", - "dark:text-gray-dark-500", - "dark:text-gray-dark-600", - "dark:text-gray-dark-700", - "dark:text-gray-dark-800", - "dark:text-green-dark", + "dark:text-gray", + "dark:text-gray-100", + "dark:text-gray-200", + "dark:text-gray-300", + "dark:text-gray-400", + "dark:text-gray-500", + "dark:text-gray-900", "dark:text-magenta-dark", - "dark:text-red-dark", - "dark:text-violet-dark", "dark:text-white", - "dark:to-background-dark", - "dark:to-blue-dark-100", - "dark:to-magenta-dark-400", + "dark:to-blue-400", + "dark:to-blue-500", "docker/bake-action", "docker/build-push-action", + "download-links", + "download-links-subcontainer", "drop-shadow", - "drop-shadow-sm", "duration-300", - "fill-blue-light", + "fill-blue", "fixed", "flex", "flex-1", @@ -260,21 +275,19 @@ "flex-col", "flex-col-reverse", "flex-grow", - "flex-grow-0", "flex-none", "flex-shrink", "flex-wrap", - "focus:ring-blue-light", + "focus:ring-3-blue-light", "font-bold", "font-medium", "font-semibold", "footnote-backref", "footnote-ref", "footnotes", - "from-20%", - "from-background-light", - "from-blue-light-400", - "from-blue-light-600", + "from-blue-400", + "from-blue-600", + "gap-0", "gap-1", "gap-10", "gap-12", @@ -282,7 +295,6 @@ "gap-20", "gap-3", "gap-4", - "gap-6", "gap-8", "goat", "grid", @@ -305,20 +317,23 @@ "hidden", "hidden'", "highlight", - "hover:bg-blue-light-400", - "hover:bg-gray-light-100", - "hover:bg-gray-light-200", - "hover:bg-gray-light-300", + "hover:bg-blue", + "hover:bg-blue-400", + "hover:bg-blue-500", + "hover:bg-gray-100", + "hover:bg-gray-200", + "hover:bg-gray-300", + "hover:bg-gray-50", "hover:bg-white/20", - "hover:border-gray-light-200", "hover:border-white/20", - "hover:dark:bg-gray-dark-200", - "hover:dark:bg-gray-dark-300", - "hover:dark:border-gray-dark", - "hover:dark:text-blue-dark", - "hover:drop-shadow-lg", + "hover:dark:bg-blue-500", + "hover:dark:bg-gray-300", + "hover:dark:bg-gray-700", + "hover:dark:bg-gray-800", + "hover:dark:text-blue-400", + "hover:dark:text-blue-700", "hover:opacity-90", - "hover:text-blue-light", + "hover:text-blue", "hover:text-white", "hover:underline", "icon-lg", @@ -364,13 +379,14 @@ "max-w-56", "max-w-[1920px]", "max-w-[840px]", - "max-w-fit", "max-w-full", "max-w-none", "max-w-xl", "mb-1", "mb-2", + "mb-3", "mb-4", + "mb-6", "mb-8", "md-dropdown", "md:block", @@ -404,9 +420,10 @@ "mt-[2px]", "mx-auto", "my-0", - "my-1", "my-4", "my-6", + "navbar-font", + "navbar-group-font-title", "no-underline", "no-wrap", "not-prose", @@ -416,7 +433,7 @@ "origin-bottom-right", "origin-top-right", "ot-sdk-show-settings", - "outline-none", + "outline-hidden", "overflow-clip", "overflow-hidden", "overflow-x-auto", @@ -447,6 +464,7 @@ "pt-10", "pt-2", "pt-4", + "pt-5", "px-1", "px-2", "px-4", @@ -460,20 +478,22 @@ "right-0", "right-3", "right-8", - "ring-2", - "ring-[1.5px]", - "ring-blue-light-400", - "ring-gray-light-200", + "ring-3-2", + "ring-3-[1.5px]", + "ring-3-blue-light-400", + "ring-3-gray-light-200", "rotate-45", - "rounded", - "rounded-[6px]", - "rounded-b-lg", "rounded-full", "rounded-sm", + "rounded-sm-b-lg", "scale-50", "scale-75", + "scroll-mt-2", "scroll-mt-20", "scroll-mt-36", + "section-card", + "section-card-text", + "section-card-title", "select-none", "self-center", "self-start", @@ -490,38 +510,34 @@ "space-y-2", "space-y-4", "sticky", + "sub-button", + "summary-bar", + "svg", "svg-container", "syntax-light", "systemd-networkd", "text-2xl", - "text-amber-light", "text-base", "text-black", + "text-blue", "text-blue-light", "text-divider-light", - "text-gray-light", - "text-gray-light-200", - "text-gray-light-300", - "text-gray-light-500", - "text-gray-light-600", - "text-gray-light-800", - "text-green-light", + "text-gray", + "text-gray-100", + "text-gray-200", + "text-gray-400", + "text-gray-600", + "text-gray-800", "text-left", "text-lg", "text-magenta-light", - "text-red-light", "text-sm", - "text-violet-light", "text-white", "text-xl", "text-xs", - "to-30%", "to-50%", - "to-75%", - "to-blue-light", - "to-magenta-light-400", - "to-transparent", - "to-white", + "to-blue-200", + "to-blue-500", "toc", "top-0", "top-16", @@ -533,12 +549,10 @@ "transition-transform", "truncate", "underline-offset-2", - "uppercase", "w-2", "w-56", "w-8", "w-[1200px]", - "w-[32px]", "w-fit", "w-full", "w-screen", diff --git a/layouts/_default/_markup/render-blockquote.html b/layouts/_default/_markup/render-blockquote.html index e82786d5e5f2..3d3a6e60cea6 100644 --- a/layouts/_default/_markup/render-blockquote.html +++ b/layouts/_default/_markup/render-blockquote.html @@ -1,41 +1,42 @@ {{- $icons := dict - "caution" "dangerous" - "important" "report" - "note" "info" - "tip" "lightbulb" - "warning" "warning" + "caution" "warning.svg" + "important" "important.svg" + "note" "info.svg" + "tip" "lightbulb.svg" + "warning" "warning.svg" }} -{{- $borders := dict - "caution" "border-red-light dark:border-red-dark" - "important" "border-violet-light dark:border-violet-dark" - "note" "border-blue-light dark:border-blue-dark" - "tip" "border-green-light dark:border-green-dark" - "warning" "border-amber-light dark:border-amber-dark" -}} -{{- $textColors := dict - "caution" "text-red-light dark:text-red-dark" - "important" "text-violet-light dark:text-violet-dark" - "note" "text-blue-light dark:text-blue-dark" - "tip" "text-green-light dark:text-green-dark" - "warning" "text-amber-light dark:text-amber-dark" +{{- $admonitionClasses := dict + "caution" "admonition admonition-danger" + "important" "admonition admonition-note" + "note" "admonition admonition-note" + "tip" "admonition admonition-tip" + "warning" "admonition admonition-warning" }} +{{- $type := cond (index $icons .AlertType) .AlertType "note" }} +{{- $iconFile := index $icons $type }} +{{- $partial := printf "admonitions/icons/%s" $iconFile }} + {{ if eq .Type "alert" }}
-

- {{ $i := index $icons .AlertType }} - {{ partialCached "icon.html" $i $i }} + class="{{ index $admonitionClasses .AlertType }} admonition not-prose"> +

+ + {{- partialCached $partial . }} + + + {{ printf "%s%s" (upper (substr $.AlertType 0 1)) (substr $.AlertType 1) }} - {{ i18n .AlertType }} -

- {{ .Text | safeHTML }} +
+
+ {{ .Text | safeHTML }} +
{{ else }}
- {{ .Text | safeHTML }} + class="admonition not-prose"> + {{ .Text | safeHTML }}
{{ end }} diff --git a/layouts/_default/_markup/render-codeblock.html b/layouts/_default/_markup/render-codeblock.html index ce6e243cb48e..6ad360ef6e37 100644 --- a/layouts/_default/_markup/render-codeblock.html +++ b/layouts/_default/_markup/render-codeblock.html @@ -1,38 +1,65 @@ -
+
{{ with .Attributes.title }} -
{{ . }}
+
+ {{ . }} +
{{ end }}
- - {{ $lang := .Type | default "text" }} {{ $result := transform.Highlight .Inner - $lang .Options }} -
+ {{ $lang := .Type | default "text" }} + {{ $result := transform.Highlight .Inner + $lang .Options + }} +
{{ with .Attributes.collapse }} -
-
- -
-
- {{ $result }} - +
+
+ +
+
+ {{ $result }} + +
-
{{ else }} {{ $result }} {{ end }} diff --git a/layouts/_default/_markup/render-image.html b/layouts/_default/_markup/render-image.html index 7fd16e10d12c..d915d3a8082a 100644 --- a/layouts/_default/_markup/render-image.html +++ b/layouts/_default/_markup/render-image.html @@ -14,6 +14,7 @@ {{ $height := $params.Get "h" }} {{ $border := $params.Has "border" }} +
{{ with .Title }} -
{{ . }}
+
{{ . }}
{{ end }}