From 5adf39c2af1ec8c79cf63d33e6670f32c99910d6 Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Mon, 23 Oct 2023 15:20:54 -0700 Subject: [PATCH 001/140] Edit pass for consistency (#307) * Formatting * Update _implementors/features.md Co-authored-by: Samruddhi Khandale * Add Slack link * Update _implementors/spec.md Co-authored-by: Samruddhi Khandale --------- Co-authored-by: bamurtaugh Co-authored-by: Samruddhi Khandale --- _implementors/contributing.md | 2 +- _implementors/features-distribution.md | 6 +- _implementors/features.md | 20 +++---- _implementors/reference.md | 20 ++++--- _implementors/spec.md | 40 ++++++------- _implementors/templates-distribution.md | 4 +- _implementors/templates.md | 2 +- collections.html | 16 +++-- features.html | 31 +++++----- index.html | 80 +++++++++++++++---------- overview.md | 6 +- supporting.md | 29 ++++----- 12 files changed, 139 insertions(+), 117 deletions(-) diff --git a/_implementors/contributing.md b/_implementors/contributing.md index af94fa40..425a959a 100644 --- a/_implementors/contributing.md +++ b/_implementors/contributing.md @@ -6,7 +6,7 @@ author: Microsoft index: 9 --- -We're excited for your contributions to the Dev Container Specification! This document outlines how you can get involved. +We're excited for your contributions to the Dev Container Specification! This document outlines how you can get involved. We also welcome you to join our [community Slack channel](https://aka.ms/dev-container-community). ## Contribution approaches diff --git a/_implementors/features-distribution.md b/_implementors/features-distribution.md index e7d7d353..04db312e 100644 --- a/_implementors/features-distribution.md +++ b/_implementors/features-distribution.md @@ -8,7 +8,7 @@ index: 6 **TL;DR Check out the [quick start repository](https://github.com/devcontainers/feature-template) to get started on distributing your own Dev Container Features.** -This specification defines a pattern where community members and organizations can author and self-publish [Dev Container 'Features'](../features). +This specification defines a pattern where community members and organizations can author and self-publish [Dev Container Features](../features). Goals include: @@ -89,7 +89,7 @@ Each Features's `devcontainer-feature.json` metadata file is appended into the ` There are several supported ways to distribute Features. Distribution is handled by the implementing packaging tool such as the [Dev Container CLI](https://github.com/devcontainers/cli) or [Dev Container Publish GitHub Action](https://github.com/marketplace/actions/dev-container-publish). See the [quick start repository](https://github.com/devcontainers/feature-template) for a full working example. -A user references a distributed Feature in a `devcontainer.json` as defined in ['referencing a feature'](../features#referencing-a-feature). +A user references a distributed Feature in a `devcontainer.json` as defined in ['referencing a Feature'](../features#referencing-a-feature). ### OCI Registry @@ -151,7 +151,7 @@ Additional constraints exists when including local Features in a project: * The project must have a `.devcontainer/` folder at the root of the [**project workspace folder**](/implementors/spec/#project-workspace-folder). -* A local Feature's source code **must** be contained within a sub-folder of the `.devcontainer/ folder`. +* A local Feature's source code **must** be contained within a sub-folder of the `.devcontainer/` folder. * The sub-folder name **must** match the Feature's `id` field. diff --git a/_implementors/features.md b/_implementors/features.md index e7b62174..cab5379d 100644 --- a/_implementors/features.md +++ b/_implementors/features.md @@ -6,13 +6,13 @@ author: Microsoft index: 5 --- -Development container "Features" are self-contained, shareable units of installation code and development container configuration. The name comes from the idea that referencing one of them allows you to quickly and easily add more tooling, runtime, or library "Features" into your development container for you or your collaborators to use. +**Development Container Features** are self-contained, shareable units of installation code and development container configuration. The name comes from the idea that referencing one of them allows you to quickly and easily add more tooling, runtime, or library "features" into your development container for you or your collaborators to use. Feature metadata is captured by a `devcontainer-feature.json` file in the root folder of the feature. > **Note:** While Features may be installed on top of any base image, the implementation of a Feature might restrict it to a subset of possible base images. For example, some Features may be authored to work with a certain Linux distro (e.g. debian-based images that use the `apt` package manager). > -> This section covers details on the Features specification. If you are looking for summarized information on creating your own Features, check out the [quick start](https://github.com/devcontainers/feature-starter) and [core Features](https://github.com/devcontainers/features) repositories. +> This page covers details on the Features specification. If you are looking for summarized information on creating your own Features, check out the [quick start](https://github.com/devcontainers/feature-starter) and [core Features](https://github.com/devcontainers/features) repositories. ## Folder Structure @@ -72,7 +72,7 @@ The following lifecycle hooks may be declared as properties of `devcontainer-fea | `postAttachCommand` | [string, array, object](/implementors/json_reference#formatting-string-vs-array-properties) | {: .table .table-bordered .table-responsive} -#### Behavior +#### Behavior Each property mirrors the behavior of the matching property in [`devcontainer.json`](/implementors/json_reference#Lifecycle-scripts), including the behavior that commands are executed from the context of the [project workspace folder](/implementors/spec/#project-workspace-folder). @@ -80,7 +80,7 @@ For each lifecycle hook (in [Feature installation order](/implementors/features/ If a Feature provides a given command with the [object syntax](/implementors/json_reference#formatting-string-vs-array-properties), all commands within that group are executed in parallel, but still blocking commands from subsequent Features and/or the `devcontainer.json`. -> NOTE: These properties are stored within [image metadata](/implementors/spec/#merge-logic). +> **Note**: These properties are stored within [image metadata](/implementors/spec/#merge-logic). ### The `options` property @@ -117,11 +117,11 @@ Feature scripts run as the `root` user and sometimes need to know which user acc Additionally, the home folders of the two users are passed to the Feature scripts as `_REMOTE_USER_HOME` and `_CONTAINER_USER_HOME` environment variables. -The container user can be set with `containerUser` in the devcontainer.json and image metadata, `user` in the docker-compose.yml, `USER` in the Dockerfile, and can be passed down from the base image. +The container user can be set with `containerUser` in the `devcontainer.json` and image metadata, `user` in the `docker-compose.yml`, `USER` in the Dockerfile, and can be passed down from the base image. ### Dev Container ID -An identifier will be referred to as `${devcontainerId}` in the devcontainer.json and the Feature metadata and that will be replaced with the dev container's id. It should only be used in parts of the configuration and metadata that is not used for building the image because that would otherwise prevent pre-building the image at a time when the dev container's id is not known yet. Excluding boolean, numbers and enum properties the properties supporting `${devcontainerId}` in the Feature metadata are: `entrypoint`, `mounts`, `customizations`. +An identifier will be referred to as `${devcontainerId}` in the `devcontainer.json` and the Feature metadata and that will be replaced with the dev container's id. It should only be used in parts of the configuration and metadata that is not used for building the image because that would otherwise prevent pre-building the image at a time when the dev container's id is not known yet. Excluding boolean, numbers and enum properties the properties supporting `${devcontainerId}` in the Feature metadata are: `entrypoint`, `mounts`, `customizations`. Implementations can choose how to compute this identifier. They must ensure that it is unique among other dev containers on the same Docker host and that it is stable across rebuilds of dev containers. The identifier must only contain alphanumeric characters. We describe a way to do this below. @@ -218,7 +218,7 @@ As a shorthand, the value of the `features` property can be provided as a single } ``` -### Referencing a feature +### Referencing a Feature The `id` format specified dicates how a supporting tool will locate and download a given feature. `id` is one of the following: @@ -251,7 +251,7 @@ If the Feature is included in a folder as part of the repository that contains ` ## Release -_For information on distributing Features, see [the dev container Features distribution page](../features-distribution)._ +_For information on distributing Features, see the [Features distribution page](../features-distribution)._ ## Execution @@ -313,11 +313,11 @@ After `overrideFeatureInstallOrder` is resolved, any remaining Features that dec ### Option Resolution -A Feature's 'options' - specified as the value of a single Feature key/value pair in the user's `devcontainer.json` - are passed to the Feature as environment variables. +A Feature's `options` - specified as the value of a single Feature key/value pair in the user's `devcontainer.json` - are passed to the Feature as environment variables. A supporting tool will parse the `options` object provided by the user. If a value is provided for a Feature, it will be emitted to a file named `devcontainer-features.env` following the format `=`. -To ensure a option that is valid as an environment variable, the follow substitutions are performed. +To ensure a option that is valid as an environment variable, the follow substitutions are performed: ```javascript (str: string) => str diff --git a/_implementors/reference.md b/_implementors/reference.md index 3c43c914..512b44be 100644 --- a/_implementors/reference.md +++ b/_implementors/reference.md @@ -6,18 +6,18 @@ author: Microsoft index: 2 --- -The reference implementation for the specification is available through a [development container CLI](https://github.com/devcontainers/cli). This CLI can take a devcontainer.json and create and configure a dev container from it. +The reference implementation for the specification is available through a [development container CLI](https://github.com/devcontainers/cli). This CLI can take a `devcontainer.json` and create and configure a dev container from it. -## What is the dev container CLI? -When tools like VS Code and Codespaces detect a devcontainer.json file in a user's project, they use a CLI to configure a dev container. We've now opened up this CLI as a reference implementation so that individual users and other tools can read in devcontainer.json metadata and create dev containers from it. +## What is the Dev Container CLI? +When tools like VS Code and Codespaces detect a `devcontainer.json` file in a user's project, they use a CLI to configure a dev container. We've now opened up this CLI as a reference implementation so that individual users and other tools can read in `devcontainer.json` metadata and create dev containers from it. This CLI can either be used directly or integrated into product experiences, similar to how it's integrated with Dev Containers and Codespaces today. It currently supports both a simple single container option and integrates with [Docker Compose](https://docs.docker.com/compose/) for multi-container scenarios. -The CLI is available for review in a new [devcontainers/cli](https://github.com/devcontainers/cli) repository, and you can read more about its development in [this issue](https://github.com/devcontainers/spec/issues/9) in the spec repo. +The CLI is available in the [devcontainers/cli](https://github.com/devcontainers/cli) repository. ## How can I try it? -We'd love for you to try out the dev container CLI and let us know what you think. You can quickly try it out in just a few simple steps, either by installing its npm package or building the CLI repo from sources. +We'd love for you to try out the Dev Container CLI and let us know what you think. You can quickly try it out in just a few simple steps, either by installing its npm package or building the CLI repo from sources. You may learn more about building from sources in the [CLI repo's README](https://github.com/devcontainers/cli#try-it-out). On this page, we'll focus on using the npm package. @@ -97,7 +97,7 @@ Hello, VS Code Remote - Containers! {"outcome":"success"} ``` -Congrats, you've just run the dev container CLI and seen it in action! +Congrats, you've just run the Dev Container CLI and seen it in action! These steps are also provided in the CLI repo's [README](https://github.com/devcontainers/cli/blob/main/README.md). You may also review frequently asked questions [here](https://github.com/devcontainers/spec/issues/31). @@ -110,13 +110,15 @@ We recommend using the [Dev Container CLI](#npm-install) (or other spec supporti devcontainer build --workspace-folder . --push true --image-name : ``` +You can also check out our [in-depth guide on prebuilds](/_posts/2023-08-22-prebuild.md). + #### Metadata in image labels You can include Dev Container configuration and Feature metadata in prebuilt images via [image labels](https://docs.docker.com/config/labels-custom-metadata/). This makes the image self-contained since these settings are automatically picked up when the image is referenced - whether directly, in a `FROM` in a referenced Dockerfile, or in a Docker Compose file. This helps prevent your Dev Container config and image contents from getting out of sync, and allows you to push updates of the same configuration to multiple repositories through a simple image reference. -This metadata label is **automatically added** when you pre-build using the [Dev Container CLI](#npm-install) (or other spec supporting utilities like the [GitHub Action](https://github.com/marketplace/actions/devcontainers-ci) or [Azure DevOps task](https://marketplace.visualstudio.com/items?itemName=devcontainers.ci)) and includes settings from devcontainer.json and any referenced Dev Container Features. +This metadata label is **automatically added** when you pre-build using the [Dev Container CLI](#npm-install) (or other spec supporting utilities like the [GitHub Action](https://github.com/marketplace/actions/devcontainers-ci) or [Azure DevOps task](https://marketplace.visualstudio.com/items?itemName=devcontainers.ci)) and includes settings from `devcontainer.json` and any referenced Dev Container Features. -This allows you to have a separate **more complex** devcontainer.json you use to pre-build your image, and then a dramatically **simplified one** in one or more repositories. The contents of the image will be merged with this simplified devcontainer.json content at the time you create the container (see the [the spec](/implementors/spec/#merge-logic) for info on merge logic). But at its simplest, you can just reference the image directly in devcontainer.json for the settings to take effect: +This allows you to have a separate **more complex** `devcontainer.json` you use to pre-build your image, and then a dramatically **simplified one** in one or more repositories. The contents of the image will be merged with this simplified devcontainer.json content at the time you create the container (see the [the spec](/implementors/spec/#merge-logic) for info on merge logic). But at its simplest, you can just reference the image directly in `devcontainer.json` for the settings to take effect: ```json { @@ -138,7 +140,7 @@ See the [Dev Container metadata reference](../json_reference) for information on ### Domain Names -If you are behind a firewall that needs to allow specific domains used by the dev container CLI, here's the list of hostnames you should allow communication to go through: +If you are behind a firewall that needs to allow specific domains used by the Dev Container CLI, here's the list of hostnames you should allow communication to go through: * `containers.dev` - The [homepage](https://containers.dev/) for everything about dev containers. It includes all official and community-supported [Features](https://containers.dev/features) and [Templates](https://containers.dev/templates). * `ghcr.io`, `*.azurecr.io`, `mcr.microsoft.com` - [OCI registries](https://containers.dev/implementors/features-distribution/#oci-registry) like [GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry), [Azure Container Registry](azure.microsoft.com/en-us/products/container-registry), and [Microsoft Container Registry](https://mcr.microsoft.com/en-us/catalog?search=dev%20container) serves as the primary distribution mechanism for dev container resources. \ No newline at end of file diff --git a/_implementors/spec.md b/_implementors/spec.md index 9ed10ec1..304125b8 100644 --- a/_implementors/spec.md +++ b/_implementors/spec.md @@ -6,19 +6,19 @@ author: Microsoft index: 1 --- -The purpose of the **development container** specification is to provide a way to enrich containers with the content and metadata necessary to enable development inside them. These container **environments** should be easy to use, create, and recreate. +The purpose of the **Development Container Specification** is to provide a way to enrich containers with the content and metadata necessary to enable development inside them. These container **environments** should be easy to use, create, and recreate. -A **development container** is a container in which a user can develop an application. Tools that want to implement this specification should provide a set of features/commands that give more flexibility to users and allow **development containers** to scale to large development groups. +A **development container** is a container in which a user can develop an application. Tools that want to implement this specification should provide a set of features/commands that give more flexibility to users and allow **development containers** to scale to large development groups. An **environment** is defined as a logical instance of one or more **development containers**, along with any needed side-car containers. An environment is based on one set of metadata that can be managed as a single unit. Users can create multiple **environments** from the same configuration metadata for different purposes. # Metadata -**Development containers** allow one to define a repeatable development environment for a user or team of developers that includes the execution environment the application needs. A development container defines an environment in which you develop your application before you are ready to deploy. While deployment and development containers may resemble one another, you may not want to include tools in a deployment image that you use during development and you may need to use different secrets or other settings. +The Development Container Spec allows one to define a repeatable development environment for a user or team of developers that includes the execution environment the application needs. A development container defines an environment in which you develop your application before you are ready to deploy. While deployment and development containers may resemble one another, you may not want to include tools in a deployment image that you use during development and you may need to use different secrets or other settings. Furthermore, working inside a development container can require additional **metadata** to drive tooling or service experiences than you would normally need with a production container. Providing a structured and consistent form for this metadata is a core part of this specification. -A **development container** is composed of a definition (e.g. contained in a `devcontainer.json` file) that deterministically creates containers under the control of the user. +A development container is composed of a definition (e.g. contained in a `devcontainer.json` file) that deterministically creates containers under the control of the user. ## `devcontainer.json` @@ -34,7 +34,7 @@ It is valid that these files may exist in more than one location, so consider pr Certain dev container metadata properties can be stored in an image label as an array of metadata snippets. This allows them to be stored in prebuilt images, such that, the image and its related configuration are self-contained. These contents should then be merged with any local devcontainer.json file contents at the time the container is created. An array is used so subsequent image builds can simply append changes to the array rather than attempting to merge at that point - which improves compatibility with arbitrary image build systems. -Metadata should be representative of with the following structure, using one entry per [Dev Container Feature](../features) and devcontainer.json (see table below for the full list): +Metadata should be representative of with the following structure, using one entry per [Dev Container Feature](../features) and `devcontainer.json` (see table below for the full list): ```json [ @@ -61,7 +61,7 @@ The metadata is added to the image as a `devcontainer.metadata` label with a JSO ### Merge Logic -To apply the metadata together with a user's devcontainer.json at runtime, the following merge logic by property is used. The table also notes which properties are currently supported coming from the devcontainer.json and from the Feature metadata- this will change over time as we add more properties. +To apply the metadata together with a user's `devcontainer.json` at runtime, the following merge logic by property is used. The table also notes which properties are currently supported coming from the `devcontainer.json` and from the Feature metadata- this will change over time as we add more properties. | Property | Type/Format | Merge Logic | devcontainer.json | devcontainer-feature.json | | -------- | ----------- | ----------- | :---------------: | :--------------: | @@ -93,13 +93,13 @@ To apply the metadata together with a user's devcontainer.json at runtime, the f | `hostRequirements` | `cpus`, `memory`, `storage`, `gpu` | Max value wins. | ✓ | | {: .table .table-bordered .table-responsive} -Variables in string values will be substituted at the time the value is applied. When the order matters, the devcontainer.json is considered last. +Variables in string values will be substituted at the time the value is applied. When the order matters, the `devcontainer.json` is considered last. ### Notes - Passing the label as a `LABEL` instruction in the Dockerfile: - The size limit on Dockerfiles is around 1.3MB. The line length is limited to 65k characters. - - Using one line per feature should allow for making full use of these limits. + - Using one line per Feature should allow for making full use of these limits. - Passing the label as a command line argument: - There is no size limit documented for labels, but the daemon returns an error when the request header is >500kb. - The 500kb limit is shared, so we cannot use a second label in the same build to avoid it. @@ -117,7 +117,7 @@ Image based configurations only reference an image that should be reachable and ## Dockerfile based -These configurations are defined as using a `Dockerfile` to define the starting point of the **development containers**. As with image based configurations, it is assumed that any base images are already reachable by **Docker** when performing a `docker build` command. The only required parameter in this case is the relative reference to the `Dockerfile` in `build.dockerfile`. The details are [here](../json_reference#image-specific). +These configurations are defined as using a Dockerfile to define the starting point of the development containers. As with image based configurations, it is assumed that any base images are already reachable by Docker when performing a `docker build` command. The only required parameter in this case is the relative reference to the Dockerfile in `build.dockerfile`. The details are [here](../json_reference#image-specific). There are multiple properties that allow users to control how `docker build` works: @@ -134,11 +134,11 @@ Docker Compose configurations use `docker-compose` (which may be Docker Compose - `service`: declares the **main** container that will be used for all other operations. Tools are assumed to also use this parameter to connect to the **development container**, although they can provide facilities to connect to the other containers as required by the user. - `runServices`: an optional property that indicates the set of services in the `docker-compose` configuration that should be started or stopped with the environment. -It is important to note that **image** and **dockerfile** properties are not needed since Docker Compose supports them natively in the format. +It is important to note that the `image` and `dockerfile` properties are not needed since Docker Compose supports them natively in the format. # Other options -In addition to the configuration options explained above, there are other settings that apply when creating **development containers** to facilitate their use by developers. +In addition to the configuration options explained above, there are other settings that apply when creating development containers to facilitate their use by developers. A complete list of available metadata properties and their purposes can be found in the [`devcontainer.json` reference](https://aka.ms/devcontainer.json). However, we will describe the critical ones below in more detail. @@ -146,28 +146,28 @@ A complete list of available metadata properties and their purposes can be found Development container "Features" are self-contained, shareable units of installation code and development container configuration. The name comes from the idea that referencing one of them allows you to quickly and easily add more tooling, runtime, or library "features" into your development container for you or your collaborators to use. -They are applied to container images as a secondary build step and can affect a number of dev container configuration settings. See the [features documentation](../features) for more details. +They are applied to container images as a secondary build step and can affect a number of dev container configuration settings. See the [Features documentation](../features) for more details. ## Environment variables -Environment variables can be set at different points in the dev container lifecycle. With this in mind, **development containers** support two classes of environment variables: +Environment variables can be set at different points in the dev container lifecycle. With this in mind, development containers support two classes of environment variables: * **Container**: These variables are part of the container when it is created and are available at all points in its lifecycle. This concept is native to containers and can be set in the container image itself, using `containerEnv` for **image** and **Dockerfile** scenarios or using orchestrator specific properties like `env` in **Docker Compose** files. -* **Remote**: These variables should be set by a **development container** supporting tool as part of configuring its runtime environment. Users can set these using the `remoteEnv` property and implementing tools or services may add their own for specific scenarios (e.g., secrets). These variables can change during the lifetime of the container, and are added after the container's `ENTRYPOINT` has fired. +* **Remote**: These variables should be set by a development container supporting tool as part of configuring its runtime environment. Users can set these using the `remoteEnv` property and implementing tools or services may add their own for specific scenarios (e.g., secrets). These variables can change during the lifetime of the container, and are added after the container's `ENTRYPOINT` has fired. The reason for this separation is it allows for the use of information not available at image build time and simplifies updating the environment for project/repository specific needs without modifying an image. With this in in mind, it's important to note that implementing tools should also support the [dynamic variable syntax](../json_reference/#variables-in-devcontainerjson) described in the metadata reference document. -Another notable and important environment variable related property is **`userEnvProbe`**. Implementing tools should use this property to "probe" for expected environment variables using the specified type of shell. However, it does not specify that this type of shell needs to be used for all sub-processes (given the performance impact). Instead, "probed" environment variables should be merged with Remote environment variables for any processes the implementer injects after the container is created. This allows implementors to emulate developer expected behaviors around values added to their profile and rc files. +Another notable and important environment variable related property is **`userEnvProbe`**. Implementing tools should use this property to "probe" for expected environment variables using the specified type of shell. However, it does not specify that this type of shell needs to be used for all sub-processes (given the performance impact). Instead, "probed" environment variables should be merged with remote environment variables for any processes the implementer injects after the container is created. allows implementors to emulate developer expected behaviors around values added to their profile and rc files. ## Mounts -Mounts allow containers to have access to the underlying machine, share data between containers and to persist information between **development containers**. +Mounts allow containers to have access to the underlying machine, share data between containers and to persist information between development containers. A default mount should be included so that the source code is accessible from inside the container. Source code is stored outside of the container so that a developer's in-flight edits can be extracted, or a new container created in the event a container no longer starts. ## workspaceFolder and workspaceMount -The default mount point for the source code can be set with the `workspaceMount` property for **image** and **dockerfile** scenarios or using the built in `mounts` property in **Docker Compose** files. This folder should point to the root of a repository (where the `.git` folder is found) so that source control operations work correctly inside the container. +The default mount point for the source code can be set with the `workspaceMount` property for image and Dockerfile scenarios or using the built in `mounts` property in Docker Compose files. This folder should point to the root of a repository (where the `.git` folder is found) so that source control operations work correctly inside the container. The `workspaceFolder` can then be set to the default folder inside the container that should used in the container. Typically this is either the mount point in the container, or a sub-folder under it. Allowing a sub-folder to be used is particularly important for monorepos given you need the `.git` folder to interact with source control but developers are typically are interacting with a specific sub-project within the overall repository. @@ -193,7 +193,7 @@ A development environment goes through different lifecycle events during its use ## Configuration Validation -The exact steps required to validate configuration can vary based on exactly where the **development container** metadata is persisted. However, when considering a `devcontainer.json` file, the following validation should occur: +The exact steps required to validate configuration can vary based on exactly where the development container metadata is persisted. However, when considering a `devcontainer.json` file, the following validation should occur: 1. Validate that a workspace source folder has been provided. It is up to the implementing tool to determine what to do if no source folder is provided. 2. Search for a `devcontainer.json` file in one of the locations [above](#devcontainerjson) in the workspace source folder. @@ -212,7 +212,7 @@ During this step, the following is executed: ### Image Creation -The first part of environment creation is generating the final image(s) that the **development containers** are going to use. This step is orchestrator dependent and can consist of just pulling a Docker image, running Docker build, or docker-compose build. Additionally, this step is useful on its own since it permits the creation of intermediate images that can be uploaded and used by other users, thus cutting down on creation time. It is encouraged that tools implementing this specification give access to a command that just executes this step. +The first part of environment creation is generating the final image(s) that the development containers are going to use. This step is orchestrator dependent and can consist of just pulling a Docker image, running Docker build, or `docker-compose` build. Additionally, this step is useful on its own since it permits the creation of intermediate images that can be uploaded and used by other users, thus cutting down on creation time. It is encouraged that tools implementing this specification give access to a command that just executes this step. This step executes the following tasks: @@ -260,7 +260,7 @@ The intention of this step is to ensure all containers are stopped correctly bas ## Environment Resume -While it is not a strict requirement to keep a **development container** after it has been stopped, this is the most common scenario. +While it is not a strict requirement to keep a development container after it has been stopped, this is the most common scenario. To resume the environment from a stopped state: 1. Restart all related containers. diff --git a/_implementors/templates-distribution.md b/_implementors/templates-distribution.md index ab2d7ae9..2bd9480e 100644 --- a/_implementors/templates-distribution.md +++ b/_implementors/templates-distribution.md @@ -68,7 +68,7 @@ Templates are distributed as tarballs. The tarball contains the entire contents The tarball is named `devcontainer-template-.tgz`, where `` is the Templates's `id` field. -A reference implementation for packaging and distributing Templates is provided as a GitHub Action (https://github.com/devcontainers/action). +A reference implementation for packaging and distributing Templates is provided as a [GitHub Action](https://github.com/devcontainers/action). ### devcontainer-collection.json @@ -135,7 +135,7 @@ oras push ${REGISTRY}/${NAMESPACE}:latest \ ## Guide to publishing Templates -The dev container CLI can be used to publish [Dev Container Template](https://containers.dev/implementors/templates/) artifacts to an OCI registry (that supports the [artifacts specification](https://oras.land/implementors/)). +The Dev Container CLI can be used to publish [Template](https://containers.dev/implementors/templates/) artifacts to an OCI registry (that supports the [artifacts specification](https://oras.land/implementors/)). To see all the available options, run `devcontainers templates publish --help`. diff --git a/_implementors/templates.md b/_implementors/templates.md index d559a5cb..9e12eff2 100644 --- a/_implementors/templates.md +++ b/_implementors/templates.md @@ -6,7 +6,7 @@ author: Microsoft index: 7 --- -Development container "Templates" are source files packaged together that encode configuration for a complete development environment. A Template can be used in a new or existing project, and a [supporting tool](/supporting) will use the configuration from the Template to build a development container. +**Development Container Templates** are source files packaged together that encode configuration for a complete development environment. A Template can be used in a new or existing project, and a [supporting tool](/supporting) will use the configuration from the Template to build a development container. The configuration is placed in a [`.devcontainer.json`](/implementors/json_reference#devcontainerjson) which can also reference other files within the Template. Alternatively, `.devcontainer/devcontainer.json` can also be used if the container needs to reference other files, such as a `Dockerfile` or `docker-compose.yml`. A Template can also provide additional source files (eg: boilerplate code or a [lifecycle script](/implementors/json_reference/#lifecycle-scripts)). diff --git a/collections.html b/collections.html index 205688e5..78261197 100644 --- a/collections.html +++ b/collections.html @@ -6,13 +6,16 @@

Collections

- This list below contains pointers to official and community-contributed Dev Container assets, including Features and Templates. - Collections on this list are continuously crawled for liveness, and can be presented in UX of Dev Container-supporting tools + This list below contains pointers to official and community-contributed dev container assets, including Features and + Templates. + Collections on this list are continuously crawled for liveness, and can be presented in UX of spec supporting tools (i.e. it will be presented in the GitHub Codespaces and VS Code Dev Containers UX).

- To add your own collection to this list, please create a PR editing this yaml file. + To add your own collection to this list, please create a PR editing this + yaml file.

Name @@ -23,7 +26,8 @@

Collections

{% for c in site.data.collection-index %} {{ c.name }} - {{ c.maintainer | strip_html }} - {{ c.repository | strip_html }} + {{ c.maintainer | strip_html }} + {{ c.repository | strip_html }} + -{% endfor %} +{% endfor %} \ No newline at end of file diff --git a/features.html b/features.html index 88d3d855..ca22e28d 100644 --- a/features.html +++ b/features.html @@ -7,11 +7,13 @@

Available Dev Container Features

This table contains all official and community-supported Dev Container Features - known at the time of crawling each registered collection. This list is continuously - updated with the latest available feature information. See the - Feature quick start repository to add your own! + known at the time of crawling each registered collection. This list is continuously + updated with the latest available feature information. See the + Feature quick start repository to add your own!

- Referencing a feature below can be done in the "features" section of a devcontainer.json. + Referencing a Feature below can be done in the "features" + section of a devcontainer.json.

Please note that if you need to report a Feature, you should do so through the registry hosting the Feature.

@@ -26,15 +28,16 @@

Available Dev Container Featur {% for c in site.data.devcontainer-index.collections %} - {% for f in c.features %} - {% if f.deprecated != true %} - - {{ f.name | strip_html }} - {{ c.sourceInformation.maintainer | strip_html }} - {{ f.id | strip_html }}:{{ f.majorVersion | strip_html }} - {{ f.version | strip_html }} - - {% endif %} - {% endfor %} +{% for f in c.features %} +{% if f.deprecated != true %} + + {{ f.name | strip_html }} + + {{ c.sourceInformation.maintainer | strip_html }} + {{ f.id | strip_html }}:{{ f.majorVersion | strip_html }} + {{ f.version | strip_html }} + +{% endif %} +{% endfor %} {% endfor %} \ No newline at end of file diff --git a/index.html b/index.html index ba5eaa3f..89ed4deb 100644 --- a/index.html +++ b/index.html @@ -16,7 +16,8 @@

Development Containers


- Star
@@ -27,44 +28,61 @@

Development Containers

- Go devcontainer.json config file -

Use or create dev container definitions for a multitude of tech stacks and tools.

+ Go devcontainer.json config file +

Use or create dev container definitions for a multitude of tech stacks and + tools.

-
+ -
+
-
-
-

Gear cogs

-

Overview

-

- More information about the Development Containers Specification. -

-
-
-

Gear cogs

- {% assign sorted = site.implementors | sort: 'index' %} -

Specification

-

- Check out the latest reference implementation and schemas. -

-
-
-

Gear cogs

-

Supporting Tools

-

- A variety of tools and services support this standard. -

+
+
+

Gear cogs

+ +

Overview

+
+

+ More information about the Development Container Specification. +

+
+
+

Gear cogs

+ {% assign sorted = site.implementors | sort: 'index' %} + +

Specification

+
+

+ Check out the latest reference implementation and schemas. +

+
+
+

Gear cogs

+ +

Supporting Tools

+
+

+ A variety of tools and services support this standard. +

+
-
-
+ \ No newline at end of file diff --git a/overview.md b/overview.md index ccfb5e1f..6858efa8 100644 --- a/overview.md +++ b/overview.md @@ -7,17 +7,17 @@ sectionid: overview ## What are development containers? As containerizing production workloads becomes commonplace, more developers are using containers for scenarios beyond deployment, including continuous integration, test automation, and even full-featured coding environments. -Each scenario’s needs can vary between simple single container environments to complex, orchestrated multi-container setups. Rather than attempting to create another orchestrator format, the Development Containers Specification (or Dev Containers Spec for short) seeks to find ways to enrich existing formats with metadata for common development specific settings, tools, and configuration. +Each scenario’s needs can vary between simple single container environments to complex, orchestrated multi-container setups. Rather than attempting to create another orchestrator format, the Development Container Specification (or Dev Container Spec for short) seeks to find ways to enrich existing formats with metadata for common development specific settings, tools, and configuration. ### A structured metadata format Like the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) before it, the first format in the specification, [`devcontainer.json`](implementors/json_reference), was born out of necessity. It is a structured JSON with Comments (jsonc) metadata format that tools can use to store any needed configuration required to develop inside of local or cloud-based containerized coding. -Since the spec was initally published, Dev Container metadata can now be stored in [image labels](../implementors/spec/#image-metadata) and in reusable chunks of metadata and install scripts known as [Dev Container Features](../features). We envision that this same structured data can be embedded in other formats -- all while retaining a common object model for consistent processing. +Since the spec was initally published, dev container metadata can now be stored in [image labels](../implementors/spec/#image-metadata) and in reusable chunks of metadata and install scripts known as [Dev Container Features](../features). We envision that this same structured data can be embedded in other formats -- all while retaining a common object model for consistent processing. ### Development vs production -A Development Container defines an environment in which you develop your application before you are ready to deploy. While deployment and development containers may resemble one another, you may not want to include tools in a deployment image that you use during development. +A development container defines an environment in which you develop your application before you are ready to deploy. While deployment and development containers may resemble one another, you may not want to include tools in a deployment image that you use during development. Diagram of inner and outer loop of container-based development diff --git a/supporting.md b/supporting.md index 3569f680..88cd63e1 100644 --- a/supporting.md +++ b/supporting.md @@ -4,7 +4,7 @@ layout: singlePage sectionid: supporting --- -This page outlines tools and services that currently support the development container specification, including the `devcontainer.json` format. A `devcontainer.json` file in your project tells tools and services that support the dev container spec how to access (or create) a dev container with a well-defined tool and runtime stack. +This page outlines tools and services that currently support the Development Container Specification, including the `devcontainer.json` format. A `devcontainer.json` file in your project tells tools and services that support the dev container spec how to access (or create) a dev container with a well-defined tool and runtime stack. While most [dev container properties](implementors/json_reference) apply to any `devcontainer.json` supporting tool or service, a few are specific to certain tools, which are outlined below. @@ -35,13 +35,13 @@ Please note that the [Dev Containers](#dev-containers) extension and [GitHub Cod ### Visual Studio -Visual Studio added Dev Container support in Visual Studio 2022 17.4 for C++ projects using CMake Presets. It is part of the Linux and embedded development with C++ workload, so make sure it is selected in your VS installation. Visual Studio manages the lifecycle of Dev Containers it uses as you work, but it treats them as remote targets in a similar way to other Linux or WSL targets. +Visual Studio added dev container support in Visual Studio 2022 17.4 for C++ projects using CMake Presets. It is part of the Linux and embedded development with C++ workload, so make sure it is selected in your VS installation. Visual Studio manages the lifecycle of dev containers it uses as you work, but it treats them as remote targets in a similar way to other Linux or WSL targets. You may learn more in the [announcement blog post](https://devblogs.microsoft.com/cppblog/dev-containers-for-c-in-visual-studio/). ### IntelliJ IDEA -IntelliJ IDEA has early support Dev Containers that can be run remotely via an SSH connection or locally using Docker. +IntelliJ IDEA has early support dev containers that can be run remotely via an SSH connection or locally using Docker. You may learn more in the [announcement blog post](https://blog.jetbrains.com/idea/2023/06/intellij-idea-2023-2-eap-6/#SupportforDevContainers). @@ -49,25 +49,25 @@ You may learn more in the [announcement blog post](https://blog.jetbrains.com/id ### Dev Container CLI -The dev container command line interface (CLI) is a reference implementation for the Dev Container spec. It is in development in the [devcontainers/cli](https://github.com/devcontainers/cli) repo. It is intended both for use directly and by tools or services that want to support the spec. +The Dev Container Command Line Interface (CLI) is a reference implementation for the Dev Container Spec. It is in development in the [devcontainers/cli](https://github.com/devcontainers/cli) repo. It is intended both for use directly and by tools or services that want to support the spec. -The CLI can take a `devcontainer.json` and create and configure a dev container from it. It allows for prebuilding dev container definitions using a CI or DevOps product like GitHub Actions. It can detect and include dev container features and apply them at container runtime, and run [lifecycle scripts](implementors/json_reference/#lifecycle-scripts) like `postCreateCommand`, providing more power than a plain `docker build` and `docker run`. +The CLI can take a `devcontainer.json` and create and configure a dev container from it. It allows for prebuilding dev container configurations using a CI or DevOps product like GitHub Actions. It can detect and include dev container features and apply them at container runtime, and run [lifecycle scripts](implementors/json_reference/#lifecycle-scripts) like `postCreateCommand`, providing more power than a plain `docker build` and `docker run`. #### VS Code extension CLI -The [VS Code Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) includes a variation of the devcontainer CLI that adds the ability use the command line to open a dev container in VS Code. It is also automatically updated when the extension updates. +The [VS Code Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) includes a variation of the Dev Container CLI that adds the ability use the command line to open a dev container in VS Code. It is also automatically updated when the extension updates. Press cmd/ctrl+shift+p or F1 and select the **Dev Containers: Install devcontainer CLI** command to install it. ### Cachix devenv -Cachix's **[devenv](https://devenv.sh/)** now supports automatically generating a `.devcontainer.json` file. This gives you a more convenient and consistent way to use [Nix](https://nixos.org/) with any Dev Container spec supporting tool or service! +Cachix's **[devenv](https://devenv.sh/)** now supports automatically generating a `.devcontainer.json` file. This gives you a more convenient and consistent way to use [Nix](https://nixos.org/) with any Dev Container Spec supporting tool or service! See [devenv documentation](https://devenv.sh/integrations/codespaces-devcontainer/) for detais. ### Jetpack.io Devbox -[Jetpack.io](https://jetpack.io) is a [Nix](https://nixos.org/)-based service for deploying applications. [DevBox](https://www.jetpack.io/devbox/) provides a way to use Nix to generate a development environment. [Jetpack.io's VS Code extension](https://marketplace.visualstudio.com/items?itemName=jetpack-io.devbox) allows you to quickly take advantage of DevBox in any Dev Container spec supporting tool or service. +[Jetpack.io](https://jetpack.io) is a [Nix](https://nixos.org/)-based service for deploying applications. [DevBox](https://www.jetpack.io/devbox/) provides a way to use Nix to generate a development environment. [Jetpack.io's VS Code extension](https://marketplace.visualstudio.com/items?itemName=jetpack-io.devbox) allows you to quickly take advantage of DevBox in any Dev Container Spec supporting tool or service. Press cmd/ctrl+shift+p or F1 and select the **Generate Dev Container files** command to get started! @@ -136,11 +136,11 @@ You can customize which files are initially opened when the codespace is created The paths are relative to the root of the repository. They will be opened in order, with the first file activated. -Note that currently Codespaces reads these properties from devcontainer.json, not image metadata. +> **Note** that currently Codespaces reads these properties from `devcontainer.json`, not image metadata. #### Product specific limitations -Some properties may apply differently to Codespaces. +Some properties may apply differently to codespaces. | Property or variable | Type | Description | |----------|---------|----------------------| @@ -159,7 +159,6 @@ Some properties may apply differently to Codespaces. When you import a GitHub repository into CodeSandbox, it will automatically provision a dedicated environment for every branch. Thanks to memory snapshotting, CodeSandbox then resumes and branches an environment in under two seconds. - CodeSandbox offers support for multiple editors, so you can code using the CodeSandbox web editor, VS Code, or the CodeSandbox iOS app. **Tip:** After importing a repository into CodeSandbox, you can use the built-in UI to configure the environment using dev containers. @@ -171,24 +170,20 @@ All properties specific to CodeSandbox are placed within a `.codesandbox` folder More details about these can be found in the CodeSandbox [documentation](https://codesandbox.io/docs/learn/repositories/task). -#### Product specific limitations +#### Product specific limitations CodeSandbox runs dev containers using rootless Podman instead of Docker. CodeSandbox also uses [devcontainers/cli](https://github.com/devcontainers/cli) to manage dev containers. So any limitations of rootless Podman and Dev Container CLI should apply to CodeSandbox. - The following properties apply differently to CodeSandbox. | Property or variable | Type | Description | |----------|---------|----------------------| | `forwardPorts` | array | CodeSandbox does not need this property. All ports opened in dev containers will be mapped to a public URL automatically. | - | `portsAttributes` | object | CodeSandbox does not yet support this property. Ports are attached to tasks configured in `.codesandbox/tasks.json` and are attributed to the tasks.| | `otherPortsAttributes` | object | CodeSandbox does not yet support this property. | | `remoteUser` | string | CodeSandbox currently ignores this property and overrides this as `root`. CodeSandbox uses rootless Podman to run containers. Running with a non-root remote user is the same as running as a root remote user in rootless Podman, from a security perspective. CodeSandbox plans on supporting this in the future. | | `shutdownAction` | string | Does not apply to CodeSandbox. | - | `capAdd` | array | CodeSandbox does not support adding docker capabilities. As the containers are run as a non-root user, capabilities that need root access will not work. | - | `features` | object | CodeSandbox automatically adds docker-cli to the container and connects to the host socket. Features like `docker-in-docker` and `docker-outside-of-docker` will work a bit differently. As the docker-cli and socket from host are accessible in the container, most use cases should work as expected. | | `${localEnv:VARIABLE_NAME}` | Any | For CodeSandbox, the host is in the cloud rather than in your local machine.| | `hostRequirements` | object | CodeSandbox does not yet support this property. | @@ -196,7 +191,7 @@ The following properties apply differently to CodeSandbox. ### DevPod -[DevPod](https://github.com/loft-sh/devpod) is a client-only tool to create reproducible developer environments based on a devcontainer.json on any backend. Each developer environment runs in a container and is specified through a devcontainer.json. Through DevPod providers these environments can be created on any backend, such as the local computer, a Kubernetes cluster, any reachable remote machine or in a VM in the cloud. +[DevPod](https://github.com/loft-sh/devpod) is a client-only tool to create reproducible developer environments based on a `devcontainer.json` on any backend. Each developer environment runs in a container and is specified through a `devcontainer.json`. Through DevPod providers these environments can be created on any backend, such as the local computer, a Kubernetes cluster, any reachable remote machine or in a VM in the cloud. ### Schema From aadf2de46261f84d971783253a296c3139eb4af7 Mon Sep 17 00:00:00 2001 From: Nick Zelei <2420177+nickzelei@users.noreply.github.com> Date: Tue, 24 Oct 2023 11:00:21 -0700 Subject: [PATCH 002/140] Update collection-index.yml to include nucleuscloud features (#308) --- _data/collection-index.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 1dab1a95..55cf4672 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -598,3 +598,9 @@ contact: https://github.com/xfrancois/devcontainers-features/issues repository: https://github.com/xfrancois/devcontainers-features ociReference: ghcr.io/xfrancois/devcontainers-features +- name: Features by nucleuscloud + maintainer: nucleuscloud + contact: https://github.com/nucleuscloud/devcontainer-features/issues + repository: https://github.com/nucleuscloud/devcontainer-features + ociReference: ghcr.io/nucleuscloud/devcontainer-features + From 61f056159efd15a674ee495bc8f5912ed741b7fd Mon Sep 17 00:00:00 2001 From: Maaz Ghani Date: Fri, 27 Oct 2023 08:56:30 -0700 Subject: [PATCH 003/140] runtime flag typo (#310) --- _implementors/json_reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_implementors/json_reference.md b/_implementors/json_reference.md index b8e89709..b797e53c 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -27,7 +27,7 @@ Metadata properties marked with a 🏷️️ can be stored in the `devcontainer. | `overrideCommand` 🏷️ | boolean | Tells `devcontainer.json` supporting services / tools whether they should run `/bin/sh -c "while sleep 1000; do :; done"` when starting the container instead of the container's default command (since the container can shut down if the default command fails). Set to `false` if the default command must run for the container to function properly. Defaults to `true` for when using an image Dockerfile and `false` when referencing a Docker Compose file. | | `shutdownAction` 🏷️ | enum | Indicates whether `devcontainer.json` supporting tools should stop the containers when the related tool window is closed / shut down.
Values are `none`, `stopContainer` (default for image or Dockerfile), and `stopCompose` (default for Docker Compose). | | `init` 🏷️ | boolean | Defaults to `false`. Cross-orchestrator way to indicate whether the [tini init process](https://github.com/krallin/tini) should be used to help deal with zombie processes. | -| `privileged` 🏷️ | boolean | Defaults to `false`. Cross-orchestrator way to cause the container to run in priviledged mode (`--priviledged`). Required for things like Docker-in-Docker, but has security implications particularly when running directly on Linux. | +| `privileged` 🏷️ | boolean | Defaults to `false`. Cross-orchestrator way to cause the container to run in privileged mode (`--privileged`). Required for things like Docker-in-Docker, but has security implications particularly when running directly on Linux. | | `capAdd` 🏷️ | array | Defaults to `[]`. Cross-orchestrator way to add capabilities typically disabled for a container. Most often used to add the `ptrace` capability required to debug languages like C++, Go, and Rust. For example:
`"capAdd": ["SYS_PTRACE"]` | | `securityOpt` 🏷️ | array | Defaults to `[]`. Cross-orchestrator way to set container security options. For example:
`"securityOpt": [ "seccomp=unconfined" ]` | | `mounts` 🏷️ | string or object | Defaults to unset. Cross-orchestrator way to add additional mounts to a container. Each value is a string that accepts the same values as the [Docker CLI `--mount` flag](https://docs.docker.com/engine/reference/commandline/run/#mount). Environment and [pre-defined variables](#variables-in-devcontainerjson) may be referenced in the value. For example:
`"mounts": [{ "source": "dind-var-lib-docker", "target": "/var/lib/docker", "type": "volume" }]` | From 1a7fa03e94599ccb4e4d3702efa93345085318c8 Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Fri, 27 Oct 2023 09:58:35 -0600 Subject: [PATCH 004/140] Update collection-index.yml (#311) --- _data/collection-index.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 55cf4672..323dd3e6 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -603,4 +603,8 @@ contact: https://github.com/nucleuscloud/devcontainer-features/issues repository: https://github.com/nucleuscloud/devcontainer-features ociReference: ghcr.io/nucleuscloud/devcontainer-features - +- name: Awesome Features + maintainer: joshspicer + contact: https://github.com/joshspicer/more-features/issues + repository: https://github.com/joshspicer/more-features + ociReference: ghcr.io/joshspicer/more-features From db28de7a58df8279fc2485478bab3ee58af23514 Mon Sep 17 00:00:00 2001 From: Marlon Passos <1marlonpassos@gmail.com> Date: Mon, 30 Oct 2023 17:37:47 -0300 Subject: [PATCH 005/140] add features by MarlonPasso-git (#314) * add features by MarlonPasso-git * Update _data/collection-index.yml Co-authored-by: Samruddhi Khandale * Update _data/collection-index.yml Co-authored-by: Samruddhi Khandale --------- Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 323dd3e6..84c4b8c8 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -608,3 +608,8 @@ contact: https://github.com/joshspicer/more-features/issues repository: https://github.com/joshspicer/more-features ociReference: ghcr.io/joshspicer/more-features +- name: Features by MarlonPassos-git + maintainer: MarlonPassos-git + contact: https://github.com/MarlonPassos-git/dev-container-features/issues + repository: https://github.com/MarlonPassos-git/dev-container-features + ociReference: ghcr.io/marlonpassos-git/dev-container-features From 948d137cf07b96f4959e76d1589c8bccfdeac4de Mon Sep 17 00:00:00 2001 From: Luigi Operoso <40476330+brokenpip3@users.noreply.github.com> Date: Mon, 6 Nov 2023 17:52:15 +0100 Subject: [PATCH 006/140] add bats-libraries features (#316) * add features by brokenpip3 * fix oci reference --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 84c4b8c8..33c0a9d4 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -613,3 +613,8 @@ contact: https://github.com/MarlonPassos-git/dev-container-features/issues repository: https://github.com/MarlonPassos-git/dev-container-features ociReference: ghcr.io/marlonpassos-git/dev-container-features +- name: Bats Features by Luigi Operoso + maintainer: brokenpip3 + contact: https://github.com/brokenpip3/devcontainers-bats/issues + repository: https://github.com/brokenpip3/devcontainers-bats + ociReference: ghcr.io/brokenpip3/devcontainers-bats From f37959c8731f84e86741851a7213cc445f46f40d Mon Sep 17 00:00:00 2001 From: Paul Gilber Date: Tue, 7 Nov 2023 01:26:42 +0800 Subject: [PATCH 007/140] add DevContainer Features by Paul Gilber (#317) Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 33c0a9d4..defd42e9 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -613,6 +613,11 @@ contact: https://github.com/MarlonPassos-git/dev-container-features/issues repository: https://github.com/MarlonPassos-git/dev-container-features ociReference: ghcr.io/marlonpassos-git/dev-container-features +- name: DevContainer Features by Paul Gilber + maintainer: Paul Gilber + contact: https://github.com/paul-gilber/devcontainer-features/issues + repository: https://github.com/paul-gilber/devcontainer-features + ociReference: ghcr.io/paul-gilber/devcontainer-features - name: Bats Features by Luigi Operoso maintainer: brokenpip3 contact: https://github.com/brokenpip3/devcontainers-bats/issues From 9de821a591d009082dd3f2b953896a5e1364be43 Mon Sep 17 00:00:00 2001 From: Gary Hunt Date: Mon, 6 Nov 2023 17:29:39 +0000 Subject: [PATCH 008/140] Typo in 2023-08-22-prebuild.md (#318) Stat vs start --- _posts/2023-08-22-prebuild.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-08-22-prebuild.md b/_posts/2023-08-22-prebuild.md index b944d163..3cdde3f8 100644 --- a/_posts/2023-08-22-prebuild.md +++ b/_posts/2023-08-22-prebuild.md @@ -127,7 +127,7 @@ There are a variety of benefits (some of which we've already explored) to creati * You can adopt and iterate on [existing Templates](../templates.html) from the spec and community, or you can [create and share your own](../_implementors/templates-distribution.md) * You can include Dev Container configuration and Feature metadata in prebuilt images via [image labels](https://docs.docker.com/config/labels-custom-metadata/). This makes the image self-contained since these settings are automatically picked up when the image is referenced - whether directly, in a `FROM` in a referenced Dockerfile, or in a Docker Compose file. You can learn more in our [reference docs](/_implementors/reference.md#metadata-in-image-labels) * You can use multi-stage Dockerfiles to create a prod container from your dev container - * You'd typically stat with your prod image, then add to it + * You'd typically start with your prod image, then add to it * Features provide a quick way to add development and CI specific layers that you wouldn't use in production * For more information and an example, check out our [discussion on multi-stage builds](https://github.com/orgs/devcontainers/discussions/4#discussioncomment-4152158) From 69d2bb21536003d7079623801622411145c72714 Mon Sep 17 00:00:00 2001 From: RonaldTM9999 <106024131+RonaldTM9999@users.noreply.github.com> Date: Mon, 6 Nov 2023 20:55:59 +0200 Subject: [PATCH 009/140] Add Fedora-based dev-containers (#319) * Add Fedora-based dev-containers For use within a Fedora-based environment, starting with F#. * Lower the case and remove protocol prefix Co-authored-by: Samruddhi Khandale * Add repository --------- Co-authored-by: Samruddhi Khandale Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index defd42e9..2d9ac353 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -613,6 +613,11 @@ contact: https://github.com/MarlonPassos-git/dev-container-features/issues repository: https://github.com/MarlonPassos-git/dev-container-features ociReference: ghcr.io/marlonpassos-git/dev-container-features +- name: DevContainers for Fedora-based Development + maintainer: RonaldTM9999 + contact: https://github.com/RonaldTM9999/devcontainers/issues + repository: https://github.com/RonaldTM9999/devcontainers + ociReference: ghcr.io/ronaldtm9999/devcontainers - name: DevContainer Features by Paul Gilber maintainer: Paul Gilber contact: https://github.com/paul-gilber/devcontainer-features/issues From a7ab1883cc75fb12f6e5fa4629a65e9cf906ac33 Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Mon, 6 Nov 2023 15:11:52 -0800 Subject: [PATCH 010/140] Update contributing.md with formatting guidance (#320) * Update contributing.md * Update contributing.md * Update contributing.md * Update contributing.md Co-authored-by: Samruddhi Khandale --------- Co-authored-by: Samruddhi Khandale --- contributing.md | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/contributing.md b/contributing.md index 90d7ccba..8b97c103 100644 --- a/contributing.md +++ b/contributing.md @@ -37,8 +37,19 @@ Tool-specific properties are contained in namespaces in the `"customizations"` p You may propose adding a new namespace for a specific tool, and any properties specific to that tool. -### GitHub Discussions -If you'd like to discuss the spec, such as asking questions, providing feedback, or engaging on how your team may use or contribute to dev containers, please check out the [GitHub Discussions](https://github.com/devcontainers/spec/discussions) in this repo. This is a great opportunity to connect with the community and maintainers of this project, without the requirement of contributing a change to the actual spec (which we see more in issues and PRs). +## Formatting Guidelines + +When contributing an official doc or referencing dev containers in your projects, please consider the following guidelines: + +- Refer to the spec as the "Development Container Specification" + - All capital letters + - Singular "Container" rather than plural "Containers" +- The term "dev container" shouldn't be capitalized on its own + - It should only be capitalized when referring to an official tool title, like the VS Code Dev Containers extension +- Signify `devcontainer.json` is a file type through backticks +- Features and Templates should always be capitalized +- Refer to the CLI as the "Dev Container CLI" (note the caps) +- Use bolding for emphasis sprinkled throughout sections, rather than try to use it to always bold certain terms ## Review process @@ -48,3 +59,10 @@ We use the following [labels](https://github.com/devcontainers/spec/labels): - `finalization`: Proposals we intend to make part of the spec. [Milestones](https://github.com/devcontainers/spec/milestones) use a "month year" pattern (i.e. January 2022). If a finalized proposal is added to a milestone, it is intended to be merged during that milestone. + +## Community Engagement +There are several additional options to engage with the dev container community, such as asking questions, providing feedback, or engaging on how your team may use or contribute to dev containers: +- [GitHub Discussions](https://github.com/devcontainers/spec/discussions): This is a great opportunity to connect with the community and maintainers of this project, without the requirement of contributing a change to the actual spec (which we see more in issues and PRs) +- [Community Slack channel](https://aka.ms/dev-container-community): This is a great opportunity to connect with the community and maintainers +- You can always check out the issues and PRs (and contribute new ones) across the repos in the [Dev Containers GitHub org](https://github.com/devcontainers) too! + From 3e1f279e8414e088c81c5f10cf6d1335cbea041a Mon Sep 17 00:00:00 2001 From: Olivia Guzzardo <95261576+olguzzar@users.noreply.github.com> Date: Thu, 9 Nov 2023 14:09:26 -0500 Subject: [PATCH 011/140] Fix links (#322) --- _posts/2023-08-22-prebuild.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/_posts/2023-08-22-prebuild.md b/_posts/2023-08-22-prebuild.md index 3cdde3f8..684e854c 100644 --- a/_posts/2023-08-22-prebuild.md +++ b/_posts/2023-08-22-prebuild.md @@ -33,7 +33,7 @@ If you're already using dev containers, you're likely already familiar with the You need to build your container once it has all the dependencies it needs, and rebuild anytime you add new dependencies. Since you may not need to rebuild often, it might be alright if it takes a while for that initial build. But if you or your teammates need to use that container on another machine, you'll need to wait for it to build again in those new environments. -> **Note:** The [dev container CLI doc](/_implementors/reference.md#prebuilding) is another great resource on prebuilding. +> **Note:** The [dev container CLI doc](/implementors/reference#prebuilding) is another great resource on prebuilding. ### Prebuilt Codespaces @@ -43,14 +43,14 @@ GitHub Codespaces prebuilds help to speed up the creation of new codespaces for By default, whenever you push changes to your repository, GitHub Codespaces uses GitHub Actions to automatically update your prebuilds. -You can learn more about codespaces prebuilds and how to manage them in the [codespaces docs]((https://docs.github.com/en/codespaces/prebuilding-your-codespaces/about-github-codespaces-prebuilds)). +You can learn more about codespaces prebuilds and how to manage them in the [codespaces docs](https://docs.github.com/en/codespaces/prebuilding-your-codespaces/about-github-codespaces-prebuilds). ## How do I prebuild my image? We try to make prebuilding an image and using a prebuilt image as easy as possible. Let's walk through the couple of steps to get started. **Prebuilding an image:** -* Install the [Dev Container CLI](/_implementors/reference.md): +* Install the [Dev Container CLI](/implementors/reference): ```bash npm install -g @devcontainers/cli @@ -67,7 +67,7 @@ We try to make prebuilding an image and using a prebuilt image as easy as possib **Using a prebuilt image:** * Determine the published URL of the prebuilt image you want to use * Reference it in your `devcontainer.json`, Dockerfile, or Docker Compose file - * In our previous guide on ["Using Images, Dockerfiles, and Docker Compose,"](/_posts/2022-12-16-dockerfile.md) we also showed how you can use prebuilt images, Dockerfiles, or Docker Compose files for your configurations + * In our previous guide on ["Using Images, Dockerfiles, and Docker Compose,"](/guide/dockerfile) we also showed how you can use prebuilt images, Dockerfiles, or Docker Compose files for your configurations ### Prebuild Examples @@ -98,7 +98,7 @@ Let's walk through the Kubernetes prebuild as an example of how you can determin * We see it references a prebuilt image, which will include dependencies that don't need to be explicitly mentioned in this end user dev container. Let's next go explore the dev container defining this prebuilt image * **Explore the dev container defining your prebuilt image** * We next open the config that defines the prebuilt image. This is contained in the [`.github/.devcontainer` folder](https://github.com/craiglpeters/kubernetes-devcontainer/tree/master/.github/.devcontainer) - * We see there's a [`devcontainer.json`](https://github.com/craiglpeters/kubernetes-devcontainer/blob/master/.github/.devcontainer/devcontainer.json). It's much more detailed than the end user dev container we explored above and includes a variety of [Features](/_implementors/features.md) + * We see there's a [`devcontainer.json`](https://github.com/craiglpeters/kubernetes-devcontainer/blob/master/.github/.devcontainer/devcontainer.json). It's much more detailed than the end user dev container we explored above and includes a variety of [Features](/implementors/features) * **Explore content in the prebuilt dev container's config** * Each Feature defines additional functionality * We can explore what each of them installs in their associated repo. Most appear to be defined in the [devcontainers/features repo](https://github.com/devcontainers/features/tree/main/src) as part of the dev container spec @@ -123,9 +123,9 @@ There are a variety of benefits (some of which we've already explored) to creati * We explored the prebuilt images we host as part of the spec in [devcontainers/images](https://github.com/devcontainers/images/tree/main/src). These can form a great base for other dev containers you'd like to create for more complex scenarios * The spec has a concept of Development container "Templates" which are source files packaged together that encode configuration for a complete development environment * A Template may be as simple as a `devcontainer.json` referencing a prebuilt image, and a `devcontainer-template.json` - * You can learn more about Templates in our [Templates documentation](../_implementors/templates.md) - * You can adopt and iterate on [existing Templates](../templates.html) from the spec and community, or you can [create and share your own](../_implementors/templates-distribution.md) -* You can include Dev Container configuration and Feature metadata in prebuilt images via [image labels](https://docs.docker.com/config/labels-custom-metadata/). This makes the image self-contained since these settings are automatically picked up when the image is referenced - whether directly, in a `FROM` in a referenced Dockerfile, or in a Docker Compose file. You can learn more in our [reference docs](/_implementors/reference.md#metadata-in-image-labels) + * You can learn more about Templates in our [Templates documentation](../implementors/templates) + * You can adopt and iterate on [existing Templates](../templates.html) from the spec and community, or you can [create and share your own](../implementors/templates-distribution) +* You can include Dev Container configuration and Feature metadata in prebuilt images via [image labels](https://docs.docker.com/config/labels-custom-metadata/). This makes the image self-contained since these settings are automatically picked up when the image is referenced - whether directly, in a `FROM` in a referenced Dockerfile, or in a Docker Compose file. You can learn more in our [reference docs](/implementors/reference#labels) * You can use multi-stage Dockerfiles to create a prod container from your dev container * You'd typically start with your prod image, then add to it * Features provide a quick way to add development and CI specific layers that you wouldn't use in production From 7b82fdd1dbc041c1677c6817c66ce19c5228c695 Mon Sep 17 00:00:00 2001 From: Samruddhi Khandale Date: Wed, 15 Nov 2023 11:44:19 -0800 Subject: [PATCH 012/140] Removes Templates published from vscode-dev-containers repo (#323) --- _data/collection-index.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 2d9ac353..8095efce 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -28,11 +28,6 @@ contact: https://github.com/meaningful-ooo/devcontainer-features/issues repository: https://github.com/meaningful-ooo/devcontainer-features ociReference: ghcr.io/meaningful-ooo/devcontainer-features -- name: Legacy Community Templates - maintainer: Deprecated (No longer maintained) - contact: https://github.com/microsoft/vscode-dev-containers/issues/1589 - repository: https://github.com/microsoft/vscode-dev-containers - ociReference: ghcr.io/microsoft/vscode-dev-containers - name: Assorted Features maintainer: Mike Priscella contact: https://github.com/mpriscella/features/issues From 3a07d44580919c6d7f994d89fb34c4e577ee8645 Mon Sep 17 00:00:00 2001 From: Jason Bright Date: Thu, 16 Nov 2023 16:59:56 -0500 Subject: [PATCH 013/140] update docs to have working oras examples (#324) The push and pull examples do not work with the current cli. The latest oras documentation describes the use of the `--config` option for the [push](https://oras.land/docs/commands/oras_push) and [pull](https://oras.land/docs/commands/oras_pull) commands. This parameter change (rename the `--manifest-config` to `--config`) was [documented as a breaking change](https://github.com/oras-project/oras/releases/tag/v0.14.0) in version 0.14.0 of the ORAS CLI, which was released in August 2022. --- _implementors/features-distribution.md | 4 ++-- _implementors/templates-distribution.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_implementors/features-distribution.md b/_implementors/features-distribution.md index 04db312e..6ef56cfc 100644 --- a/_implementors/features-distribution.md +++ b/_implementors/features-distribution.md @@ -116,7 +116,7 @@ ARTIFACT_PATH=devcontainer-feature-go.tgz for VERSION in 1 1.2 1.2.3 latest do oras push ${REGISTRY}/${NAMESPACE}/${FEATURE}:${VERSION} \ - --manifest-config /dev/null:application/vnd.devcontainers \ + --config /dev/null:application/vnd.devcontainers \ ./${ARTIFACT_PATH}:application/vnd.devcontainers.layer.v1+tar done ``` @@ -131,7 +131,7 @@ REGISTRY=ghcr.io NAMESPACE=devcontainers/features oras push ${REGISTRY}/${NAMESPACE}:latest \ - --manifest-config /dev/null:application/vnd.devcontainers \ + --config /dev/null:application/vnd.devcontainers \ ./devcontainer-collection.json:application/vnd.devcontainers.collection.layer.v1+json ``` diff --git a/_implementors/templates-distribution.md b/_implementors/templates-distribution.md index 2bd9480e..6e6f0f21 100644 --- a/_implementors/templates-distribution.md +++ b/_implementors/templates-distribution.md @@ -113,7 +113,7 @@ ARTIFACT_PATH=devcontainer-template-go.tgz for VERSION in 1 1.2 1.2.3 latest do oras push ${REGISTRY}/${NAMESPACE}/${TEMPLATE}:${VERSION} \ - --manifest-config /dev/null:application/vnd.devcontainers \ + --config /dev/null:application/vnd.devcontainers \ ./${ARTIFACT_PATH}:application/vnd.devcontainers.layer.v1+tar done @@ -129,7 +129,7 @@ REGISTRY=ghcr.io NAMESPACE=devcontainers/templates oras push ${REGISTRY}/${NAMESPACE}:latest \ - --manifest-config /dev/null:application/vnd.devcontainers \ + --config /dev/null:application/vnd.devcontainers \ ./devcontainer-collection.json:application/vnd.devcontainers.collection.layer.v1+json ``` From a9bdc961d37394ea882a04f74e1cdd8ed0d43bc4 Mon Sep 17 00:00:00 2001 From: "Michael S. Collier" Date: Wed, 22 Nov 2023 15:11:23 -0500 Subject: [PATCH 014/140] Add Logic App Standard Template (#326) * Add Logic App Standard Template * Remove individual template from ociReference. Co-authored-by: Samruddhi Khandale --------- Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 8095efce..597d7983 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -623,3 +623,8 @@ contact: https://github.com/brokenpip3/devcontainers-bats/issues repository: https://github.com/brokenpip3/devcontainers-bats ociReference: ghcr.io/brokenpip3/devcontainers-bats +- name: Logic App Standard Template + maintainer: mcollier + contact: https://github.com/mcollier/logic-app-dev-container-template/issues + repository: https://github.com/mcollier/logic-app-dev-container-template + ociReference: ghcr.io/mcollier/logic-app-dev-container-template \ No newline at end of file From 869745b691f87c3dae854615e63ced20f09056be Mon Sep 17 00:00:00 2001 From: Pablo Ulloa Date: Mon, 27 Nov 2023 13:58:33 -0300 Subject: [PATCH 015/140] Update collection-index.yml (#327) Add DevContainer Features such as LaTeX Workshop --- _data/collection-index.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 597d7983..49212ec5 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -627,4 +627,9 @@ maintainer: mcollier contact: https://github.com/mcollier/logic-app-dev-container-template/issues repository: https://github.com/mcollier/logic-app-dev-container-template - ociReference: ghcr.io/mcollier/logic-app-dev-container-template \ No newline at end of file + ociReference: ghcr.io/mcollier/logic-app-dev-container-template +- name: Additional Dev Container Features by prulloac + maintainer: prulloac + contact: https://github.com/prulloac/devcontainer-features/issues + repository: https://github.com/prulloac/devcontainer-features + ociReference: ghcr.io/prulloac/devcontainer-features From 99989f84862eb1b60e152170dabeb2b47ab472c5 Mon Sep 17 00:00:00 2001 From: Lumen Lohn Date: Wed, 6 Dec 2023 21:25:30 -0300 Subject: [PATCH 016/140] Add lumenpink collection to collection-index.yml (#332) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 49212ec5..e79611e7 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -633,3 +633,8 @@ contact: https://github.com/prulloac/devcontainer-features/issues repository: https://github.com/prulloac/devcontainer-features ociReference: ghcr.io/prulloac/devcontainer-features +- name: Additional Dev Container Features by LumenPink + maintainer: lumenpink + contact: https://github.com/lumenpink/devcontainer-features/issues + repository: https://github.com/lumenpink/devcontainer-features + ociReference: ghcr.io/lumenpink/devcontainer-features From 4573fbf211cb332e8bbb94f85b830818a5333ac3 Mon Sep 17 00:00:00 2001 From: Shukri Date: Fri, 15 Dec 2023 01:45:35 +0100 Subject: [PATCH 017/140] Add Mohd Shukri Hasan's devcontainer templates (#335) * Add Mohd Shukri Hasan's devcontainer templates * add repository link --- _data/collection-index.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index e79611e7..64905aa1 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -638,3 +638,9 @@ contact: https://github.com/lumenpink/devcontainer-features/issues repository: https://github.com/lumenpink/devcontainer-features ociReference: ghcr.io/lumenpink/devcontainer-features +- name: Templates by Mohd Shukri Hasan + maintainer: Mohd Shukri Hasan + contact: https://github.com/hsm207/devcontainer-templates/issues + repository: https://github.com/hsm207/devcontainer-templates + ociReference: ghcr.io/hsm207/devcontainer-templates + From ab51666a8897fcc18f999905e29062d3c7082a88 Mon Sep 17 00:00:00 2001 From: CASL0 Date: Wed, 3 Jan 2024 03:27:21 +0900 Subject: [PATCH 018/140] Update collection-index.yml (#338) --- _data/collection-index.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 64905aa1..383905ae 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -643,4 +643,8 @@ contact: https://github.com/hsm207/devcontainer-templates/issues repository: https://github.com/hsm207/devcontainer-templates ociReference: ghcr.io/hsm207/devcontainer-templates - +- name: Dev Container Features by CASL0 + maintainer: CASL0 + contact: https://github.com/CASL0/devcontainer-features/issues + repository: https://github.com/CASL0/devcontainer-features + ociReference: ghcr.io/casl0/devcontainer-features From 87aad0c91a58b3f32dd5eaa3d950d6a1f5d93e0e Mon Sep 17 00:00:00 2001 From: Alex Ravenna Date: Sat, 6 Jan 2024 01:09:26 +0100 Subject: [PATCH 019/140] fix broken link (#340) --- _implementors/reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_implementors/reference.md b/_implementors/reference.md index 512b44be..6d75dd56 100644 --- a/_implementors/reference.md +++ b/_implementors/reference.md @@ -143,4 +143,4 @@ See the [Dev Container metadata reference](../json_reference) for information on If you are behind a firewall that needs to allow specific domains used by the Dev Container CLI, here's the list of hostnames you should allow communication to go through: * `containers.dev` - The [homepage](https://containers.dev/) for everything about dev containers. It includes all official and community-supported [Features](https://containers.dev/features) and [Templates](https://containers.dev/templates). -* `ghcr.io`, `*.azurecr.io`, `mcr.microsoft.com` - [OCI registries](https://containers.dev/implementors/features-distribution/#oci-registry) like [GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry), [Azure Container Registry](azure.microsoft.com/en-us/products/container-registry), and [Microsoft Container Registry](https://mcr.microsoft.com/en-us/catalog?search=dev%20container) serves as the primary distribution mechanism for dev container resources. \ No newline at end of file +* `ghcr.io`, `*.azurecr.io`, `mcr.microsoft.com` - [OCI registries](https://containers.dev/implementors/features-distribution/#oci-registry) like [GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry), [Azure Container Registry](https://azure.microsoft.com/en-us/products/container-registry), and [Microsoft Container Registry](https://mcr.microsoft.com/en-us/catalog?search=dev%20container) serves as the primary distribution mechanism for dev container resources. \ No newline at end of file From d4239432f71fa1a4a5ac485f3d2a98dd65ad5dbd Mon Sep 17 00:00:00 2001 From: Sam G Date: Thu, 18 Jan 2024 18:24:39 -0500 Subject: [PATCH 020/140] added goldsam's features repo to the index (#341) * added goldsam's features repo to the index * update dev containers repo reference name --------- Co-authored-by: Sam Goldmann --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 383905ae..84674478 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -648,3 +648,8 @@ contact: https://github.com/CASL0/devcontainer-features/issues repository: https://github.com/CASL0/devcontainer-features ociReference: ghcr.io/casl0/devcontainer-features +- name: Development Container Features by goldsam + maintainer: goldsam + contact: https://github.com/goldsam/dev-container-features/issues + repository: https://github.com/goldsam/dev-container-features + ociReference: ghcr.io/goldsam/dev-container-features From 5d58bb70a33a447ce3a1d471840642d6f9754c92 Mon Sep 17 00:00:00 2001 From: Tatsuro Shibamura Date: Tue, 23 Jan 2024 01:29:20 +0900 Subject: [PATCH 021/140] Add Azure Functions templates to collection-index.yml (#334) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 84674478..0a985ce1 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -653,3 +653,8 @@ contact: https://github.com/goldsam/dev-container-features/issues repository: https://github.com/goldsam/dev-container-features ociReference: ghcr.io/goldsam/dev-container-features +- name: Azure Functions Dev Container Templates + maintainer: Tatsuro Shibamura + contact: https://github.com/shibayan/devcontainers/issues + repository: https://github.com/shibayan/devcontainers + ociReference: ghcr.io/shibayan/devcontainers \ No newline at end of file From f69998dde42f8ac4248b94b017f80cc799187368 Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Tue, 23 Jan 2024 16:52:35 -0800 Subject: [PATCH 022/140] tip: Writing scripts to known container path (#298) * tip: Writing scripts to known container path * Update _implementors/features.md Co-authored-by: Brigit Murtaugh * Update _implementors/features.md Co-authored-by: Brigit Murtaugh --------- Co-authored-by: Brigit Murtaugh --- _implementors/features.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/_implementors/features.md b/_implementors/features.md index cab5379d..dcacd683 100644 --- a/_implementors/features.md +++ b/_implementors/features.md @@ -82,6 +82,40 @@ If a Feature provides a given command with the [object syntax](/implementors/jso > **Note**: These properties are stored within [image metadata](/implementors/spec/#merge-logic). +#### Writing scripts to known container path + +It may be helpful for a Feature to write scripts to a known, persistent path within the container (i.e. for later use in a given lifecycle hook). + +Take for instance the `git-lfs` Feature, which [writes a script](https://github.com/devcontainers/features/blob/4fca96b5e8a4bfc93679098cb19d73c65ce571eb/src/git-lfs/install.sh#L190-L216) to `/usr/local/share/pull-git-lfs-artifacts.sh` during installation. + +##### install.sh +```bash +PULL_GIT_LFS_SCRIPT_PATH="/usr/local/share/pull-git-lfs-artifacts.sh" + +tee "$PULL_GIT_LFS_SCRIPT_PATH" > /dev/null \ +<< EOF +#!/bin/sh +set -e +<...truncated...> +EOF +``` + +This script is then executed during the [`postCreateCommand` lifecycle hook](https://github.com/devcontainers/features/blob/4fca96b5e8a4bfc93679098cb19d73c65ce571eb/src/git-lfs/devcontainer-feature.json#L23). + +##### devcontainer-feature.json +```jsonc +{ + "id": "git-lfs", + "version": "1.1.0", + "name": "Git Large File Support (LFS)", + // <...truncated...> + "postCreateCommand": "/usr/local/share/pull-git-lfs-artifacts.sh", + "installsAfter": [ + "ghcr.io/devcontainers/features/common-utils" + ] +} +``` + ### The `options` property The options property contains a map of option IDs and their related configuration settings. The ID becomes the name of the environment variable in all caps. See [option resolution](#option-resolution) for more details. For example: From 6c961bf068bdb1b8a830cc03804bd05fc4ab8ade Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Wed, 24 Jan 2024 09:28:54 -0800 Subject: [PATCH 023/140] Add Dependabot guide (#342) * dependabot * Update 2024-01-23-dependabot.md --- _posts/2024-01-23-dependabot.md | 81 ++++++++++++++++++++++++++++++++ img/dependabot-pr.png | Bin 0 -> 97358 bytes 2 files changed, 81 insertions(+) create mode 100644 _posts/2024-01-23-dependabot.md create mode 100644 img/dependabot-pr.png diff --git a/_posts/2024-01-23-dependabot.md b/_posts/2024-01-23-dependabot.md new file mode 100644 index 00000000..dd73a371 --- /dev/null +++ b/_posts/2024-01-23-dependabot.md @@ -0,0 +1,81 @@ +--- +layout: post +title: "General Availability of Dependabot Integration" +author: + - "@joshspicer" +authorUrl: + - https://github.com/joshspicer +--- + +We are excited to announce that starting today, in collaboration with the Dependabot Team, the `devcontainers` package ecosystem is now generally available! + Dependabot will now be able to update your public Dev Container [Features](https://containers.dev/features), keeping them up-to-date with the latest published versions. + + To opt-in, add a `.github/dependabot.yml` to a repository containing one or more `devcontainer.json` configuration files: + + ```yaml +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "devcontainers" # See documentation for possible values + directory: "/" + schedule: + interval: weekly + ``` + +Once configured, Dependabot will begin to create pull requests to update your Dev Container Features: + + +
+ Dependabot PR +
+ +An example diff generated by Dependabot is shown below: + +```diff +--- + .devcontainer-lock.json | 8 ++++---- + .devcontainer.json | 2 +- + 2 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/.devcontainer-lock.json b/.devcontainer-lock.json +index 324582b..a3868d9 100644 +--- a/.devcontainer-lock.json ++++ b/.devcontainer-lock.json +@@ -1,9 +1,9 @@ + { + "features": { +- "ghcr.io/devcontainers/features/docker-in-docker:1": { +- "version": "1.0.9", +- "resolved": "ghcr.io/devcontainers/features/docker-in-docker@sha256:b4c04ba88371a8ec01486356cce10eb9fe8274627d8d170aaec87ed0d333080d", +- "integrity": "sha256:b4c04ba88371a8ec01486356cce10eb9fe8274627d8d170aaec87ed0d333080d" ++ "ghcr.io/devcontainers/features/docker-in-docker:2": { ++ "version": "2.7.1", ++ "resolved": "ghcr.io/devcontainers/features/docker-in-docker@sha256:f6a73ee06601d703db7d95d03e415cab229e78df92bb5002e8559bcfc047fec6", ++ "integrity": "sha256:f6a73ee06601d703db7d95d03e415cab229e78df92bb5002e8559bcfc047fec6" + } + } + } +\ No newline at end of file +diff --git a/.devcontainer.json b/.devcontainer.json +index e9d9af5..9eb9165 100644 +--- a/.devcontainer.json ++++ b/.devcontainer.json +@@ -1,6 +1,6 @@ + { + "image": "mcr.microsoft.com/devcontainers/base:jammy", + "features": { +- "ghcr.io/devcontainers/features/docker-in-docker:1": {} ++ "ghcr.io/devcontainers/features/docker-in-docker:2": {} + } + } +``` + + This updater ensures publicly-accessible Features are pinned to the latest version in the associated `devcontainer.json` file. If a dev container has an associated lockfile, that file will also be updated. For more information on lockfiles, see this [specification](https://github.com/devcontainers/spec/blob/main/docs/specs/devcontainer-lockfile.md). + +Features in any [valid dev container location](https://containers.dev/implementors/spec/#devcontainerjson) will be updated in a single pull request. + +Dependabot version updates are free to use for all repositories on GitHub.com. For more information [see the Dependabot version update documentation](https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/about-dependabot-version-updates#supported-repositories-and-ecosystem). diff --git a/img/dependabot-pr.png b/img/dependabot-pr.png new file mode 100644 index 0000000000000000000000000000000000000000..b642e61a3b9b5972cc9df0073fd103aa868acd0f GIT binary patch literal 97358 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
^ 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 Date: Mon, 29 Jan 2024 18:11:29 -0500 Subject: [PATCH 024/140] add RSM Dev Container Templates to collection-index.yml (#343) --- _data/collection-index.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 0a985ce1..7b50c66f 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -583,7 +583,7 @@ contact: https://github.com/audacioustux/devcontainers/issues repository: https://github.com/audacioustux/devcontainers ociReference: ghcr.io/audacioustux/devcontainers -- name: PlantUml DevContainer +- name: PlantUml DevContainer maintainer: lnyousif contact: https://github.com/lnyousif/plantuml-devcontainer/issues repository: https://github.com/lnyousif/plantuml-devcontainer @@ -657,4 +657,9 @@ maintainer: Tatsuro Shibamura contact: https://github.com/shibayan/devcontainers/issues repository: https://github.com/shibayan/devcontainers - ociReference: ghcr.io/shibayan/devcontainers \ No newline at end of file + ociReference: ghcr.io/shibayan/devcontainers +- name: Dev Container Templates by RSM HCD Engineering + maintainer: RSM HCD Engineering + contact: https://github.com/rsm-hcd + repository: https://github.com/rsm-hcd/devcontainer-templates + ociReference: ghcr.io/rsm-hcd/devcontainer-templates From 9f4619f43cef5c83eb9ed958ca0596cd26bd7dd4 Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Wed, 31 Jan 2024 13:23:33 -0800 Subject: [PATCH 025/140] Update Feature dependency docs to match spec (#344) * update Feature dependency docs to match https://github.com/devcontainers/spec/commit/9ba6c9e90f982a31b09562c72d4d30e61d8c4ed9 * Update _implementors/features.md Co-authored-by: Brigit Murtaugh --------- Co-authored-by: Brigit Murtaugh --- _implementors/features-distribution.md | 31 ++++- _implementors/features.md | 174 +++++++++++++++++++++---- 2 files changed, 176 insertions(+), 29 deletions(-) diff --git a/_implementors/features-distribution.md b/_implementors/features-distribution.md index 6ef56cfc..134c9c1c 100644 --- a/_implementors/features-distribution.md +++ b/_implementors/features-distribution.md @@ -97,7 +97,7 @@ An OCI registry that implements the [OCI Artifact Distribution Specification](ht Each packaged Feature is pushed to the registry following the naming convention `//[:version]`, where version is the major, minor, and patch version of the Feature, according to the semver specification. -> **Note:** The `namespace` is a unique indentifier for the collection of Features. There are no strict rules for the `namespace`; however, one pattern is to set `namespace` equal to source repository's `/`. +> **Note:** The `namespace` is a unique identifier for the collection of Features. There are no strict rules for the `namespace`; however, one pattern is to set `namespace` equal to source repository's `/`. A custom media type `application/vnd.devcontainers` and `application/vnd.devcontainers.layer.v1+tar` are used as demonstrated below. @@ -135,6 +135,35 @@ oras push ${REGISTRY}/${NAMESPACE}:latest \ ./devcontainer-collection.json:application/vnd.devcontainers.collection.layer.v1+json ``` +Additionally, an [annotation](https://github.com/opencontainers/image-spec/blob/main/annotations.md) named `dev.containers.metadata` should be populated on the manifest when published by an implementing tool. This annotation is the escaped JSON object of the entire `devcontainer-feature.json` as it appears during the [packaging stage](#packaging). + +An example manifest with the `dev.containers.metadata` annotation: + +```json +{ + "schemaVersion": 2, + "mediaType": "application/vnd.oci.image.manifest.v1+json", + "config": { + "mediaType": "application/vnd.devcontainers", + "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "layers": [ + { + "mediaType": "application/vnd.devcontainers.layer.v1+tar", + "digest": "sha256:738af5504b253dc6de51d2cb1556cdb7ce70ab18b2f32b0c2f12650ed6d2e4bc", + "size": 3584, + "annotations": { + "org.opencontainers.image.title": "devcontainer-feature-myFeature.tgz" + } + } + ], + "annotations": { + "dev.containers.metadata": "{\"name\": \"My Feature\",\"id\": \"myFeature\",\"version\": \"1.0.0\",\"dependsOn\": {\"ghcr.io/myotherFeature:1\": {\"flag\": true},\"features.azurecr.io/aThirdFeature:1\": {},\"features.azurecr.io/aFourthFeature:1.2.3\": {}}}" + } +} +``` + ### Directly referencing a tarball A Feature can be referenced directly in a user's [`devcontainer.json`](../spec#a-hrefdevcontainerjson-namedevcontainerjson-classanchor-devcontainerjson-a) file by HTTPS URI that points to the tarball from the [package step](#packaging). diff --git a/_implementors/features.md b/_implementors/features.md index dcacd683..74127c3a 100644 --- a/_implementors/features.md +++ b/_implementors/features.md @@ -52,12 +52,15 @@ The properties of the file are as follows: | `securityOpt` | array | Sets container security options like updating the [seccomp profile](https://docs.docker.com/engine/security/seccomp/) when the Feature is used. | | `entrypoint` | string | Set if the feature requires an "entrypoint" script that should fire at container start up. | | `customizations` | object | Product specific properties, each namespace under `customizations` is treated as a separate set of properties. For each of this sets the object is parsed, values are replaced while arrays are set as a union. | -| `installsAfter` | array | Array of ID's of Features (omitting a version tag) that should execute before this one. Allows control for Feature authors on soft dependencies between different Features. | +| `dependsOn` | object | An object (\**) of Feature dependencies that **must** be satisified before this Feature is installed. Elements follow the same semantics of the `features` object in `devcontainer.json`. [See *Installation Order* for further information](#installation-order). | +| `installsAfter` | array | Array of ID's of Features (omitting a version tag) that should execute before this one. Allows control for Feature authors on soft dependencies between different Features. [See *Installation Order* for further information](#installation-order). | | `legacyIds` | array | Array of old IDs used to publish this Feature. The property is useful for renaming a currently published Feature within a single namespace. | | `deprecated` | boolean | Indicates that the Feature is deprecated, and will not receive any further updates/support. This property is intended to be used by the supporting tools for highlighting Feature deprecation. | | `mounts` | object | Defaults to unset. Cross-orchestrator way to add additional mounts to a container. Each value is an object that accepts the same values as the [Docker CLI `--mount` flag](https://docs.docker.com/engine/reference/commandline/run/#mount). The Pre-defined [devcontainerId](/implementors/json_reference#variables-in-devcontainerjson) variable may be referenced in the value. For example:
`"mounts": [{ "source": "dind-var-lib-docker", "target": "/var/lib/docker", "type": "volume" }]` | {: .table .table-bordered .table-responsive} +(**) The ID must refer to either a Feature (1) published to an OCI registry, (2) a Feature Tgz URI, or (3) a Feature in the local file tree. Deprecated Feature identifiers (i.e GitHub Release) are not supported and the presence of this property may be considered a fatal error or ignored. For [local Features (ie: during development)](../features-distribution#addendum-locally-referenced), you may also depend on other local Features by providing a relative path to the Feature, relative to folder containing the active `devcontainer.json`. This behavior of Features within this property again mirror the `features` object in `devcontainer.json`. + ### Lifecycle Hooks @@ -303,47 +306,162 @@ To ensure that the appropriate shell is used, the execute bit should be set on ` By default, Features are installed on top of a base image in an order determined as optimal by the implementing tool. -If any of the following properties are provided in the Feature's `devcontainer-feature.json`, or the user's `devcontainer.json`, the order indicated by these propert(ies) are respected (with decreasing precedence). +If any of the following properties are provided in the Feature's `devcontainer-feature.json`, or the user's `devcontainer.json`, the order indicated by these propert(ies) are respected. + +* The `dependsOn` property defined as a part of a Feature's `devcontainer-feature.json`. +* The `installsAfter` property defined as part of a Feature's `devcontainer-feature.json`. +* The `overrideFeatureInstallOrder` property in user's `devcontainer.json`. Allows users to control the order of execution of their Features. -1. The `overrideFeatureInstallOrder` property in user's `devcontainer.json`. Allows users to control the order of execution of their Features. -2. The `installsAfter` property defined as part of a Feature's `devcontainer-feature.json`. +#### dependsOn -#### (1) The `overrideFeatureInstallOrder` property +The optional `dependsOn` property indicates a set of required, "hard" dependencies for a given Feature. -This property is declared by the user in their `devcontainer.json` file. +The `dependsOn` property is declared in a Feature's `devcontainer-feature.json` metadata file. Elements of this property mirror the semantics of the `features` object in `devcontainer.json`. Therefore, all dependencies may provide the relevant options, or an empty object (eg: `"bar:123": {}`) if the Feature's default options are sufficient. Identical Features that provide different options are treated as _different_ Features (see [Feature equality](#definition-feature-equality) for more info). -Any **un-versioned** Feature IDs listed in this array will be installed before all other Features, in the provided order. Any omitted Features will be installed in an order selected by the implementing tool, or ordered via the `installsAfter` property _after_ any Features listed in the `overrideFeatureInstallOrder` array, if applicable. +All Features indicated in the `dependsOn` property **must** be satisfied (a Feature [equal](#definition-feature-equality) to each dependency is present in the installation order) _before_ the given Feature is set to be installed. If any of the Features indicated in the `dependsOn` property cannot be installed (e.g due to circular dependency, failure to resolve the Feature, etc) the entire dev container creation should fail. -All un-versioned Feature `id`s provided in `overrideFeatureInstallOrder` must also exist in the `features` property of a user's `devcontainer.json`. For instance, all the Features which follows the OCI registry format would include everything except for the label that contains the version (`//` without the `:`). +The `dependsOn` property must be evaluated recursively. Therefore, if a Feature dependency has its own `dependsOn` property, that Feature's dependencies must also be satisfied before the given Feature is installed. -Example: +```json +{ + "name": "My Feature", + "id": "myFeature", + "version": "1.0.0", + "dependsOn": { + "foo:1": { + "flag": true + }, + "bar:1.2.3": {}, + "baz@sha256:a4cdc44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" {}, + } +} ``` - "features": { - "ghcr.io/devcontainers/features/java:1", - "ghcr.io/devcontainers/features/node:1", - }, - "overrideFeatureInstallOrder": [ - "ghcr.io/devcontainers/features/node" - ] + +In the snippet above, `myfeature` MUST be installed after `foo`, `bar`, and `baz`. If the Features provided via the `dependsOn` property declare their own dependencies, those must also be satisfied before the Feature is installed. + +#### installsAfter + +The `installsAfter` property indicates a "soft dependency" that influences the installation order of Features that are already queued to be installed. The effective behavior of this property is the same as `dependsOn`, with the following differences: + +- `installsAfter` is **not** evaluated recursively. +- `installsAfter` only influences the installation order of Features that are **already set to be installed**. Any Feature not set to be installed after (1) resolving the `dependsOn` dependency tree or (2) indicated by the user's `devcontainer.json` should not be added to the installation list. +- The Feature indicated by `installsAfter` can **not** provide options, nor are they able to be pinned to a specific version tag or digest. Resolution to the canonical name should still be performed (eg: If the Feature has been [renamed](#steps-to-rename-a-feature)). + +``` +{ + "name": "My Feature", + "id": "myFeature", + "version": "1.0.0", + "installsAfter": [ + "foo", + "bar" + ] +} ``` -| Property | Type | Description | -| :--- | :--- | :--- | -| `overrideFeatureInstallOrder` | array | Array consisting of the Feature `id` (without the semantic version) of Features in the order the user wants them to be installed. | -{: .table .table-bordered .table-responsive} +In the snippet above, `myfeature` must be installed after `foo` and `bar` **if** the Feature is already queued to be installed. If `second` and `third` are not already queued to be installed, this dependency relationship should be ignored. -#### (2) The `installsAfter` Feature property +#### overrideFeatureInstallOrder -This property is defined in an individual feature's `devcontainer-feature.json` file by the feature author. `installsAfter` allows an author to provide the tooling hints on loose dependencies between Features. +The `overrideFeatureInstallOrder` property of `devcontainer.json` is an array of Feature IDs that are to be installed in descending priority order as soon as its dependencies outlined above are installed. -> This property is mostly useful for optimizing build time (by reordering the Feature installation to reduce installing a required CLI twice, for example). Ideally, all Features should be able to fully install themselves without requiring another Feature to be pre-installed. +> This property may not indicate an installation order that is inconsistent with the resolved dependency graph (see [dependency algorithm](#dependency-installation-order-algorithm)). If the `overrideFeatureInstallOrder` property is inconsistent with the dependency graph, the implementing tool should fail the dependency resolution step. -After `overrideFeatureInstallOrder` is resolved, any remaining Features that declare an `installsAfter` must be installed after the Features declared in the property, provided that the features have also been declared in the `features` property. +This evaluation is performed by assigning a [`roundPriority`](#2-assigning-round-priority) to all nodes that match match the Feature identifier (version omitted) present in the property. -| Property | Type | Description | -| :--- | :--- | :--- | -| `installsAfter` | array | Array consisting of the Feature `id` (omitting a version tag) that should be installed before the given Feature | -{: .table .table-bordered .table-responsive} +For example, given `n` Features in the `overrideFeatureInstallOrder` array, the orchestrating tool should assign a `roundPriority` of `n - idx` to each Feature, where `idx` is the zero-based index of the Feature in the array. + +For example: + +```javascript +overrideFeatureInstallOrder = [ + "foo", + "bar", + "baz" +] +``` + +would result in the following `roundPriority` assignments: + +```javascript +const roundPriority = { + "foo": 3, + "bar": 2, + "baz": 1 +} +``` + +This property must not influence the dependency relationship as defined by the dependency graph (see [dependency graph](#1-build-a-dependency-graph)) and shall only be evaulated at the round-based sorting step (see [round sort](#3-round-based-sorting)). Put another way, this property cannot "pull forward" a Feature until all of its dependencies (both soft and hard) have been installed. After a Feature's dependencies have been installed in other rounds, this property should "pull forward" each Feature as early as possible (given the order of identifiers in the array). + +Similar to `installsAfter`, this property's members may not provide options, nor are they able to be pinned to a specific version tag or digest. + +If a Feature is indicated in `overrideFeatureInstallOrder` but not a member of the dependency graph (it is not queued to be installed), the orchestrating tool may fail the dependency resolution step. + +> ## Definitions +> ### Definition: Feature Equality + +> +> This specification defines two Features as equal if both Features point to the same exact contents and are executed with > the same options. +> +> **For Features published to an OCI registry**, two Feature are identical if their manifest digests are equal, and the > options executed against the Feature are equal (compared value by value). Identical manifest digests implies that the tgz contents of the Feature and its entire `devcontainer-feature.json` are identical. If any of these conditions are not met, the Features are considered not equal. +> +> **For Features fetched by HTTPS URI**, two Features are identical if the contents of the tgz are identical (hash to the > same value), and the options executed against the Feature are equal (compared value by value). If any of these conditions are not met, the Features are considered not equal. +> +> **For local Features**, each Feature is considered unique and not equal to any other local Feature. +> +> ### Definition: Round Stable Sort + +> +> To prevent non-deterministic behavior, the algorithm will sort each **round** according to the following rules: +> +> - Compare and sort each Feature lexiographically by their fully qualified resource name (For OCI-published Features, that means the ID without version or digest.). If the comparison is equal: +> - Compare and sort each Feature from oldest to newest tag (`latest` being the "most new"). If the comparision is equal: +> - Compare and sort each Feature by their options by: +> - Greatest number of user-defined options (note omitting an option will default that value to the Feature's default value and is not considered a user-defined option). If the comparison is equal: +> - Sort the provided option keys lexicographically. If the comparison is equal: +> - Sort the provided option values lexicographically. If the comparision is equal: +> - Sort Features by their canonical name (For OCI-published Features, the Feature ID resolved to the digest hash). +> +> If there is no difference based on these comparator rules, the Features are considered equal. + +> ## Dependency installation order algorithm +> +> An implementing tool is responsible for calculating the Feature installation order (or providing an error if no valid installation order can be resolved). The set of Features to be installed is the union of user-defined Features (those directly indicated in the user's `devcontainer.json` and their dependencies (those indicated by the `dependsOn` or `installsAfter` property, taking into account the user dev container's `overrideFeatureInstallOrder` property). The implmenting tool will perform the following steps: +> +> ### (1) Build a dependency graph +> +> From the user-defined Features, the orchestrating tool will build a dependency graph. The graph will be built by traversing the `dependsOn` and `installsAfter` properties of each Feature. The metadata for each dependency is then fetched and the node added as an edge to to the dependent Feature. For `dependsOn` dependencies, the dependency will be fed back into the worklist to be recursively resolved. +> +> An accumulator is maintained with all uniquely discovered and user-provided Features, each with a reference to its dependencies. If the exact Feature (see **Feature Equality**) has already been added to the accumulator, it will not be added again. The accumulator will be fed into (B3) after the Feature tree has been resolved. +> +> The graph may be stored as an adjacency list with two kinds of edges (1) `dependsOn` edges or "hard dependencies" and (2) `installsAfter` edges or "soft dependencies". +> +> ### (2) Assigning round priority +> +> Each node in the graph has an implicit, default `roundPriority` of 0. +> +> To influence installation order globally while still honoring the dependency graph of built in **(1)**, `roundPriority` values may be tweaks for each Feature. When each round is calculated in **(3)**, only the Features equal to the max `roundPriority` of that set will be committed (the remaining will be > uncommitted and reevaulated in subsequent rounds). +> +> The `roundPriority` is set to a non-zero value in the following instances: +> +> - If the [`devcontainer.json` contains an `overrideFeatureInstallOrder`](#overrideFeatureInstallOrder). +> +> #### (3) Round-based sorting +> +> Perform a sort on the result of **(1)** in rounds. This sort will rearrange Features, producing a sorted list of Features to install. The sort will be performed as follows: +> +> Start with all the elements from **(2)** in a `worklist` and an empty list `installationOrder`. While the `worklist` is not empty, iterate through each element in the `worklist` and check if all its dependencies (if any) are already members of `installationOrder`. If the check is true, add it to an intermediate list `round` If not, skip it. Equality is determined in **Feature Equality**. +> +> Then for each intermediate `round` list, commit to `installationOrder` only those nodes who share the maximum `roundPriority`. Return all nodes in `round` with a strictly lower `roundPriority` to the `worklist` to be reprocessed in subsequent iterations. If there are multiple nodes with the same `roundPriority`, commit them to `installationOrder` with a final sort according to **Round Stable Sort**. +> +> Repeat for as many rounds as necessary until `worklist` is empty. If there is ever a round where no elements are added to `installationOrder`, the algorithm should terminate and return an error. This indicates a circular dependency or other fatal error in the dependency graph. Implementations should attempt to provide the user with information about the error and possible mitigation strategies. +> +> ### Notes +> +> From an implementation point of view, `installsAfter` nodes may be added as a separate set of directed edges, just as `dependsOn` nodes are added as directed edges (see **(1)**). Before round-based installation and sorting **(3)**, an orchestrating tool should remove all `installsAfter` directed edges that do not correspond with a Feature in the `worklist` that is set to be installed. In each round, a Feature can then be installed if all its requirements (both `dependsOn` and `installsAfter` dependencies) have been fulfilled in previous rounds. +> +> An implemention should fail the dependency resolution step if the evaluation of the `installsAfter` property results in an inconsistent state (eg: a circular dependency). +> ### Option Resolution From 4501ecd51cdc9fca36019121e81d3ad6b99fef37 Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Wed, 31 Jan 2024 14:25:37 -0800 Subject: [PATCH 026/140] Update `python` Feature Id (#345) --- _implementors/features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_implementors/features.md b/_implementors/features.md index 74127c3a..9608b65b 100644 --- a/_implementors/features.md +++ b/_implementors/features.md @@ -513,7 +513,7 @@ The user's `devcontainer.json` declared the python Feature like so: ```jsonc "features": { - "python": { + "ghcr.io/devcontainers/features/python:1": { "version": "3.10", "pip": false } From d4d6c2c8b61e74b1d59827de5a774c73c6da3446 Mon Sep 17 00:00:00 2001 From: Bruno-Pier <50412835+BrunoB81HK@users.noreply.github.com> Date: Thu, 1 Feb 2024 15:55:43 -0500 Subject: [PATCH 027/140] Add ROS 2 workspace template collection (#346) * Add ROS 2 workspace template collection * Fixed ociReference capitalization Co-authored-by: Samruddhi Khandale --------- Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 7b50c66f..f3327dbf 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -268,6 +268,11 @@ contact: https://github.com/ijnek/ros-devcontainer-template/issues repository: https://github.com/ijnek/ros-devcontainer-template ociReference: ghcr.io/ijnek/ros-devcontainer-template +- name: ROS 2 Workspace Templates + maintainer: Bruno-Pier Busque + contact: https://github.com/BrunoB81HK/ros2-workspace-devcontainer-template/issues + repository: https://github.com/BrunoB81HK/ros2-workspace-devcontainer-template + ociReference: ghcr.io/brunob81hk/ros2-workspace-devcontainer-template - name: Assorted Features maintainer: r3dpoint contact: https://github.com/r3dpoint/devcontainer-features/issues From 269108900b89058503434f76536161eb3d37ff52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niko=20B=C3=B6ckerman?= Date: Mon, 5 Feb 2024 19:24:35 +0200 Subject: [PATCH 028/140] Add nikobockerman features repo to the index (#348) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index f3327dbf..30def8a1 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -668,3 +668,8 @@ contact: https://github.com/rsm-hcd repository: https://github.com/rsm-hcd/devcontainer-templates ociReference: ghcr.io/rsm-hcd/devcontainer-templates +- name: Dev Container Features by Niko Böckerman + maintainer: Niko Böckerman + contact: https://github.com/nikobockerman + repository: https://github.com/nikobockerman/devcontainer-features + ociReference: ghcr.io/nikobockerman/devcontainer-features From 445d7a9567111af8b634b01e91f1450bbe752425 Mon Sep 17 00:00:00 2001 From: Marcos Gomes Neto Date: Tue, 6 Feb 2024 14:28:03 -0300 Subject: [PATCH 029/140] Update collection-index.yml (#350) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 30def8a1..549189cd 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -673,3 +673,8 @@ contact: https://github.com/nikobockerman repository: https://github.com/nikobockerman/devcontainer-features ociReference: ghcr.io/nikobockerman/devcontainer-features +- name: Bun.sh Runtime Dev Container Templates + maintainer: Marcos Gomes Neto + contact: https://github.com/marcosgomesneto/bun-devcontainers/issues + repository: https://github.com/marcosgomesneto/bun-devcontainers + ociReference: ghcr.io/marcosgomesneto/bun-devcontainers From f6ceb6e2a9b2ce3410a8c8806209e2fe9b3e09db Mon Sep 17 00:00:00 2001 From: Georg Ofenbeck Date: Tue, 6 Feb 2024 18:35:27 +0100 Subject: [PATCH 030/140] contributing my feature wrappers for https://github.com/nvbn/thefuck (#349) * preping PR to add thefuck to the public index * Update _data/collection-index.yml Co-authored-by: Samruddhi Khandale --------- Co-authored-by: Georg Ofenbeck - taaofge1 Co-authored-by: Samruddhi Khandale Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 549189cd..e009dc90 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -668,6 +668,11 @@ contact: https://github.com/rsm-hcd repository: https://github.com/rsm-hcd/devcontainer-templates ociReference: ghcr.io/rsm-hcd/devcontainer-templates +- name: Additional Dev Container Features by Georg Ofenbeck + maintainer: Georg Ofenbeck + contact: https://github.com/GeorgOfenbeck/features/issues + repository: https://github.com/GeorgOfenbeck/features + ociReference: ghcr.io/georgofenbeck/features - name: Dev Container Features by Niko Böckerman maintainer: Niko Böckerman contact: https://github.com/nikobockerman From 31cebb5cf8c609530ebcb1e24f819640f4dc642e Mon Sep 17 00:00:00 2001 From: Mikael Koskinen Date: Fri, 9 Feb 2024 20:53:16 +0200 Subject: [PATCH 031/140] Updated with Weik.io Devcontainer Templates (#351) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index e009dc90..246748d1 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -683,3 +683,8 @@ contact: https://github.com/marcosgomesneto/bun-devcontainers/issues repository: https://github.com/marcosgomesneto/bun-devcontainers ociReference: ghcr.io/marcosgomesneto/bun-devcontainers +- name: Weik.io Dev Container Templates + maintainer: Mikael Koskinen + contact: https://github.com/weikio/devcontainer-templates/issues + repository: https://github.com/weikio/devcontainer-templates + ociReference: ghcr.io/weikio/devcontainer-templates From 23e94bf7520865d74beef3006f1bdc264f039ab7 Mon Sep 17 00:00:00 2001 From: Hans Spaans Date: Tue, 20 Feb 2024 20:12:06 +0100 Subject: [PATCH 032/140] Update collection-index.yml (#355) Adding reference to a collection of devcontainer features --- _data/collection-index.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 246748d1..afaf7532 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -687,4 +687,9 @@ maintainer: Mikael Koskinen contact: https://github.com/weikio/devcontainer-templates/issues repository: https://github.com/weikio/devcontainer-templates - ociReference: ghcr.io/weikio/devcontainer-templates + ociReference: ghcr.io/weikio/devcontainer-templates +- name: Dev Container Features by Hans Spaans + maintainer: Hans Spaans + contact: https://github.com/hspaans/devcontainer-features/issues + repository: https://github.com/hspaans/devcontainer-features + ociReference: ghcr.io/hspaans/devcontainer-features From 6c8d915556dc06a6b0d3e53d6d4d5f56d74b2c9e Mon Sep 17 00:00:00 2001 From: Ty Schlichenmeyer Date: Wed, 21 Feb 2024 14:23:26 -0600 Subject: [PATCH 033/140] New Feature: Rye (#356) * New Feature: Rye * Update _data/collection-index.yml Co-authored-by: Samruddhi Khandale --------- Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index afaf7532..058dad9a 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -568,6 +568,11 @@ contact: https://github.com/schlich/cst-devcontainer-feature/issues repository: https://github.com/schlich/cst-devcontainer-feature ociReference: ghcr.io/schlich/cst-devcontainer-feature +- name: Rye + maintainer: Ty Schlichenmeyer + contact: https://github.com/schlich/devcontainer-features/issues + repository: https://github.com/schlich/devcontainer-features + ociReference: ghcr.io/schlich/devcontainer-features - name: Features by raucha maintainer: raucha contact: https://github.com/raucha/devcontainer-features/issues From 628e1ad05516e28db419d8e0ed720fda860ef49b Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Thu, 22 Feb 2024 11:24:06 -0800 Subject: [PATCH 034/140] Add search functionality on collections, Features, Templates (#325) * Initial changes * Borders * Revert changes * Add search functionality and styling to collection table * Add GHPRI * Restore original file * Add search functionality and style to collection table * Revert * Add search functionality to collection table * Revert * Add search functionality and improve table layout in collections.html * Revert change * Add search functionality to collection table * Revert * Add search functionality and style table in collections.html * Refactor collections.html table layout * Add search functionality to collection table * Initial updates * Update search logic and format --------- Co-authored-by: bamurtaugh --- collections.html | 60 ++++++++++++++++++++++++++++++++---------- features.html | 68 +++++++++++++++++++++++++++++++++--------------- templates.html | 47 ++++++++++++++++++++++++++------- 3 files changed, 130 insertions(+), 45 deletions(-) diff --git a/collections.html b/collections.html index 78261197..2dc28bf0 100644 --- a/collections.html +++ b/collections.html @@ -17,17 +17,49 @@

Collections

href="https://github.com/devcontainers/devcontainers.github.io/blob/gh-pages/_data/collection-index.yml">this yaml file.

- - Name - Maintainer - Repository - - -{% for c in site.data.collection-index %} - - {{ c.name }} - {{ c.maintainer | strip_html }} - {{ c.repository | strip_html }} - - -{% endfor %} \ No newline at end of file + + + +
+
+ + + + + + + + + {% for c in site.data.collection-index %} + + + + + + {% endfor %} +
NameMaintainerRepository
{{ c.name }}{{ c.maintainer | strip_html }} + {{ c.repository | strip_html + }} +
+ + \ No newline at end of file diff --git a/features.html b/features.html index ca22e28d..dc335e8e 100644 --- a/features.html +++ b/features.html @@ -18,26 +18,52 @@

Available Dev Container Featur Please note that if you need to report a Feature, you should do so through the registry hosting the Feature.

-

-

- - Feature Name - Maintainer - Reference - Latest Version - + +
+
+ + + + + + + + + + {% for c in site.data.devcontainer-index.collections %} + {% for f in c.features %} + {% if f.deprecated != true %} + + + + + + + {% endif %} + {% endfor %} + + {% endfor %} +
Feature NameMaintainerReferenceLatest Version
{{ f.name | strip_html }} + {{ c.sourceInformation.maintainer | strip_html }}{{ f.id | strip_html }}:{{ f.majorVersion | strip_html }}{{ f.version | strip_html }}
+ + \ No newline at end of file diff --git a/templates.html b/templates.html index 089fe51c..6cbcd882 100644 --- a/templates.html +++ b/templates.html @@ -16,19 +16,46 @@

Available Dev Container Templa Please note that if you need to report a Template, you should do so through the registry hosting the Template.

-

-

- - Template Name - Maintainer - + +
+
-{% for c in site.data.devcontainer-index.collections %} + + + + + + + {% for c in site.data.devcontainer-index.collections %} {% for f in c.templates %} - - + + {% endfor %} + + {% endfor %} +
Template NameMaintainer
{{ f.name | strip_html }}{{ c.sourceInformation.maintainer | strip_html }}{{ f.name | strip_html }} + {{ c.sourceInformation.maintainer | strip_html }}
+ + \ No newline at end of file From 5d444ecb6972677898eed9db716e4c1b9bf28c55 Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Thu, 22 Feb 2024 13:05:23 -0800 Subject: [PATCH 035/140] Only 2 cells (#358) Co-authored-by: bamurtaugh --- templates.html | 1 - 1 file changed, 1 deletion(-) diff --git a/templates.html b/templates.html index 6cbcd882..5acfccfe 100644 --- a/templates.html +++ b/templates.html @@ -49,7 +49,6 @@

Available Dev Container Templa for (let i = 1; i < rows.length; i++) { const name = rows[i].getElementsByTagName('td')[0].textContent.toLowerCase(); const maintainer = rows[i].getElementsByTagName('td')[1].textContent.toLowerCase(); - const repository = rows[i].getElementsByTagName('td')[2].textContent.toLowerCase(); if (name.includes(searchValue) || maintainer.includes(searchValue) || repository.includes(searchValue)) { rows[i].style.display = ''; From d7b0c254f6d9bb9afeb43210fdbd41aa68c49da0 Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Fri, 23 Feb 2024 08:42:32 -0800 Subject: [PATCH 036/140] Refactor search functionality in templates.html (#359) Co-authored-by: bamurtaugh --- templates.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates.html b/templates.html index 5acfccfe..362f8b93 100644 --- a/templates.html +++ b/templates.html @@ -50,7 +50,7 @@

Available Dev Container Templa const name = rows[i].getElementsByTagName('td')[0].textContent.toLowerCase(); const maintainer = rows[i].getElementsByTagName('td')[1].textContent.toLowerCase(); - if (name.includes(searchValue) || maintainer.includes(searchValue) || repository.includes(searchValue)) { + if (name.includes(searchValue) || maintainer.includes(searchValue)) { rows[i].style.display = ''; } else { rows[i].style.display = 'none'; From 225ac8a2fa90662543bd0ba1a4b60519f77ddc0e Mon Sep 17 00:00:00 2001 From: johnluicn <52063631+johnluicn@users.noreply.github.com> Date: Tue, 27 Feb 2024 01:25:08 +0800 Subject: [PATCH 037/140] Update collection-index.yml with devcontainer-templates by johnluicn (#360) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 058dad9a..98b20869 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -698,3 +698,8 @@ contact: https://github.com/hspaans/devcontainer-features/issues repository: https://github.com/hspaans/devcontainer-features ociReference: ghcr.io/hspaans/devcontainer-features +- name: Dev Container Templates by johnluicn + maintainer: johnluicn + contact: https://github.com/johnluicn/devcontainer-templates/issues + repository: https://github.com/johnluicn/devcontainer-templates + ociReference: ghcr.io/johnluicn/devcontainer-templates From c418d2ebe4a145b70954bd34695ab7711b0f2191 Mon Sep 17 00:00:00 2001 From: bhupendra-vaishnav <148317470+bhupendra-vaishnav@users.noreply.github.com> Date: Thu, 29 Feb 2024 18:03:23 -0700 Subject: [PATCH 038/140] Updated the file with latest spec file. (#361) * Updated the file with latest spec. * Maintained HTML tags as-is in file. * Maintained HTML table structure as-is in file. * Maintained HTML table structure as-is in file. * Maintained links as-is in file. * Changed as per review comments. * Update json_reference.md Removed extra paragraph. * Changed as per review comments. * Modified based on review comments * Update _implementors/json_reference.md "features" used with uppercase F Co-authored-by: Samruddhi Khandale * Added
character to keep the as-is page structure. * Removed extra white spaces. * Removed extra white spaces. --------- Co-authored-by: Samruddhi Khandale --- _implementors/json_reference.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/_implementors/json_reference.md b/_implementors/json_reference.md index b797e53c..5d5d96f5 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -27,13 +27,13 @@ Metadata properties marked with a 🏷️️ can be stored in the `devcontainer. | `overrideCommand` 🏷️ | boolean | Tells `devcontainer.json` supporting services / tools whether they should run `/bin/sh -c "while sleep 1000; do :; done"` when starting the container instead of the container's default command (since the container can shut down if the default command fails). Set to `false` if the default command must run for the container to function properly. Defaults to `true` for when using an image Dockerfile and `false` when referencing a Docker Compose file. | | `shutdownAction` 🏷️ | enum | Indicates whether `devcontainer.json` supporting tools should stop the containers when the related tool window is closed / shut down.
Values are `none`, `stopContainer` (default for image or Dockerfile), and `stopCompose` (default for Docker Compose). | | `init` 🏷️ | boolean | Defaults to `false`. Cross-orchestrator way to indicate whether the [tini init process](https://github.com/krallin/tini) should be used to help deal with zombie processes. | -| `privileged` 🏷️ | boolean | Defaults to `false`. Cross-orchestrator way to cause the container to run in privileged mode (`--privileged`). Required for things like Docker-in-Docker, but has security implications particularly when running directly on Linux. | +| `privileged` 🏷️ | boolean | Defaults to `false`. Cross-orchestrator way to cause the container to run in privileged mode (`--privileged`). Required for things like Docker-in-Docker, but has security implications particularly when running directly on Linux. | | `capAdd` 🏷️ | array | Defaults to `[]`. Cross-orchestrator way to add capabilities typically disabled for a container. Most often used to add the `ptrace` capability required to debug languages like C++, Go, and Rust. For example:
`"capAdd": ["SYS_PTRACE"]` | | `securityOpt` 🏷️ | array | Defaults to `[]`. Cross-orchestrator way to set container security options. For example:
`"securityOpt": [ "seccomp=unconfined" ]` | | `mounts` 🏷️ | string or object | Defaults to unset. Cross-orchestrator way to add additional mounts to a container. Each value is a string that accepts the same values as the [Docker CLI `--mount` flag](https://docs.docker.com/engine/reference/commandline/run/#mount). Environment and [pre-defined variables](#variables-in-devcontainerjson) may be referenced in the value. For example:
`"mounts": [{ "source": "dind-var-lib-docker", "target": "/var/lib/docker", "type": "volume" }]` | | `features` | object | An object of [Dev Container Feature IDs](../../features) and related options to be added into your primary container. The specific options that are available varies by feature, so see its documentation for additional details. For example:
`"features": { "ghcr.io/devcontainers/features/github-cli": {} }` | -| `overrideFeatureInstallOrder` | array | By default, Features will attempt to automatically set the order they are installed based on a `installsAfter` property within each of them. This property allows you to override the Feature install order when needed. For example:
`"overrideFeatureInstallorder": [ "ghcr.io/devcontainers/features/common-utils", "ghcr.io/devcontainers/features/github-cli" ]` | -| `customizations` 🏷️ | object | Product specific properties, defined in [supporting tools](../../supporting) | +| `overrideFeatureInstallOrder` | array | By default, Features will attempt to automatically set the order they are installed based on a `installsAfter` property within each of them. This property allows you to override the Feature install order when needed. For example:
`"overrideFeatureInstallОrder": [ "ghcr.io/devcontainers/features/common-utils", "ghcr.io/devcontainers/features/github-cli" ]` | +| `customizations` 🏷️| object | Product specific properties, defined in [supporting tools](../../supporting) | {: .table .table-bordered .table-responsive} ## Scenario specific properties @@ -48,9 +48,10 @@ The focus of `devcontainer.json` is to describe how to enrich a container for th | `build.dockerfile` | string |**Required** when using a Dockerfile. The location of a [Dockerfile](https://docs.docker.com/engine/reference/builder/) that defines the contents of the container. The path is relative to the `devcontainer.json` file. | | `build.context` | string | Path that the Docker build should be run from relative to `devcontainer.json`. For example, a value of `".."` would allow you to reference content in sibling directories. Defaults to `"."`. | | `build.args` | Object | A set of name-value pairs containing [Docker image build arguments](https://docs.docker.com/engine/reference/commandline/build/#build-arg) that should be passed when building a Dockerfile. Environment and [pre-defined variables](#variables-in-devcontainerjson) may be referenced in the values. Defaults to not set. For example: `"build": { "args": { "MYARG": "MYVALUE", "MYARGFROMENVVAR": "${localEnv:VARIABLE_NAME}" } }` | +| `build.options` | array | An array of [Docker image build options](https://docs.docker.com/engine/reference/commandline/build/#options) that should be passed to the build command when building a Dockerfile. Defaults to `[]`. For example: `"build": { "options": [ "--add-host=host.docker.internal:host-gateway" ] }` | | `build.target` | string | A string that specifies a [Docker image build target](https://docs.docker.com/engine/reference/commandline/build/#target) that should be passed when building a Dockerfile. Defaults to not set. For example: `"build": { "target": "development" }` | | `build.cacheFrom` | string,
array | A string or array of strings that specify one or more images to use as caches when building the image. Cached image identifiers are passed to the `docker build` command with `--cache-from`. | -| `appPort` | integer,
string,
array | In most cases, we recommend using the new [forwardPorts property](#general-properties). This property accepts a port or array of ports that should be published locally when the container is running.Unlike `forwardPorts`, your application may need to listen on all interfaces (`0.0.0.0`) not just `localhost` for it to be available externally. Defaults to `[]`.
Learn more about publishing vs forwarding ports [here](#publishing-vs-forwarding-ports).
Note that the array syntax will execute the command without a shell. You can [learn more](#formatting-string-vs-array-properties) about formatting string vs array properties. | +| `appPort` | integer,
string,
array | In most cases, we recommend using the new [forwardPorts property](#general-properties). This property accepts a port or array of ports that should be published locally when the container is running. Unlike `forwardPorts`, your application may need to listen on all interfaces (`0.0.0.0`) not just `localhost` for it to be available externally. Defaults to `[]`.
Learn more about publishing vs forwarding ports [here](#publishing-vs-forwarding-ports).
Note that the array syntax will execute the command without a shell. You can [learn more](#formatting-string-vs-array-properties) about formatting string vs array properties. | | `workspaceMount` | string | Requires `workspaceFolder` be set as well. Overrides the default local mount point for the workspace when the container is created. Supports the same values as the [Docker CLI `--mount` flag](https://docs.docker.com/engine/reference/commandline/run/#mount). Environment and [pre-defined variables](#variables-in-devcontainerjson) may be referenced in the value. For example:
`"workspaceMount": "source=${localWorkspaceFolder}/sub-folder,target=/workspace,type=bind,consistency=cached", "workspaceFolder": "/workspace"` | | `workspaceFolder` | string | Requires `workspaceMount` be set. Sets the default path that `devcontainer.json` supporting services / tools should open when connecting to the container. Defaults to the automatic source code mount location. | | `runArgs` | array | An array of [Docker CLI arguments](https://docs.docker.com/engine/reference/commandline/run/) that should be used when running the container. Defaults to `[]`. For example, this allows ptrace based debuggers like C++ to work in the container:
`"runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ]` . | @@ -61,7 +62,7 @@ The focus of `devcontainer.json` is to describe how to enrich a container for th | Property | Type | Description | |:------------------|:------------|:------------| | `dockerComposeFile` | string,
array | **Required** when using [Docker Compose](https://docs.docker.com/compose/). Path or an ordered list of paths to Docker Compose files relative to the `devcontainer.json` file. Using an array is useful [when extending your Docker Compose configuration](https://docs.docker.com/compose/extends/#multiple-compose-files). The order of the array matters since the contents of later files can override values set in previous ones.
The default `.env` file is picked up from the root of the project, but you can use `env_file` in your Docker Compose file to specify an alternate location.
Note that the array syntax will execute the command without a shell. You can [learn more](#formatting-string-vs-array-properties) about formatting string vs array properties. | -| `service` | string | **Required** when using [Docker Compose](https://docs.docker.com/compose/). The name of the service `devcontainer.json` supporting services / tools should connect to once running. | +| `service` | string | **Required** when using [Docker Compose](https://docs.docker.com/compose/). The name of the service `devcontainer.json` supporting services / tools should connect to once running. | | `runServices` | array | An array of services in your Docker Compose configuration that should be started by `devcontainer.json` supporting services / tools. These will also be stopped when you disconnect unless `"shutdownAction"` is `"none"`. Defaults to all services. | | `workspaceFolder` | string | Sets the default path that `devcontainer.json` supporting services / tools should open when connecting to the container (which is often the path to a volume mount where the source code can be found in the container). Defaults to `"/"`. | {: .table .table-bordered .table-responsive} @@ -91,16 +92,14 @@ If one of the lifecycle scripts fails, any subsequent scripts will not be execut ## Minimum host requirements -While `devcontainer.json` does not focus on hardware or VM provisioning, it can be useful to know your container's minimum RAM, CPU, storage, and GPU requirements. This is what the `hostRequirements` properties allow you to do. Cloud services can use these properties to automatically default to the best compute option available, while in other cases, you will be presented with a warning if the requirements are not met. +While `devcontainer.json` does not focus on hardware or VM provisioning, it can be useful to know your container's minimum RAM, CPU, and storage requirements. This is what the `hostRequirements` properties allow you to do. Cloud services can use these properties to automatically default to the best compute option available, while in other cases, you will be presented with a warning if the requirements are not met. | Property | Type | Description | |:------------------|:------------|:------------| | `hostRequirements.cpus` 🏷️ | integer | Indicates the minimum required number of CPUs / virtual CPUs / cores. For example: `"hostRequirements": {"cpus": 2}` | | `hostRequirements.memory` 🏷️ | string | A string indicating minimum memory requirements with a `tb`, `gb`, `mb`, or `kb` suffix. For example, `"hostRequirements": {"memory": "4gb"}` | | `hostRequirements.storage` 🏷️ | string | A string indicating minimum storage requirements with a `tb`, `gb`, `mb`, or `kb` suffix. For example, `"hostRequirements": {"storage": "32gb"}` | -| `hostRequirements.gpu` 🏷️ | boolean, string or object | Indicates whether a GPU is required. The string \"optional\" indicates that a GPU is optional. An object value can be used to configure more detailed requirements. For example: `"hostRequirements": {"gpu": true}` | - -{: .table .table-bordered .table-responsive} + {: .table .table-bordered .table-responsive} ## Port attributes @@ -110,7 +109,7 @@ The `portsAttributes` and `otherPortsAttributes` properties allow you to map def |:------------------|:------------|:------------| | `label` 🏷️ | string | Display name for the port in the ports view. Defaults to not set. | | `protocol` 🏷️ | enum | Controls protocol handling for forwarded ports. When not set, the port is assumed to be a raw TCP stream which, if forwarded to `localhost`, supports any number of protocols. However, if the port is forwarded to a web URL (e.g. from a cloud service on the web), only HTTP ports in the container are supported. Setting this property to `https` alters handling by ignoring any SSL/TLS certificates present when communicating on the port and using the correct certificate for the forwarded URL instead (e.g `https://*.githubpreview.dev`). If set to `http`, processing is the same as if the protocol is not set. Defaults to not set. | -| `onAutoForward` 🏷️ | enum | Controls what should happen when a port is auto-forwarded once you've connected to the container. `notify` is the default, and a notification will appear when the port is auto-forwarded. If set to `openBrowser`, the port will be opened in the system's default browser. `openPreview` will open the URL in `devcontainer.json` supporting services' / tools' embedded preview browser. A value of `openBrowserOnce` will only open the browser once. A value of `silent` will forward the port, but take no further action. A value of `ignore` means that this port should not be auto-forwarded at all. | +| `onAutoForward` 🏷️ | enum | Controls what should happen when a port is auto-forwarded once you've connected to the container. `notify` is the default, and a notification will appear when the port is auto-forwarded. If set to `openBrowser`, the port will be opened in the system's default browser. A value of `openBrowserOnce` will open the browser only once. `openPreview` will open the URL in `devcontainer.json` supporting services' / tools' embedded preview browser. A value of `silent` will forward the port, but take no further action. A value of `ignore` means that this port should not be auto-forwarded at all. | | `requireLocalPort` 🏷️ | boolean | Dictates when port forwarding is required to map the port in the container to the same port locally or not. If set to `false`, the `devcontainer.json` supporting services / tools will attempt to use the specified port forward to `localhost`, and silently map to a different one if it is unavailable. If set to `true`, you will be notified if it is not possible to use the same port. Defaults to `false`. | | `elevateIfNeeded` 🏷️ | boolean | Forwarding low ports like 22, 80, or 443 to `localhost` on the same port from `devcontainer.json` supporting services / tools may require elevated permissions on certain operating systems. Setting this property to `true` will automatically try to elevate the `devcontainer.json` supporting tool's permissions in this situation. Defaults to `false`. | {: .table .table-bordered .table-responsive} @@ -163,7 +162,7 @@ Finally, you may use an object format: Variables can be referenced in certain string values in `devcontainer.json` in the following format: **${variableName}**. The following is a list of available variables you can use. -| Property | Type | Description | +| Variable | Properties | Description | |:------------------|:------------|:------------| | `${localEnv:VARIABLE_NAME}` | Any | Value of an environment variable on the **host machine** (in this case, called `VARIABLE_NAME`). Unset variables are left blank. For example, this would set a variable to your local home folder on Linux / macOS or the user folder on Windows:
`"remoteEnv": { "LOCAL_USER_PATH": "${localEnv:HOME}${localEnv:USERPROFILE}" }`

A default value for when the environment variable is not set can be given with `${localEnv:VARIABLE_NAME:default_value}`.

⚠️ For a cloud service, the host is in the cloud rather than your local machine. | | `${containerEnv:VARIABLE_NAME}` | `remoteEnv` | Value of an existing environment variable inside the container once it is up and running (in this case, called `VARIABLE_NAME`). For example:
`"remoteEnv": { "PATH": "${containerEnv:PATH}:/some/other/path" }`

A default value for when the environment variable is not set can be given with `${containerEnv:VARIABLE_NAME:default_value}`. | @@ -171,7 +170,7 @@ Variables can be referenced in certain string values in `devcontainer.json` in t | `${containerWorkspaceFolder}` | Any | The path that the workspaces files can be found in the container. | | `${localWorkspaceFolderBasename}` | Any | Name of the local folder that was opened in the `devcontainer.json` supporting service / tool (that contains `.devcontainer/devcontainer.json`). | | `${containerWorkspaceFolderBasename}` | Any | Name of the folder where the workspace files can be found in the container. | -| `${devcontainerId}` | Any | Identifier derived from a set of container labels that uniquely identify the dev container on a Docker host. It allows Features to refer to an identifier that is unique to the dev container they are installed into and that is stable across rebuilds.
The properties supporting it in devcontainer.json are: `name`, `runArgs`, `initializeCommand`, `onCreateCommand`, `updateContentCommand`, `postCreateCommand`, `postStartCommand`, `postAttachCommand`, `workspaceFolder`, `workspaceMount`, `mounts`, `containerEnv`, `remoteEnv`, `containerUser`, `remoteUser`, and `customizations`. | +| `${devcontainerId}` | Any | Allow Features to refer to an identifier that is unique to the dev container they are installed into and that is stable across rebuilds.
The properties supporting it in devcontainer.json are: `name`, `runArgs`, `initializeCommand`, `onCreateCommand`, `updateContentCommand`, `postCreateCommand`, `postStartCommand`, `postAttachCommand`, `workspaceFolder`, `workspaceMount`, `mounts`, `containerEnv`, `remoteEnv`, `containerUser`, `remoteUser`, and `customizations`. | {: .table .table-bordered .table-responsive} ## Schema From 944d9dca8a8360d9b7e6e6b0c81fe16fa287c139 Mon Sep 17 00:00:00 2001 From: Dirk Louwers Date: Tue, 5 Mar 2024 17:39:22 +0100 Subject: [PATCH 039/140] Update collection-index.yml (#362) * Update collection-index.yml Added bob build system * Update collection-index.yml To address comments --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 98b20869..7c1fabf5 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -703,3 +703,8 @@ contact: https://github.com/johnluicn/devcontainer-templates/issues repository: https://github.com/johnluicn/devcontainer-templates ociReference: ghcr.io/johnluicn/devcontainer-templates +- name: Bob buildsystem and DevBox features + maintainer: Dirk Louwers + contact: https://github.com/dlouwers/devcontainer-features/issues + repository: https://github.com/dlouwers/devcontainer-features + ociReference: ghcr.io/dlouwers/devcontainer-features From 65d70923bf1bc3f8ede9344884fe784caad48a45 Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Wed, 6 Mar 2024 09:28:23 -0800 Subject: [PATCH 040/140] update `initializeCommand` definition to match spec (#363) * update initializeCommand definition to match spec (https://github.com/devcontainers/spec/issues/440) * rogue spaces * Update _implementors/json_schema.md Co-authored-by: Samruddhi Khandale --------- Co-authored-by: Samruddhi Khandale --- _implementors/json_reference.md | 2 +- _implementors/json_schema.md | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/_implementors/json_reference.md b/_implementors/json_reference.md index 5d5d96f5..835c23fb 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -77,7 +77,7 @@ When creating or working with a dev container, you may need different commands t | Property | Type | Description | |:------------------|:------------|:------------| -| `initializeCommand` | string,
array,
object | A command string or list of command arguments to run on the **host machine** before the container is created.

⚠️ The command is run wherever the source code is located on the host. For cloud services, this is in the cloud.

Note that the array syntax will execute the command without a shell. You can [learn more](#formatting-string-vs-array-properties) about formatting string vs array vs object properties. | +| `initializeCommand` | string,
array,
object | A command string or list of command arguments to run on the **host machine** during initialization, including during container creation and on subsequent starts. The command may run more than once during a given session.

⚠️ The command is run wherever the source code is located on the host. For cloud services, this is in the cloud.

Note that the array syntax will execute the command without a shell. You can [learn more](#formatting-string-vs-array-properties) about formatting string vs array vs object properties. | | `onCreateCommand` 🏷️ | string,
array,
object | This command is the first of three (along with `updateContentCommand` and `postCreateCommand`) that finalizes container setup when a dev container is created. It and subsequent commands execute **inside** the container immediately after it has started for the first time.

Cloud services can use this command when caching or prebuilding a container. This means that it will not typically have access to user-scoped assets or secrets.

Note that the array syntax will execute the command without a shell. You can [learn more](#formatting-string-vs-array-properties) about formatting string vs array vs object properties. | | `updateContentCommand` 🏷️ | string,
array,
object | This command is the second of three that finalizes container setup when a dev container is created. It executes inside the container after `onCreateCommand` whenever new content is available in the source tree during the creation process.

It will execute at least once, but cloud services will also periodically execute the command to refresh cached or prebuilt containers. Like cloud services using `onCreateCommand`, it can only take advantage of repository and org scoped secrets or permissions.

Note that the array syntax will execute the command without a shell. You can [learn more](#formatting-string-vs-array-properties) about formatting string vs array vs object properties. | | `postCreateCommand` 🏷️ | string,
array,
object | This command is the last of three that finalizes container setup when a dev container is created. It happens after `updateContentCommand` and once the dev container has been assigned to a user for the first time.

Cloud services can use this command to take advantage of user specific secrets and permissions.

Note that the array syntax will execute the command without a shell. You can [learn more](#formatting-string-vs-array-properties) about formatting string vs array vs object properties. | diff --git a/_implementors/json_schema.md b/_implementors/json_schema.md index 1b2d5ff8..6f733bfc 100644 --- a/_implementors/json_schema.md +++ b/_implementors/json_schema.md @@ -205,7 +205,8 @@ You may review the current devcontainer.json schemas in the spec repo, which inc "string", "array" ], - "description": "A command to run locally before anything else. This command is run before \"onCreateCommand\". If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.", + "description": "A command string or list of command arguments to run on the host machine during initialization, including during container creation and on subsequent starts. The command may run more than once during a given session. This command is run before \"onCreateCommand\". If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.", + "items": { "type": "string" } From 1505ce44b7a901f9a8bef2f9e6f0a6a660f9837b Mon Sep 17 00:00:00 2001 From: kreemer Date: Mon, 11 Mar 2024 17:06:25 +0100 Subject: [PATCH 041/140] Adding my devcontainer features to list (#365) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 7c1fabf5..49ecd76f 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -708,3 +708,8 @@ contact: https://github.com/dlouwers/devcontainer-features/issues repository: https://github.com/dlouwers/devcontainer-features ociReference: ghcr.io/dlouwers/devcontainer-features +- name: Dev Container Features by kreemer + maintainer: kreemer + contact: https://github.com/kreemer/features/issues + repository: https://github.com/kreemer/features + ociReference: ghcr.io/kreemer/features From d81161cf70fd4891b6a1899c0d2fd224be89045d Mon Sep 17 00:00:00 2001 From: veronoicc <64193056+veronoicc@users.noreply.github.com> Date: Wed, 13 Mar 2024 18:16:21 +0100 Subject: [PATCH 042/140] Adding my features to the list (#366) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 49ecd76f..4c8abcf5 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -713,3 +713,8 @@ contact: https://github.com/kreemer/features/issues repository: https://github.com/kreemer/features ociReference: ghcr.io/kreemer/features +- name: Dev Container Features by Vero + maintainer: Vero + contact: https://github.com/veronoicc/devcontainer-features/issues + repository: https://github.com/veronoicc/devcontainer-features + ociReference: ghcr.io/veronoicc/devcontainer-features From f72e8c80590ae54bc950d9e18aeb546c18fc3ad1 Mon Sep 17 00:00:00 2001 From: Joshua Ji Date: Wed, 20 Mar 2024 20:16:08 -0600 Subject: [PATCH 043/140] Update collection-index.yml (#371) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 4c8abcf5..4fb89d2f 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -718,3 +718,8 @@ contact: https://github.com/veronoicc/devcontainer-features/issues repository: https://github.com/veronoicc/devcontainer-features ociReference: ghcr.io/veronoicc/devcontainer-features +- name: Dev Container Templates by joshuanianji + maintainer: joshuanianji + contact: https://github.com/joshuanianji/devcontainer-templates/issues + repository: https://github.com/joshuanianji/devcontainer-templates + ociReference: ghcr.io/joshuanianji/devcontainer-templates From 69f098251dd3b8a7961fb5e6e8a450ab3bf46ec9 Mon Sep 17 00:00:00 2001 From: Leo Cavalcante Date: Fri, 22 Mar 2024 21:12:07 -0300 Subject: [PATCH 044/140] Add OpenCodeCo (#372) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 4fb89d2f..7d4a8d32 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -723,3 +723,8 @@ contact: https://github.com/joshuanianji/devcontainer-templates/issues repository: https://github.com/joshuanianji/devcontainer-templates ociReference: ghcr.io/joshuanianji/devcontainer-templates +- name: OpenCodeCo Dev Containers goodies + maintainer: leocavalcante + contact: https://github.com/orgs/opencodeco/discussions + repository: https://github.com/opencodeco/devcontainers + ociReference: ghcr.io/opencodeco/devcontainers From 1508848f91f1d1c90f918f97afd907c40aca7c95 Mon Sep 17 00:00:00 2001 From: Valentin <10695455+va-h@users.noreply.github.com> Date: Tue, 26 Mar 2024 16:21:14 +0100 Subject: [PATCH 045/140] Add va-h/devcontainers-features (#373) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 7d4a8d32..8f8e1716 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -728,3 +728,8 @@ contact: https://github.com/orgs/opencodeco/discussions repository: https://github.com/opencodeco/devcontainers ociReference: ghcr.io/opencodeco/devcontainers +- name: Dev Container Features by Valentin + maintainer: Valentin Heiligers + contact: https://github.com/va-h/devcontainers-features/issues + repository: https://github.com/va-h/devcontainers-features + ociReference: ghcr.io/va-h/devcontainers-features From ac617dde3fa43540816233c7fc52ed06533a381f Mon Sep 17 00:00:00 2001 From: Pablo Ulloa Date: Thu, 28 Mar 2024 13:20:08 -0300 Subject: [PATCH 046/140] Update collection-index.yml (#374) --- _data/collection-index.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 8f8e1716..992a624d 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -639,10 +639,15 @@ repository: https://github.com/mcollier/logic-app-dev-container-template ociReference: ghcr.io/mcollier/logic-app-dev-container-template - name: Additional Dev Container Features by prulloac - maintainer: prulloac + maintainer: Pablo Ulloa contact: https://github.com/prulloac/devcontainer-features/issues repository: https://github.com/prulloac/devcontainer-features ociReference: ghcr.io/prulloac/devcontainer-features +- name: Additional Dev Container Templates by prulloac + maintainer: Pablo Ulloa + contact: https://github.com/prulloac/devcontainer-templates/issues + repository: https://github.com/prulloac/devcontainer-templates + ociReference: ghcr.io/prulloac/devcontainer-templates - name: Additional Dev Container Features by LumenPink maintainer: lumenpink contact: https://github.com/lumenpink/devcontainer-features/issues From 9e09d360b52bbb4b21d8b09985a0fbfe6e6fa236 Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Mon, 1 Apr 2024 09:09:35 -0700 Subject: [PATCH 047/140] Update docs for `localEnv` (#370) * Update docs for `localEnv` I used localEnv today and hit some minor points of confusion. Notably, any local variables need to be set _before_ launching VS Code for them to be picked up (confirmed in this issue: https://github.com/microsoft/vscode-remote-release/issues/3456#issuecomment-666255277) I also added a macOS example for how to set local variables - I think this might be helpful as a demonstration of use cases for `localEnv` If approved here, i'll also update the spec repo with the same changes * Update json_reference.md --- _implementors/json_reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_implementors/json_reference.md b/_implementors/json_reference.md index 835c23fb..b0378ac1 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -164,7 +164,7 @@ Variables can be referenced in certain string values in `devcontainer.json` in t | Variable | Properties | Description | |:------------------|:------------|:------------| -| `${localEnv:VARIABLE_NAME}` | Any | Value of an environment variable on the **host machine** (in this case, called `VARIABLE_NAME`). Unset variables are left blank. For example, this would set a variable to your local home folder on Linux / macOS or the user folder on Windows:
`"remoteEnv": { "LOCAL_USER_PATH": "${localEnv:HOME}${localEnv:USERPROFILE}" }`

A default value for when the environment variable is not set can be given with `${localEnv:VARIABLE_NAME:default_value}`.

⚠️ For a cloud service, the host is in the cloud rather than your local machine. | +| `${localEnv:VARIABLE_NAME}` | Any | Value of an environment variable on the **host machine** (in the examples below, called `VARIABLE_NAME`). Unset variables are left blank.

⚠️ Clients (like VS Code) may need to be **restarted** to pick up newly set variables.

⚠️ For a cloud service, the host is in the cloud rather than your local machine.

**Examples**

**1.** Set a variable containing your local home folder on Linux / macOS or the user folder on Windows:
`"remoteEnv": { "LOCAL_USER_PATH": "${localEnv:HOME}${localEnv:USERPROFILE}" }`.

A default value for when the environment variable is not set can be given with `${localEnv:VARIABLE_NAME:default_value}`.

**2.** In modern versions of macOS, default configurations allow setting local variables with the command `echo 'export VARIABLE_NAME=my-value' >> ~/.zshenv`. | | `${containerEnv:VARIABLE_NAME}` | `remoteEnv` | Value of an existing environment variable inside the container once it is up and running (in this case, called `VARIABLE_NAME`). For example:
`"remoteEnv": { "PATH": "${containerEnv:PATH}:/some/other/path" }`

A default value for when the environment variable is not set can be given with `${containerEnv:VARIABLE_NAME:default_value}`. | | `${localWorkspaceFolder}` | Any | Path of the local folder that was opened in the `devcontainer.json` supporting service / tool (that contains `.devcontainer/devcontainer.json`). | | `${containerWorkspaceFolder}` | Any | The path that the workspaces files can be found in the container. | From 1606dd0b93a47bc3aee17d8c41b54cbcc2574a4b Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Mon, 8 Apr 2024 09:51:50 -0700 Subject: [PATCH 048/140] Update docs and guidance for contributions (#382) * Update contrib process, docs * Formatting * Consistency --------- Co-authored-by: bamurtaugh --- .../pull_request_template.md | 35 +++++++++++++++++++ _implementors/contributing.md | 31 +++++++++++++--- contributing.md | 10 +++--- features.html | 6 ++++ templates.html | 6 ++++ 5 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE/pull_request_template.md diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md new file mode 100644 index 00000000..d15e0353 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -0,0 +1,35 @@ + + +## What type of PR is this? + +- [ ] Add a new dev container collection +- [ ] Update to an existing dev container collection +- [ ] Documentation/spec update +- [ ] Other containers.dev site update (UX, layout, etc) + +## Related Issues + + + +- Related Issue # +- Closes # + +## Description + +_Please replace this line with a description of your PR._ + +### Collection checklist +_If your PR contributes a new collection, please utilize this checklist:_ +- [ ] Collection name +- [ ] Maintainer name +- [ ] Maintainer contact link (i.e. link to a GitHub repo, email) +- [ ] Repository URL +- [ ] OCI Reference +- [ ] I acknowledge that this collection provides new functionality, distinct from the existing collections part of this index. \ No newline at end of file diff --git a/_implementors/contributing.md b/_implementors/contributing.md index 425a959a..597847fb 100644 --- a/_implementors/contributing.md +++ b/_implementors/contributing.md @@ -8,12 +8,13 @@ index: 9 We're excited for your contributions to the Dev Container Specification! This document outlines how you can get involved. We also welcome you to join our [community Slack channel](https://aka.ms/dev-container-community). -## Contribution approaches +## Spec Contribution approaches -- Propose the change via an [issue](https://github.com/devcontainers/spec/issues) in the [spec repo](https://github.com/devcontainers/spec). Try to get early feedback before spending too much effort formalizing it. -- More formally document the proposed change in terms of properties and their semantics. Look to format your proposal like our [devcontainer.json reference](../json_reference), which is a JSON with Comments (jsonc) format. +If you'd like to contribute a change or addition to the spec, you may follow the guidance below: +- Propose the change via an [issue](https://github.com/devcontainers/spec/issues) in this repository. Try to get early feedback before spending too much effort formalizing it. +- More formally document the proposed change in terms of properties and their semantics. Look to format your proposal like our [devcontainer.json reference](https://aka.ms/devcontainer.json). -Here is a sample proposal: +Here is a sample: | Property | Type | Description | |:------------------|:------------|:------------| @@ -43,6 +44,20 @@ Tool-specific properties are contained in namespaces in the `"customizations"` p You may propose adding a new namespace for a specific tool, and any properties specific to that tool. +### Formatting Guidelines + +When contributing an official doc or referencing dev containers in your projects, please consider the following guidelines: + +- Refer to the spec as the "Development Container Specification" + - All capital letters + - Singular "Container" rather than plural "Containers" +- The term "dev container" shouldn't be capitalized on its own + - It should only be capitalized when referring to an official tool title, like the VS Code Dev Containers extension +- Signify `devcontainer.json` is a file type through backticks +- Features and Templates should always be capitalized +- Refer to the CLI as the "Dev Container CLI" (note the caps) +- Use bolding for emphasis sprinkled throughout sections, rather than try to use it to always bold certain terms + ## Review process We use the following [labels](https://github.com/devcontainers/spec/labels) in the spec repo: @@ -51,3 +66,11 @@ We use the following [labels](https://github.com/devcontainers/spec/labels) in t - `finalization`: Proposals we intend to make part of the spec. [Milestones](https://github.com/devcontainers/spec/milestones) use a "month year" pattern (i.e. January 2022). If a finalized proposal is added to a milestone, it is intended to be merged during that milestone. + +## Community Engagement + +There are several additional options to engage with the dev container community, such as asking questions, providing feedback, or engaging on how your team may use or contribute to dev containers: +- [GitHub Discussions](https://github.com/devcontainers/spec/discussions): This is a great opportunity to connect with the community and maintainers of this project, without the requirement of contributing a change to the actual spec (which we see more in issues and PRs) +- [Community Slack channel](https://aka.ms/dev-container-community): This is a great opportunity to connect with the community and maintainers +- You can always check out the issues and PRs (and contribute new ones) across the repos in the [Dev Containers GitHub org](https://github.com/devcontainers) too! +- Community collections: You can contribute your own [Templates](https://containers.dev/implementors/templates-distribution/#distribution) and [Features](https://containers.dev/implementors/features-distribution/#distribution) to our [community index](https://containers.dev/collections)! \ No newline at end of file diff --git a/contributing.md b/contributing.md index 8b97c103..8c2e9296 100644 --- a/contributing.md +++ b/contributing.md @@ -1,8 +1,8 @@ # How to Contribute to the Dev Container Specification -We're excited for your contributions to the dev container specification! This document outlines how you can get involved. +We're excited for your contributions to the Dev Container Specification! This document outlines how you can get involved. We also welcome you to join our [community Slack channel](https://aka.ms/dev-container-community). -## Contribution approaches +## Spec contribution approaches If you'd like to contribute a change or addition to the spec, you may follow the guidance below: - Propose the change via an [issue](https://github.com/devcontainers/spec/issues) in this repository. Try to get early feedback before spending too much effort formalizing it. @@ -16,7 +16,7 @@ Here is a sample: - PRs to the [schema](https://github.com/microsoft/vscode/blob/main/extensions/configuration-editing/schemas/devContainer.schema.src.json), i.e code or shell scripts demonstrating approaches for implementation. -Once there is discussion on your proposal, please also open and link a PR to update the [devcontainer.json reference doc](https://github.com/microsoft/vscode-docs/blob/main/docs/remote/devcontainerjson-reference.md). When your proposal is merged, the docs will be kept up-to-date with the latest spec. +Once there is discussion on your proposal, please also open and link a PR to update the [devcontainer.json reference doc](https://aka.ms/devcontainer.json). When your proposal is merged, the docs will be kept up-to-date with the latest spec. ### Contributing tool-specific support @@ -53,7 +53,7 @@ When contributing an official doc or referencing dev containers in your projects ## Review process -We use the following [labels](https://github.com/devcontainers/spec/labels): +We use the following [labels](https://github.com/devcontainers/spec/labels) in the spec repo: - `proposal`: Issues under discussion, still collecting feedback. - `finalization`: Proposals we intend to make part of the spec. @@ -65,4 +65,4 @@ There are several additional options to engage with the dev container community, - [GitHub Discussions](https://github.com/devcontainers/spec/discussions): This is a great opportunity to connect with the community and maintainers of this project, without the requirement of contributing a change to the actual spec (which we see more in issues and PRs) - [Community Slack channel](https://aka.ms/dev-container-community): This is a great opportunity to connect with the community and maintainers - You can always check out the issues and PRs (and contribute new ones) across the repos in the [Dev Containers GitHub org](https://github.com/devcontainers) too! - +- Community collections: You can contribute your own [Templates](https://containers.dev/implementors/templates-distribution/#distribution) and [Features](https://containers.dev/implementors/features-distribution/#distribution) to our [community index](https://containers.dev/collections)! \ No newline at end of file diff --git a/features.html b/features.html index dc335e8e..9e87fe4f 100644 --- a/features.html +++ b/features.html @@ -18,6 +18,12 @@

Available Dev Container Featur Please note that if you need to report a Feature, you should do so through the registry hosting the Feature.

+

+ To add your own collection to this list, please create a PR editing this + yaml file. +

+

diff --git a/templates.html b/templates.html index 362f8b93..26e91cc6 100644 --- a/templates.html +++ b/templates.html @@ -16,6 +16,12 @@

Available Dev Container Templa Please note that if you need to report a Template, you should do so through the registry hosting the Template.

+

+ To add your own collection to this list, please create a PR editing this + yaml file. +

+

From 38a663d6a8577677130a592225c9c06fd9e36598 Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Mon, 8 Apr 2024 15:34:19 -0700 Subject: [PATCH 049/140] Update folder (#383) Co-authored-by: bamurtaugh --- .github/{PULL_REQUEST_TEMPLATE => }/pull_request_template.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{PULL_REQUEST_TEMPLATE => }/pull_request_template.md (100%) diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/pull_request_template.md similarity index 100% rename from .github/PULL_REQUEST_TEMPLATE/pull_request_template.md rename to .github/pull_request_template.md From f93c0d9f194da85c83f99e25523bdfdf07f0c951 Mon Sep 17 00:00:00 2001 From: Heath Provost Date: Tue, 9 Apr 2024 12:32:53 -0500 Subject: [PATCH 050/140] Update collection-index.yml to add Alloy Dev Container Template (#384) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 992a624d..1e3f218d 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -738,3 +738,8 @@ contact: https://github.com/va-h/devcontainers-features/issues repository: https://github.com/va-h/devcontainers-features ociReference: ghcr.io/va-h/devcontainers-features +- name: Alloy Dev Container Template + maintainer: heathprovost + contact: https://github.com/heathprovost/alloy-devcontainer-template/issues + repository: https://github.com/heathprovost/alloy-devcontainer-template + ociReference: ghcr.io/heathprovost/alloy-devcontainer-template From 9f07c9524a21f7dedde00de4407230b20048d66f Mon Sep 17 00:00:00 2001 From: Bart Venter <72999113+bartventer@users.noreply.github.com> Date: Wed, 10 Apr 2024 17:25:18 +0200 Subject: [PATCH 051/140] Add Arch Linux Dev Container Features (#385) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 1e3f218d..b7d124eb 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -743,3 +743,8 @@ contact: https://github.com/heathprovost/alloy-devcontainer-template/issues repository: https://github.com/heathprovost/alloy-devcontainer-template ociReference: ghcr.io/heathprovost/alloy-devcontainer-template +- name: Arch Linux Dev Container Features + maintainer: Bart Venter + contact: https://github.com/bartventer/arch-devcontainer-features/issues + repository: https://github.com/bartventer/arch-devcontainer-features + ociReference: ghcr.io/bartventer/arch-devcontainer-features From 7265f8232db69a264c5f0e2398a67edc361aa531 Mon Sep 17 00:00:00 2001 From: Waqqas Jabbar Date: Fri, 12 Apr 2024 22:57:41 +0500 Subject: [PATCH 052/140] Adding BPMN and DMN file linter features (#386) * Adding BPMN and DMN file linter features * Resolved review comments --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index b7d124eb..371e1273 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -748,3 +748,8 @@ contact: https://github.com/bartventer/arch-devcontainer-features/issues repository: https://github.com/bartventer/arch-devcontainer-features ociReference: ghcr.io/bartventer/arch-devcontainer-features +- name: BPMN and DMN linters + maintainer: Waqqas Jabbar + contact: https://github.com/waqqas/feature/issues + repository: https://github.com/waqqas/feature/ + ociReference: ghcr.io/waqqas/feature From 749f454ece89c9aa1ea84de75fe493b0d1cdd6fd Mon Sep 17 00:00:00 2001 From: mikoto2000 Date: Tue, 16 Apr 2024 01:47:51 +0900 Subject: [PATCH 053/140] Add `Reference` and `Latest Version` column in `templates.html`. (#387) --- templates.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/templates.html b/templates.html index 26e91cc6..a33d1702 100644 --- a/templates.html +++ b/templates.html @@ -30,6 +30,8 @@

Available Dev Container Templa Template Name Maintainer + Reference + Latest Version {% for c in site.data.devcontainer-index.collections %} @@ -38,6 +40,8 @@

Available Dev Container Templa {{ f.name | strip_html }} {{ c.sourceInformation.maintainer | strip_html }} + {{ f.id | strip_html }}:{{ f.version | strip_html }} + {{ f.version | strip_html }} {% endfor %} From 6655c97d6412a6f3ecb76096bbf92e94e2790e7f Mon Sep 17 00:00:00 2001 From: dalance Date: Tue, 30 Apr 2024 00:56:09 +0900 Subject: [PATCH 054/140] Add Veryl features (#396) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 371e1273..b6875fba 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -753,3 +753,8 @@ contact: https://github.com/waqqas/feature/issues repository: https://github.com/waqqas/feature/ ociReference: ghcr.io/waqqas/feature +- name: Veryl + maintainer: dalance + contact: https://github.com/veryl-lang/devcontainer-features/issues + repository: https://github.com/veryl-lang/devcontainer-features/ + ociReference: ghcr.io/veryl-lang/devcontainer-features From 4f20e57dfd5c18a43196eb5c3203de28d8f44214 Mon Sep 17 00:00:00 2001 From: Alex Ravenna Date: Tue, 30 Apr 2024 00:13:00 +0200 Subject: [PATCH 055/140] rename Jetpack.io to Jetify.io (#395) * rename Jetpack.io to Jetify.io * remove ".io" * remove TLD --- supporting.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/supporting.md b/supporting.md index 88cd63e1..766eb2cf 100644 --- a/supporting.md +++ b/supporting.md @@ -65,9 +65,9 @@ Cachix's **[devenv](https://devenv.sh/)** now supports automatically generating See [devenv documentation](https://devenv.sh/integrations/codespaces-devcontainer/) for detais. -### Jetpack.io Devbox +### Jetify Devbox -[Jetpack.io](https://jetpack.io) is a [Nix](https://nixos.org/)-based service for deploying applications. [DevBox](https://www.jetpack.io/devbox/) provides a way to use Nix to generate a development environment. [Jetpack.io's VS Code extension](https://marketplace.visualstudio.com/items?itemName=jetpack-io.devbox) allows you to quickly take advantage of DevBox in any Dev Container Spec supporting tool or service. +[Jetify](https://jetify.com) (formerly jetpack.io) is a [Nix](https://nixos.org/)-based service for deploying applications. [DevBox](https://www.jetify.com/devbox/) provides a way to use Nix to generate a development environment. [Jetify's VS Code extension](https://marketplace.visualstudio.com/items?itemName=jetpack-io.devbox) allows you to quickly take advantage of DevBox in any Dev Container Spec supporting tool or service. Press cmd/ctrl+shift+p or F1 and select the **Generate Dev Container files** command to get started! From bab5e86dc563d6554584d69132343b4a62f1f985 Mon Sep 17 00:00:00 2001 From: Cadu Ribeiro Date: Fri, 3 May 2024 13:22:50 -0300 Subject: [PATCH 056/140] Add my dev container features to the list (#398) I have some devcontainer features that installs neovim (from source) that I want to add to the listing. Also working to add tmux --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index b6875fba..969849d2 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -758,3 +758,8 @@ contact: https://github.com/veryl-lang/devcontainer-features/issues repository: https://github.com/veryl-lang/devcontainer-features/ ociReference: ghcr.io/veryl-lang/devcontainer-features +- name: Dev Container Features (Cadu Ribeiro) + maintainer: Cadu Ribeiro + contact: https://github.com/duduribeiro/devcontainer-features/issues + repository: https://github.com/duduribeiro/devcontainer-features/ + ociReference: ghcr.io/duduribeiro/devcontainer-features From 705c82b2eba8701f809325025ceca3492e497cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Simi=C4=87?= Date: Fri, 3 May 2024 18:26:26 +0200 Subject: [PATCH 057/140] feat: Add dusansimic devcontainers (#399) Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 969849d2..75860df4 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -758,6 +758,11 @@ contact: https://github.com/veryl-lang/devcontainer-features/issues repository: https://github.com/veryl-lang/devcontainer-features/ ociReference: ghcr.io/veryl-lang/devcontainer-features +- name: Dev Container Features by dusansimic + maintainer: dusansimic + contact: https://github.com/dusansimic/devcontainer-features/issues + repository: https://github.com/dusansimic/devcontainer-features/ + ociReference: ghcr.io/dusansimic/devcontainer-features - name: Dev Container Features (Cadu Ribeiro) maintainer: Cadu Ribeiro contact: https://github.com/duduribeiro/devcontainer-features/issues From cae86f630ec254c206d21ff479420e66d53524ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Schr=C3=B6der?= Date: Tue, 14 May 2024 17:59:35 +0200 Subject: [PATCH 058/140] Add skriptfabrik feature collection (#400) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 75860df4..941b134d 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -768,3 +768,8 @@ contact: https://github.com/duduribeiro/devcontainer-features/issues repository: https://github.com/duduribeiro/devcontainer-features/ ociReference: ghcr.io/duduribeiro/devcontainer-features +- name: Dev Container Features by skriptfabrik + maintainer: skriptfabrik + contact: https://github.com/skriptfabrik/devcontainer-features/issues + repository: https://github.com/skriptfabrik/devcontainer-features/ + ociReference: ghcr.io/skriptfabrik/devcontainer-features From 89ac33a5466d132a4f6112d2974ec0f8a9853d73 Mon Sep 17 00:00:00 2001 From: m4tchl0ck Date: Wed, 15 May 2024 00:21:58 +0200 Subject: [PATCH 059/140] Update collection-index.yml with m4tchl0ck Features (#401) * Update collection-index.yml * Update _data/collection-index.yml Co-authored-by: Samruddhi Khandale * Update collection-index.yml --------- Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 941b134d..16dbda77 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -773,3 +773,8 @@ contact: https://github.com/skriptfabrik/devcontainer-features/issues repository: https://github.com/skriptfabrik/devcontainer-features/ ociReference: ghcr.io/skriptfabrik/devcontainer-features +- name: Dev Container Features by m4tchl0ck + maintainer: Adrian Rusznica + contact: https://github.com/m4tchl0ck/devcontainer-features/issues + repository: https://github.com/m4tchl0ck/devcontainer-features/ + ociReference: ghcr.io/m4tchl0ck/devcontainer-features From de5b4364173ffd5710b0115fb88427eb551acc95 Mon Sep 17 00:00:00 2001 From: Nils Geistmann <126063376+nils-geistmann@users.noreply.github.com> Date: Wed, 22 May 2024 19:06:57 +0200 Subject: [PATCH 060/140] feat: add nils-geistmann devcontainer features (#404) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 16dbda77..10e0c52f 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -778,3 +778,8 @@ contact: https://github.com/m4tchl0ck/devcontainer-features/issues repository: https://github.com/m4tchl0ck/devcontainer-features/ ociReference: ghcr.io/m4tchl0ck/devcontainer-features +- name: Dev Container Features by nils-geistmann + maintainer: Nils Geistmann + contact: https://github.com/nils-geistmann/devcontainers-features/issues + repository: https://github.com/nils-geistmann/devcontainers-features/ + ociReference: ghcr.io/nils-geistmann/devcontainers-features From cbdee1935fe5c93db87080277e18bca341885f0a Mon Sep 17 00:00:00 2001 From: Raphael Castro <2117949+rafaph@users.noreply.github.com> Date: Fri, 24 May 2024 21:03:15 -0300 Subject: [PATCH 061/140] Add rafaph devcontainer features (#406) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 10e0c52f..67520eea 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -783,3 +783,8 @@ contact: https://github.com/nils-geistmann/devcontainers-features/issues repository: https://github.com/nils-geistmann/devcontainers-features/ ociReference: ghcr.io/nils-geistmann/devcontainers-features +- name: Dev Container Features by rafaph + maintainer: Raphael Castro + contact: https://github.com/rafaph/devcontainer-features/issues + repository: https://github.com/rafaph/devcontainer-features + ociReference: ghcr.io/rafaph/devcontainer-features From 379b387d7c274d98faf7d779aecc9e5b6dd3c86e Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Tue, 28 May 2024 13:43:26 -0500 Subject: [PATCH 062/140] Add OpenFGA CLI feature (#405) * Add OpenFGA CLI feature * Update _data/collection-index.yml Co-authored-by: Samruddhi Khandale * Update _data/collection-index.yml Co-authored-by: Samruddhi Khandale --------- Co-authored-by: Samruddhi Khandale Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 67520eea..55e888e0 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -783,6 +783,11 @@ contact: https://github.com/nils-geistmann/devcontainers-features/issues repository: https://github.com/nils-geistmann/devcontainers-features/ ociReference: ghcr.io/nils-geistmann/devcontainers-features +- name: OpenFGA CLI + maintainer: Andrew Porter + contact: https://github.com/partydrone/devcontainer/issues + repository: https://github.com/partydrone/devcontainer + ociReference: ghcr.io/partydrone/devcontainer/features - name: Dev Container Features by rafaph maintainer: Raphael Castro contact: https://github.com/rafaph/devcontainer-features/issues From 03748570536aeb13144abef4426a7d0ce2dc1bc7 Mon Sep 17 00:00:00 2001 From: Konan <42452771+GMkonan@users.noreply.github.com> Date: Tue, 28 May 2024 19:52:11 -0300 Subject: [PATCH 063/140] Add flyclt CLI feature to collection (#411) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 55e888e0..77b79075 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -793,3 +793,8 @@ contact: https://github.com/rafaph/devcontainer-features/issues repository: https://github.com/rafaph/devcontainer-features ociReference: ghcr.io/rafaph/devcontainer-features +- name: GMkonan devcontainer features + maintainer: GMkonan + contact: https://github.com/GMkonan/fly-cli-feature/issues + repository: https://github.com/GMkonan/fly-cli-feature + ociReference: ghcr.io/gmkonan/fly-cli-feature From 45764fe4e709eecd17927b1181c538dd268a472c Mon Sep 17 00:00:00 2001 From: Troy Palacino Date: Tue, 28 May 2024 18:53:30 -0400 Subject: [PATCH 064/140] Added SPFx Dev Container (#412) Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 77b79075..1ab10f35 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -793,6 +793,11 @@ contact: https://github.com/rafaph/devcontainer-features/issues repository: https://github.com/rafaph/devcontainer-features ociReference: ghcr.io/rafaph/devcontainer-features +- name: SPFx Dev Container + maintainer: Troy + contact: https://github.com/tpalacino/SPFx-dev-container/issues + repository: https://github.com/tpalacino/SPFx-dev-container + ociReference: ghcr.io/tpalacino/spfx-dev-container - name: GMkonan devcontainer features maintainer: GMkonan contact: https://github.com/GMkonan/fly-cli-feature/issues From d49df73827f4dce91b3921d2f974c1ff8d3c51db Mon Sep 17 00:00:00 2001 From: David Birks Date: Mon, 3 Jun 2024 13:36:37 -0400 Subject: [PATCH 065/140] Add e-gineering feature collection (#414) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 1ab10f35..62c8ee79 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -803,3 +803,8 @@ contact: https://github.com/GMkonan/fly-cli-feature/issues repository: https://github.com/GMkonan/fly-cli-feature ociReference: ghcr.io/gmkonan/fly-cli-feature +- name: Dev Container Features by E-gineering + maintainer: E-gineering + contact: https://github.com/e-gineering/devcontainer-features/issues + repository: https://github.com/e-gineering/devcontainer-features + ociReference: ghcr.io/e-gineering/devcontainer-features From 0d81e4d0ed7215ab2103ea4c130d71e019389db5 Mon Sep 17 00:00:00 2001 From: Tony Najjar Date: Tue, 4 Jun 2024 17:36:08 +0200 Subject: [PATCH 066/140] Add ROS2 devcontainer template (#415) Signed-off-by: Tony Najjar --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 62c8ee79..fb61d509 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -808,3 +808,8 @@ contact: https://github.com/e-gineering/devcontainer-features/issues repository: https://github.com/e-gineering/devcontainer-features ociReference: ghcr.io/e-gineering/devcontainer-features +- name: ROS2 devcontainer Template + maintainer: Tony Najjar + contact: https://github.com/tonynajjar/ros2_devcontainer_template/issues + repository: https://github.com/tonynajjar/ros2_devcontainer_template/ + ociReference: ghcr.io/tonynajjar/ros2_devcontainer_template \ No newline at end of file From 6a8438a961305ed0b55e6e4cf1b6449244b85f25 Mon Sep 17 00:00:00 2001 From: Carsten Behring Date: Wed, 12 Jun 2024 02:37:13 +0200 Subject: [PATCH 067/140] added template collection for Clojure (#418) Adding devcontainer templates for Clojure language --- _data/collection-index.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index fb61d509..70f1daa8 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -812,4 +812,9 @@ maintainer: Tony Najjar contact: https://github.com/tonynajjar/ros2_devcontainer_template/issues repository: https://github.com/tonynajjar/ros2_devcontainer_template/ - ociReference: ghcr.io/tonynajjar/ros2_devcontainer_template \ No newline at end of file + ociReference: ghcr.io/tonynajjar/ros2_devcontainer_template +- name: Clojure devcontainer templates + maintainer: Carsten Behring + contact: https://github.com/scicloj/devcontainer-templates/issues + repository: https://github.com/scicloj/devcontainer-templates/ + ociReference: ghcr.io/scicloj/devcontainer-templates From 08fbdf6a4ceb8eda396116c00a4adc0177e68cdb Mon Sep 17 00:00:00 2001 From: Alex Ravenna Date: Wed, 12 Jun 2024 20:17:14 +0200 Subject: [PATCH 068/140] fix anchor usage (#416) --- _implementors/templates-distribution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_implementors/templates-distribution.md b/_implementors/templates-distribution.md index 6e6f0f21..da2ad7a6 100644 --- a/_implementors/templates-distribution.md +++ b/_implementors/templates-distribution.md @@ -19,7 +19,7 @@ Goals include: A Template's source code is stored in a git repository. -For ease of authorship and maintenance, [1..n] Templates can share a single git repository. This set of Templates is referred to as a "collection," and will share the same [`devcontainer-collection.json`](#devcontainer-collection.json) file and "namespace" (eg. `/`). +For ease of authorship and maintenance, [1..n] Templates can share a single git repository. This set of Templates is referred to as a "collection," and will share the same [`devcontainer-collection.json`](#devcontainer-collection) file and "namespace" (eg. `/`). > **Note:** Templates and [Features](/implementors/features) should be placed in different git repositories. From 490dba6ebb103debe4043150680a01425985eebd Mon Sep 17 00:00:00 2001 From: David Birks Date: Wed, 12 Jun 2024 14:45:36 -0400 Subject: [PATCH 069/140] Add e-gineering template collection (#419) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 70f1daa8..3eb350db 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -808,6 +808,11 @@ contact: https://github.com/e-gineering/devcontainer-features/issues repository: https://github.com/e-gineering/devcontainer-features ociReference: ghcr.io/e-gineering/devcontainer-features +- name: Dev Container Templates by E-gineering + maintainer: E-gineering + contact: https://github.com/e-gineering/devcontainer-templates/issues + repository: https://github.com/e-gineering/devcontainer-templates + ociReference: ghcr.io/e-gineering/devcontainer-templates - name: ROS2 devcontainer Template maintainer: Tony Najjar contact: https://github.com/tonynajjar/ros2_devcontainer_template/issues From 36ae889f5f36800cd7aa2800cd1389f5783ecd77 Mon Sep 17 00:00:00 2001 From: Lawrence Lee Date: Mon, 17 Jun 2024 18:12:29 +0200 Subject: [PATCH 070/140] Updated collection-index.yml (#421) * Updated collection-index.yml Added Synology features * Update _data/collection-index.yml Co-authored-by: Samruddhi Khandale * Update _data/collection-index.yml Co-authored-by: Samruddhi Khandale --------- Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 3eb350db..1b0f6ba9 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -822,4 +822,9 @@ maintainer: Carsten Behring contact: https://github.com/scicloj/devcontainer-templates/issues repository: https://github.com/scicloj/devcontainer-templates/ - ociReference: ghcr.io/scicloj/devcontainer-templates + ociReference: ghcr.io/scicloj/devcontainer-templates +- name: Synology devcontainer Templates + maintainer: ChaosWars + contact: https://github.com/ChaosWars/synology-features/issues + repository: https://github.com/ChaosWars/synology-features/ + ociReference: ghcr.io/chaoswars/synology-features From 73976824c97ad4167d857fda963951ea613b0f46 Mon Sep 17 00:00:00 2001 From: Keith Date: Tue, 18 Jun 2024 19:41:03 -0400 Subject: [PATCH 071/140] Update collection-index.yml (#423) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 1b0f6ba9..e5dd8555 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -828,3 +828,8 @@ contact: https://github.com/ChaosWars/synology-features/issues repository: https://github.com/ChaosWars/synology-features/ ociReference: ghcr.io/chaoswars/synology-features +- name: Assorted Features + maintainer: tcaky + contact: https://github.com/tcaky/devcontainer-features/issues + repository: https://github.com/tcaky/devcontainer-features + ociReference: ghcr.io/tcaky/devcontainer-features From eb4519078bc4def9ddb35c621c97c8c1c1672153 Mon Sep 17 00:00:00 2001 From: Carlos Robles Date: Mon, 24 Jun 2024 18:02:31 -0600 Subject: [PATCH 072/140] Adding Azure SQL Database templates (#425) Updating collection-index.yml file, adding Azure SQL Database templates. --- _data/collection-index.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index e5dd8555..92c6f593 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -8,6 +8,11 @@ contact: https://github.com/devcontainers/templates/issues repository: https://github.com/devcontainers/templates ociReference: ghcr.io/devcontainers/templates +- name: Azure SQL Database Dev Container Templates + maintainer: Azure SQL Developer Experiences Team + contact: https://github.com/microsoft/azuresql-devcontainers/issues + repository: https://github.com/microsoft/azuresql-devcontainers + ociReference: ghcr.io/microsoft/azuresql-devcontainers - name: Iterative Tools for Machine Learning Features maintainer: Iterative, Inc contact: https://github.com/iterative/features/issues @@ -833,3 +838,4 @@ contact: https://github.com/tcaky/devcontainer-features/issues repository: https://github.com/tcaky/devcontainer-features ociReference: ghcr.io/tcaky/devcontainer-features + From 210dc3620ba3918b89de37329e3644c6e71276aa Mon Sep 17 00:00:00 2001 From: snapsl <32878439+snapsl@users.noreply.github.com> Date: Thu, 27 Jun 2024 01:16:31 +0200 Subject: [PATCH 073/140] Update collection-index.yml (#426) --- _data/collection-index.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 92c6f593..3c9aeb71 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -318,11 +318,6 @@ contact: https://github.com/gickis/devcontainer-features/issues repository: https://github.com/gickis/devcontainer-features ociReference: ghcr.io/gickis/devcontainer-features -- name: Flutter SDK - maintainer: Jarrod Colburn - contact: jarrod@jarrodcolburn.com - repository: https://github.com/jarrodcolburn/features - ociReference: ghcr.io/jarrodcolburn/features - name: sonikro Dev Container Features maintainer: Jonathan Nagayoshi contact: https://github.com/sonikro/devcontainer-features/issues From 8f9a2440f8d54b43a89fd35836018103e5a32d3c Mon Sep 17 00:00:00 2001 From: Matheus Farinaro Vesco <114014793+matheusfvesco@users.noreply.github.com> Date: Wed, 3 Jul 2024 20:32:42 -0300 Subject: [PATCH 074/140] Update collection-index.yml (#430) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 3c9aeb71..e36c135d 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -833,4 +833,9 @@ contact: https://github.com/tcaky/devcontainer-features/issues repository: https://github.com/tcaky/devcontainer-features ociReference: ghcr.io/tcaky/devcontainer-features +- name: Dev Container Templates by matheusfvesco + maintainer: matheusfvesco + contact: https://github.com/matheusfvesco/devcontainer-templates/issues + repository: https://github.com/matheusfvesco/devcontainer-templates + ociReference: ghcr.io/matheusfvesco/devcontainer-templates From 0cf0471e4570373dfff1d11a72d485b080b022bd Mon Sep 17 00:00:00 2001 From: Oleksii Nikiforov Date: Thu, 4 Jul 2024 02:35:21 +0300 Subject: [PATCH 075/140] add features by nikiforovall (#431) Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index e36c135d..e69fa8f1 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -833,9 +833,13 @@ contact: https://github.com/tcaky/devcontainer-features/issues repository: https://github.com/tcaky/devcontainer-features ociReference: ghcr.io/tcaky/devcontainer-features +- name: Devcontainer Features by nikiforovall + maintainer: nikiforovall + contact: https://github.com/nikiforovall/devcontainer-features/issues + repository: https://github.com/nikiforovall/devcontainer-features + ociReference: ghcr.io/nikiforovall/devcontainer-features - name: Dev Container Templates by matheusfvesco maintainer: matheusfvesco contact: https://github.com/matheusfvesco/devcontainer-templates/issues repository: https://github.com/matheusfvesco/devcontainer-templates ociReference: ghcr.io/matheusfvesco/devcontainer-templates - From 90def8ee90652e9f1a0f5529970de7d0889aeaad Mon Sep 17 00:00:00 2001 From: Jakub Orchowski Date: Thu, 4 Jul 2024 01:36:39 +0200 Subject: [PATCH 076/140] Update collection-index.yml (#434) Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index e69fa8f1..b9cc3c64 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -833,6 +833,11 @@ contact: https://github.com/tcaky/devcontainer-features/issues repository: https://github.com/tcaky/devcontainer-features ociReference: ghcr.io/tcaky/devcontainer-features +- name: Dev Container Templates by ThePhaseless + maintainer: ThePhaseless + contact: https://github.com/ThePhaseless/devcontainer-templates/issues + repository: https://github.com/ThePhaseless/devcontainer-templates + ociReference: ghcr.io/thephaseless/devcontainer-templates - name: Devcontainer Features by nikiforovall maintainer: nikiforovall contact: https://github.com/nikiforovall/devcontainer-features/issues From edf69a9fe630c73ea275b9c994745b205f965f27 Mon Sep 17 00:00:00 2001 From: Enrico Falco Date: Thu, 4 Jul 2024 01:38:16 +0200 Subject: [PATCH 077/140] Add new feature collection to install openstack-cli (#433) * add new feature openstack-cli * add collection --------- Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index b9cc3c64..ac42da79 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -833,6 +833,11 @@ contact: https://github.com/tcaky/devcontainer-features/issues repository: https://github.com/tcaky/devcontainer-features ociReference: ghcr.io/tcaky/devcontainer-features +- name: Dev Container Features by enrico9034 + maintainer: enrico9034 + contact: https://github.com/enrico9034/devcontainer-features/issues + repository: https://github.com/enrico9034/devcontainer-features + ociReference: ghcr.io/enrico9034/devcontainer-features - name: Dev Container Templates by ThePhaseless maintainer: ThePhaseless contact: https://github.com/ThePhaseless/devcontainer-templates/issues From 9b255e54df0f83fd1f127ce5fd9038bb5357ce7a Mon Sep 17 00:00:00 2001 From: Lars Nieuwenhuizen <479364+LarsNieuwenhuizen@users.noreply.github.com> Date: Thu, 4 Jul 2024 01:39:33 +0200 Subject: [PATCH 078/140] Update collection-index.yml (#432) Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index ac42da79..f7d784b2 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -833,6 +833,11 @@ contact: https://github.com/tcaky/devcontainer-features/issues repository: https://github.com/tcaky/devcontainer-features ociReference: ghcr.io/tcaky/devcontainer-features +- name: Dev & Container features + maintainer: LarsNieuwenhuizen + contact: https://github.com/LarsNieuwenhuizen/features/issues + repository: https://github.com/LarsNieuwenhuizen/features + ociReference: ghcr.io/larsnieuwenhuizen/features - name: Dev Container Features by enrico9034 maintainer: enrico9034 contact: https://github.com/enrico9034/devcontainer-features/issues From c4c6018dcc1a7a3e53618796da97bfa6516043d1 Mon Sep 17 00:00:00 2001 From: Dennis Irsigler Date: Fri, 5 Jul 2024 19:30:52 +0200 Subject: [PATCH 079/140] add dirsigler container features repository (#435) --- _data/collection-index.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index f7d784b2..c037bd06 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -678,10 +678,10 @@ contact: https://github.com/rsm-hcd repository: https://github.com/rsm-hcd/devcontainer-templates ociReference: ghcr.io/rsm-hcd/devcontainer-templates -- name: Additional Dev Container Features by Georg Ofenbeck +- name: Additional Dev Container Features by Georg Ofenbeck maintainer: Georg Ofenbeck contact: https://github.com/GeorgOfenbeck/features/issues - repository: https://github.com/GeorgOfenbeck/features + repository: https://github.com/GeorgOfenbeck/features ociReference: ghcr.io/georgofenbeck/features - name: Dev Container Features by Niko Böckerman maintainer: Niko Böckerman @@ -707,7 +707,7 @@ maintainer: johnluicn contact: https://github.com/johnluicn/devcontainer-templates/issues repository: https://github.com/johnluicn/devcontainer-templates - ociReference: ghcr.io/johnluicn/devcontainer-templates + ociReference: ghcr.io/johnluicn/devcontainer-templates - name: Bob buildsystem and DevBox features maintainer: Dirk Louwers contact: https://github.com/dlouwers/devcontainer-features/issues @@ -767,7 +767,7 @@ maintainer: Cadu Ribeiro contact: https://github.com/duduribeiro/devcontainer-features/issues repository: https://github.com/duduribeiro/devcontainer-features/ - ociReference: ghcr.io/duduribeiro/devcontainer-features + ociReference: ghcr.io/duduribeiro/devcontainer-features - name: Dev Container Features by skriptfabrik maintainer: skriptfabrik contact: https://github.com/skriptfabrik/devcontainer-features/issues @@ -858,3 +858,8 @@ contact: https://github.com/matheusfvesco/devcontainer-templates/issues repository: https://github.com/matheusfvesco/devcontainer-templates ociReference: ghcr.io/matheusfvesco/devcontainer-templates +- name: Dennis Irsigler Dev Container Features + maintainer: dirsigler + contact: https://github.com/dirsigler/devcontainer-features/issues + repository: https://github.com/dirsigler/devcontainer-features + ociReference: ghcr.io/dirsigler/devcontainer-features From 9e164c2bb1d0f4c7ed981f5389c6a74862b0dfbf Mon Sep 17 00:00:00 2001 From: Szymon Janowski Date: Mon, 8 Jul 2024 18:19:45 +0200 Subject: [PATCH 080/140] Added sleter Dev Container templates (#436) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index c037bd06..5f845496 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -863,3 +863,8 @@ contact: https://github.com/dirsigler/devcontainer-features/issues repository: https://github.com/dirsigler/devcontainer-features ociReference: ghcr.io/dirsigler/devcontainer-features +- name: Dev Container Templates by sleter + maintainer: sleter + contact: https://github.com/sleter/mojo-devcontainer/issues + repository: https://github.com/sleter/mojo-devcontainer + ociReference: ghcr.io/sleter/mojo-devcontainer From c5eece50b59d0647165b30d3d7558a17a9d3bc3a Mon Sep 17 00:00:00 2001 From: sidecus <4399408+sidecus@users.noreply.github.com> Date: Thu, 18 Jul 2024 07:05:11 +0800 Subject: [PATCH 081/140] add ghcr.io/sidecus/devcontainer-features (#437) add ghcr.io/sidecus/devcontainer-features to index --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 5f845496..99c5980c 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -868,3 +868,8 @@ contact: https://github.com/sleter/mojo-devcontainer/issues repository: https://github.com/sleter/mojo-devcontainer ociReference: ghcr.io/sleter/mojo-devcontainer +- name: Devcontainer features by sidecus + maintainer: sidecus + contact: https://github.com/sidecus/devcontainer-features/issues + repository: https://github.com/sidecus/devcontainer-features + ociReference: ghcr.io/sidecus/devcontainer-features From 82b661df1be01f905374c04f1ac162bd30cb69a1 Mon Sep 17 00:00:00 2001 From: Julian Pawlowski <75446+jpawlowski@users.noreply.github.com> Date: Fri, 26 Jul 2024 00:49:20 +0200 Subject: [PATCH 082/140] Add Julian Pawlowski Dev Container Features (#439) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 99c5980c..9115ad61 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -873,3 +873,8 @@ contact: https://github.com/sidecus/devcontainer-features/issues repository: https://github.com/sidecus/devcontainer-features ociReference: ghcr.io/sidecus/devcontainer-features +- name: Julian Pawlowski Dev Container Features + maintainer: jpawlowski + contact: https://github.com/jpawlowski/devcontainer-features/issues + repository: https://github.com/jpawlowski/devcontainer-features + ociReference: ghcr.io/jpawlowski/devcontainer-features From 6357d327b28b901e4b7e3daea66b8e01f3bc64cc Mon Sep 17 00:00:00 2001 From: Prabhakar Kumar <64955767+prabhakk-mw@users.noreply.github.com> Date: Sat, 27 Jul 2024 04:34:52 +0530 Subject: [PATCH 083/140] Update collection-index.yml with MATLAB Feature (#438) Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 9115ad61..f6ba0e02 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -873,6 +873,11 @@ contact: https://github.com/sidecus/devcontainer-features/issues repository: https://github.com/sidecus/devcontainer-features ociReference: ghcr.io/sidecus/devcontainer-features +- name: MATLAB Feature for DevContainers + maintainer: The MathWorks Inc. + contact: https://github.com/mathworks/devcontainer-features/issues + repository: https://github.com/mathworks/devcontainer-features + ociReference: ghcr.io/mathworks/devcontainer-features - name: Julian Pawlowski Dev Container Features maintainer: jpawlowski contact: https://github.com/jpawlowski/devcontainer-features/issues From bb7d1d9b3f2eb321f0ec7b39e44d95e3ae4559bc Mon Sep 17 00:00:00 2001 From: Julian Pawlowski <75446+jpawlowski@users.noreply.github.com> Date: Mon, 29 Jul 2024 21:38:40 +0200 Subject: [PATCH 084/140] Update maintainer name for `github.com/jpawlowski/devcontainer-features`` (#444) --- _data/collection-index.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index f6ba0e02..52353077 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -879,7 +879,7 @@ repository: https://github.com/mathworks/devcontainer-features ociReference: ghcr.io/mathworks/devcontainer-features - name: Julian Pawlowski Dev Container Features - maintainer: jpawlowski + maintainer: Julian Pawlowski contact: https://github.com/jpawlowski/devcontainer-features/issues repository: https://github.com/jpawlowski/devcontainer-features ociReference: ghcr.io/jpawlowski/devcontainer-features From c7806d0e9dbcb533e92846f59bc3484d4af09ed2 Mon Sep 17 00:00:00 2001 From: Vatsal Gupta <40350810+gvatsal60@users.noreply.github.com> Date: Tue, 30 Jul 2024 20:49:59 +0530 Subject: [PATCH 085/140] Added new collection sonarlint and pre-commit(via pip) (#441) * Update collection-index.yml * Incorporated Review Comments --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 52353077..3dadf627 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -883,3 +883,8 @@ contact: https://github.com/jpawlowski/devcontainer-features/issues repository: https://github.com/jpawlowski/devcontainer-features ociReference: ghcr.io/jpawlowski/devcontainer-features +- name: pre-commit hooks(via pip) & sonarlint + maintainer: gvatsal60 (Vatsal Gupta) + contact: https://github.com/gvatsal60/dev-container-features/issues + repository: https://github.com/gvatsal60/dev-container-features + ociReference: ghcr.io/gvatsal60/dev-container-features From bd23aa4160d9b7c3f0577d582095cc2536902e00 Mon Sep 17 00:00:00 2001 From: saj <46979675+git-saj@users.noreply.github.com> Date: Sat, 3 Aug 2024 00:16:06 +0100 Subject: [PATCH 086/140] Added devcontainer features by git-saj (#445) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 3dadf627..23eb5aef 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -888,3 +888,8 @@ contact: https://github.com/gvatsal60/dev-container-features/issues repository: https://github.com/gvatsal60/dev-container-features ociReference: ghcr.io/gvatsal60/dev-container-features +- name: Devcontainer features by git-saj + maintainer: git-saj + contact: https://github.com/git-saj/devcontainer-features/issues + repository: https://github.com/git-saj/devcontainer-features + ociReference: ghcr.io/git-saj/devcontainer-features From 4cf77fcce0000c3ef775e5d11894c8e443b8db6e Mon Sep 17 00:00:00 2001 From: Lukas Diener Date: Fri, 9 Aug 2024 19:05:16 +0200 Subject: [PATCH 087/140] Update collection-index.yml (#447) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 23eb5aef..2a537340 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -893,3 +893,8 @@ contact: https://github.com/git-saj/devcontainer-features/issues repository: https://github.com/git-saj/devcontainer-features ociReference: ghcr.io/git-saj/devcontainer-features +- name: Devcontainer features by Codefabrik + maintainer: Codefabrik GmbH + contact: https://github.com/code-fabrik/features/issues + repository: https://github.com/code-fabrik/features + ociReference: ghcr.io/code-fabrik/features From 1a78b1e548a153ee23b476bc1161cb737fbfbd9c Mon Sep 17 00:00:00 2001 From: Juan Ayala <19715035+juan-ayala@users.noreply.github.com> Date: Tue, 13 Aug 2024 11:02:33 -0500 Subject: [PATCH 088/140] Update collection-index.yml (#448) * Update collection-index.yml Add devcontainer feature collection juan-ayala/devcontainer-features * Update collection-index.yml Add devcontainer template collection juan-ayala/devcontainer-templates --- _data/collection-index.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 2a537340..eb46af92 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -898,3 +898,13 @@ contact: https://github.com/code-fabrik/features/issues repository: https://github.com/code-fabrik/features ociReference: ghcr.io/code-fabrik/features +- name: Devcontainer features by Juan Ayala + maintainer: Juan Ayala + contact: https://github.com/juan-ayala/devcontainer-features/issues + repository: https://github.com/juan-ayala/devcontainer-features + ociReference: ghcr.io/juan-ayala/devcontainer-features +- name: Devcontainer templates by Juan Ayala + maintainer: Juan Ayala + contact: https://github.com/juan-ayala/devcontainer-templates/issues + repository: https://github.com/juan-ayala/devcontainer-templates + ociReference: ghcr.io/juan-ayala/devcontainer-templates From c0e49375e39c9a9687cd14a51ebd286a1caff60d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20N=C3=A9meth?= Date: Mon, 19 Aug 2024 18:54:11 +0200 Subject: [PATCH 089/140] add Localstack feature and template repos (#449) --- _data/collection-index.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index eb46af92..e3a7608e 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -908,3 +908,13 @@ contact: https://github.com/juan-ayala/devcontainer-templates/issues repository: https://github.com/juan-ayala/devcontainer-templates ociReference: ghcr.io/juan-ayala/devcontainer-templates +- name: LocalStack DevContainer Feature + maintainer: LocalStack GmbH + contact: https://github.com/localstack/devcontainer-feature/issues + repository: https://github.com/localstack/devcontainer-feature + ociReference: ghcr.io/localstack/devcontainer-feature +- name: LocalStack DevContainer Template + maintainer: LocalStack GmbH + contact: https://github.com/localstack/devcontainer-template/issues + repository: https://github.com/localstack/devcontainer-template + ociReference: ghcr.io/localstack/devcontainer-template From 6fc8f1841f1152db39ab85d28a1dc00ccffd3b96 Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Tue, 20 Aug 2024 17:43:51 -0700 Subject: [PATCH 090/140] Update collection-index.yml (#452) --- _data/collection-index.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index e3a7608e..dc4fa686 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -38,16 +38,6 @@ contact: https://github.com/mpriscella/features/issues repository: https://github.com/mpriscella/features ociReference: ghcr.io/mpriscella/features -- name: DevContainers-Contrib Features - maintainer: Daniel Braun - contact: https://github.com/devcontainers-contrib/features/issues - repository: https://github.com/devcontainers-contrib/features - ociReference: ghcr.io/devcontainers-contrib/features -- name: DevContainers-Contrib Templates - maintainer: Daniel Braun - contact: https://github.com/devcontainers-contrib/templates/issues - repository: https://github.com/devcontainers-contrib/templates - ociReference: ghcr.io/devcontainers-contrib/templates - name: Assorted Features maintainer: eitsupi contact: https://github.com/eitsupi/devcontainer-features/issues From b988b02a54f1379431be998dd76739832d02364f Mon Sep 17 00:00:00 2001 From: Alexander Ilyin Date: Thu, 22 Aug 2024 09:43:56 -0700 Subject: [PATCH 091/140] Update collection-index.yml (#453) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index dc4fa686..de73835d 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -908,3 +908,8 @@ contact: https://github.com/localstack/devcontainer-template/issues repository: https://github.com/localstack/devcontainer-template ociReference: ghcr.io/localstack/devcontainer-template +- name: DeepSpaceCartel DevContainer Features + maintainer: DeepSpaceCartel Inc. + contact: https://github.com/deep-space-cartel/devcontainers-features/issues + repository: https://github.com/deep-space-cartel/devcontainers-features + ociReference: ghcr.io/deep-space-cartel/devcontainers-features From 48b4cf71c7cad01c0d1036615a02f3948d8b5d44 Mon Sep 17 00:00:00 2001 From: Mark Gibson Date: Tue, 27 Aug 2024 22:37:50 +0100 Subject: [PATCH 092/140] Update collection-index.yml (#454) Added Dev Container features by Adaptavist --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index de73835d..10e9f5c9 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -913,3 +913,8 @@ contact: https://github.com/deep-space-cartel/devcontainers-features/issues repository: https://github.com/deep-space-cartel/devcontainers-features ociReference: ghcr.io/deep-space-cartel/devcontainers-features +- name: Dev Container features by Adaptavist + maintainer: Mark Gibson + contact: https://github.com/adaptavist/devcontainer-features/issues + repository: https://github.com/adaptavist/devcontainer-features + ociReference: ghcr.io/adaptavist/devcontainer-features From 78489efda93eecee6f5ea4c4ff2239a19a884de0 Mon Sep 17 00:00:00 2001 From: Alex Wegener <51857173+lx-0@users.noreply.github.com> Date: Fri, 30 Aug 2024 18:30:02 +0200 Subject: [PATCH 093/140] Update collection-index.yml (#455) List lx-0/devcontainer-templates/universal-arm64 template --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 10e9f5c9..a6c5c1a8 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -918,3 +918,8 @@ contact: https://github.com/adaptavist/devcontainer-features/issues repository: https://github.com/adaptavist/devcontainer-features ociReference: ghcr.io/adaptavist/devcontainer-features +- name: Dev Container Templates by Alex Wegener + maintainer: Alex Wegener + contact: https://github.com/lx-0/devcontainer-templates/issues + repository: https://github.com/lx-0/devcontainer-templates + ociReference: ghcr.io/lx-0/devcontainer-templates From c7d7502d3a032e3f33bc015602582f98c96779ef Mon Sep 17 00:00:00 2001 From: Phil Bell Date: Fri, 30 Aug 2024 17:31:44 +0100 Subject: [PATCH 094/140] Adding new collection to collection-index.yml (#456) Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index a6c5c1a8..32b90478 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -918,6 +918,11 @@ contact: https://github.com/adaptavist/devcontainer-features/issues repository: https://github.com/adaptavist/devcontainer-features ociReference: ghcr.io/adaptavist/devcontainer-features +- name: Dev Container features by phil-bell + maintainer: Phil Bell + contact: https://github.com/phil-bell/devcontainer-features/issues + repository: https://github.com/phil-bell/devcontainer-features + ociReference: ghcr.io/phil-bell/devcontainer-features - name: Dev Container Templates by Alex Wegener maintainer: Alex Wegener contact: https://github.com/lx-0/devcontainer-templates/issues From b246c18093369cc06870476ab3aed5e3cde5dfb8 Mon Sep 17 00:00:00 2001 From: Hiroyuki Okada Date: Wed, 4 Sep 2024 01:19:58 +0900 Subject: [PATCH 095/140] remove ghcr.io/akhildevelops/devcontainer-features/android-cli (#457) --- _data/collection-index.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 32b90478..f11477f9 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -278,11 +278,6 @@ contact: https://github.com/swift-server/swift-devcontainer-template/issues repository: https://github.com/swift-server/swift-devcontainer-template ociReference: ghcr.io/swift-server/swift-devcontainer-template -- name: Android SDK Tools and Apt packages - maintainer: akhildevelops - contact: https://github.com/akhildevelops/devcontainer-features/issues - repository: https://github.com/akhildevelops/devcontainer-features - ociReference: ghcr.io/akhildevelops/devcontainer-features - name: UNSW cs3231 OS Development maintainer: Hamish Cox contact: https://github.com/HamishWHC/cs3231-devcontainer/issues From 2c1fb244562e9fd15468fadc6977ea988de1a515 Mon Sep 17 00:00:00 2001 From: Arek Kalandyk <36413794+koralowiec@users.noreply.github.com> Date: Thu, 12 Sep 2024 19:45:07 +0200 Subject: [PATCH 096/140] fix: update link to devcontainer-collection.json (#461) --- _implementors/features-distribution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_implementors/features-distribution.md b/_implementors/features-distribution.md index 134c9c1c..77e0f2b8 100644 --- a/_implementors/features-distribution.md +++ b/_implementors/features-distribution.md @@ -23,7 +23,7 @@ Goals include: Features source code is stored in a git repository. -For ease of authorship and maintenance, [1..n] features can share a single git repository. This set of Features is referred to as a "collection," and will share the same [`devcontainer-collection.json`](#devcontainer-collection.json) file and "namespace" (eg. `/`). +For ease of authorship and maintenance, [1..n] features can share a single git repository. This set of Features is referred to as a "collection," and will share the same [`devcontainer-collection.json`](#devcontainer-collection-json) file and "namespace" (eg. `/`). Source code for the set follows the example file structure below: From 09c556241e69f5b285ffedc75d5e35bc4bcd303d Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 19 Sep 2024 08:56:14 +0200 Subject: [PATCH 097/140] Document GPU property (#463) --- _implementors/json_reference.md | 1 + 1 file changed, 1 insertion(+) diff --git a/_implementors/json_reference.md b/_implementors/json_reference.md index b0378ac1..8c1f58dd 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -99,6 +99,7 @@ While `devcontainer.json` does not focus on hardware or VM provisioning, it can | `hostRequirements.cpus` 🏷️ | integer | Indicates the minimum required number of CPUs / virtual CPUs / cores. For example: `"hostRequirements": {"cpus": 2}` | | `hostRequirements.memory` 🏷️ | string | A string indicating minimum memory requirements with a `tb`, `gb`, `mb`, or `kb` suffix. For example, `"hostRequirements": {"memory": "4gb"}` | | `hostRequirements.storage` 🏷️ | string | A string indicating minimum storage requirements with a `tb`, `gb`, `mb`, or `kb` suffix. For example, `"hostRequirements": {"storage": "32gb"}` | +| `hostRequirements.gpu` 🏷️ | boolean,
string,
object | Indicates if any GPU is required. A boolean indicates if a GPU is required or not. The string `"optional"` indicates that a GPU is used when available, but is not required.

The object syntax specifies how much GPU resources are required. The `cores` property indicates the minimum number of cores and the `memory` property indicates minimum storage requirements with a `tb`, `gb`, `mb`, or `kb` suffix. For example, `"gpu": { "cores": 1000, "storage": "32gb" }` | {: .table .table-bordered .table-responsive} ## Port attributes From 00205b037e725333adcc1531e326786543737cd3 Mon Sep 17 00:00:00 2001 From: "Victor M. Varela" Date: Mon, 23 Sep 2024 18:28:08 +0200 Subject: [PATCH 098/140] Update collection-index.yml (#466) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index f11477f9..0aa962a8 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -923,3 +923,8 @@ contact: https://github.com/lx-0/devcontainer-templates/issues repository: https://github.com/lx-0/devcontainer-templates ociReference: ghcr.io/lx-0/devcontainer-templates +- name: Devcontainer features by vmvarela + maintainer: Victor M. Varela + contact: https://github.com/vmvarela/devcontainer-features/issues + repository: https://github.com/vmvarela/devcontainer-features + ociReference: ghcr.io/vmvarela/devcontainer-features From 3ba9926cd0cf5bb453bf33837138ef07bd18242c Mon Sep 17 00:00:00 2001 From: Hauke D Date: Mon, 23 Sep 2024 18:54:16 +0200 Subject: [PATCH 099/140] collection-index.yml: add feature 'perl' (#465) * Update collection-index.yml * Update _data/collection-index.yml Co-authored-by: Samruddhi Khandale --------- Co-authored-by: Samruddhi Khandale Co-authored-by: Samruddhi Khandale --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 0aa962a8..8309d1c8 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -923,6 +923,11 @@ contact: https://github.com/lx-0/devcontainer-templates/issues repository: https://github.com/lx-0/devcontainer-templates ociReference: ghcr.io/lx-0/devcontainer-templates +- name: Hauke's Features for Development Containers + maintainer: Hauke D + contact: https://github.com/haukex/devcontainer-features/issues + repository: https://github.com/haukex/devcontainer-features + ociReference: ghcr.io/haukex/devcontainer-features - name: Devcontainer features by vmvarela maintainer: Victor M. Varela contact: https://github.com/vmvarela/devcontainer-features/issues From 9f681f29cc5b60ea2829b2c9126984f9e37cd2da Mon Sep 17 00:00:00 2001 From: Caesarovich <38408878+Caesarovich@users.noreply.github.com> Date: Tue, 24 Sep 2024 21:14:16 +0200 Subject: [PATCH 100/140] Add feature for Crystal (#467) * Update collection-index.yml * fix case issue --- _data/collection-index.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 8309d1c8..3db2e396 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -932,4 +932,8 @@ maintainer: Victor M. Varela contact: https://github.com/vmvarela/devcontainer-features/issues repository: https://github.com/vmvarela/devcontainer-features - ociReference: ghcr.io/vmvarela/devcontainer-features +- name: Crystal features + maintainer: Caesarovich + contact: https://github.com/Caesarovich/devcontainer-feature-crystal/issues + repository: https://github.com/Caesarovich/devcontainer-feature-crystal + ociReference: ghcr.io/caesarovich/devcontainer-feature-crystal From 2ea407bf1853e77c52e8b0e28a33ceed32f35c68 Mon Sep 17 00:00:00 2001 From: Arek Kalandyk <36413794+koralowiec@users.noreply.github.com> Date: Wed, 25 Sep 2024 18:20:43 +0200 Subject: [PATCH 101/140] feat: add devcontainers-extra features to collection (#462) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 3db2e396..3f31ba8b 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -937,3 +937,8 @@ contact: https://github.com/Caesarovich/devcontainer-feature-crystal/issues repository: https://github.com/Caesarovich/devcontainer-feature-crystal ociReference: ghcr.io/caesarovich/devcontainer-feature-crystal +- name: Dev Container Features by devcontainers-extra + maintainer: devcontainers-extra + contact: https://github.com/devcontainers-extra/features/issues + repository: https://github.com/devcontainers-extra/features + ociReference: ghcr.io/devcontainers-extra/features From 8d793c719085c8ab5f0f4850d408a81c38b0e209 Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Thu, 26 Sep 2024 12:02:27 -0700 Subject: [PATCH 102/140] sync optionalPaths addition with spec (https://github.com/devcontainers/spec/pull/484) (#459) --- _implementors/templates.md | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/_implementors/templates.md b/_implementors/templates.md index 9e12eff2..681a48c8 100644 --- a/_implementors/templates.md +++ b/_implementors/templates.md @@ -37,10 +37,11 @@ The properties of the file are as follows: | `description` | string | Description of the Template. | | `documentationURL` | string | Url that points to the documentation of the Template. | | `licenseURL` | string | Url that points to the license of the Template. | -| `options` | object | A map of options that the supporting tools should use to populate different configuration options for the Template. | +| [`options`](#options) | object | A map of options that the supporting tools should use to populate different configuration options for the Template. | | `platforms` | array | Languages and platforms supported by the Template. | | `publisher` | string | Name of the publisher/maintainer of the Template. | | `keywords` | array | List of strings relevant to a user that would search for this Template. | +| [`optionalPaths`](#optionalPaths) | array | An array of files or directories that tooling may consider "optional" when applying a Template. Directories are indicated with a trailing `/*`, (eg: `.github/*`). {: .table .table-bordered .table-responsive} ### The `options` property @@ -71,6 +72,30 @@ The `options` property contains a map of option IDs and their related configurat > `Note`: The `options` must be unique for every `devcontainer-template.json` +### The `optionalPaths` property + +Before applying a Template, tooling must inspect the `optionalPaths` property of a Template and prompt the user on whether each file or folder should be included in the resulting output workspace folder. A path is relative to the root of the Template source directory. + +- For a single file, provide the full relative path (without any leading or trailing path delimiters). +- For a directory, provide the full relative path with a trailing slash and asterisk (`/*`) appended to the path. The directory and its children will be recursively ignored. + +Examples are shown below: + +```jsonc +{ + "id": "cpp", + "version": "3.0.0", + "name": "C++", + "description": "Develop C++ applications", + "optionalPaths": [ + "GETTING-STARTED.md", // Single file + "example-project-1/MyProject.csproj", // Single file in nested directory + ".github/*" // Entire recursive contents of directory + ] +} +``` + + ### Referencing a Template The `id` format (`//