From adf68b8498f072d701e1375b1ca4911a69a3d01b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oleksis=20Fraga=20Men=C3=A9ndez?= <44526468+oleksis@users.noreply.github.com> Date: Fri, 9 Dec 2022 15:23:10 -0500 Subject: [PATCH 001/312] Add NAPPTIVE Playground CLI feature to the collection index (#97) * Add NAPPTIVE Playground CLI feature to the collection index * Update _data/collection-index.yml The ociReference is the ${registry}/${owner}/${repoName} without the id part. 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 80a2ec83..d78912d5 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -153,3 +153,8 @@ contact: https://github.com/jsburckhardt/devcontainer-features/issues repository: https://github.com/jsburckhardt/devcontainer-features ociReference: ghcr.io/jsburckhardt/devcontainer-features +- name: NAPPTIVE Playground CLI Features + maintainer: oleksis + contact: https://github.com/oleksis/playground-cli/issues + repository: https://github.com/oleksis/playground-cli + ociReference: ghcr.io/oleksis/playground-cli From 7ccafd03b9e195ff5b82cc16514c2e23c2b2f02e Mon Sep 17 00:00:00 2001 From: Daniel Braun Date: Mon, 12 Dec 2022 18:37:14 +0200 Subject: [PATCH 002/312] Added devcontainer-contrib templates collection (#98) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently this template collection contains a basic terraform template (not azure-oriented like the current official terraform-azure template). I also plan o expand the collection in the future 😄 --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index d78912d5..6bd62e01 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -43,6 +43,11 @@ 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 9e8f63c2e980634e4a71d8e6e3144d488521c27f Mon Sep 17 00:00:00 2001 From: Eki Baskoro <431041+ebaskoro@users.noreply.github.com> Date: Tue, 13 Dec 2022 03:52:54 +1100 Subject: [PATCH 003/312] Updated collection index. (#99) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 6bd62e01..d2112c1a 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -163,3 +163,8 @@ contact: https://github.com/oleksis/playground-cli/issues repository: https://github.com/oleksis/playground-cli ociReference: ghcr.io/oleksis/playground-cli +- name: Baskoro OSI devcontainer features + maintainer: Eki Baskoro + contact: https://github.com/ebaskoro/devcontainer-features/issues + repository: https://github.com/ebaskoro/devcontainer-features + ociReference: ghcr.io/ebaskoro/devcontainer-features \ No newline at end of file From 0ae6515258e645503e1c77a195565545014140d2 Mon Sep 17 00:00:00 2001 From: Chuck Lantz Date: Tue, 13 Dec 2022 09:51:04 -0800 Subject: [PATCH 004/312] Add limitations, new supporting tools (#100) --- supporting.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/supporting.md b/supporting.md index f0163ddc..849bd857 100644 --- a/supporting.md +++ b/supporting.md @@ -41,7 +41,7 @@ You may learn more in the [announcement blog post](https://devblogs.microsoft.co ## Tools -## Dev container CLI +## Dev Container CLI A dev container command line interface (CLI) that implements this specification. It is in development in the [devcontainers/cli](https://github.com/devcontainers/cli) repo. @@ -51,6 +51,15 @@ The CLI can take a `devcontainer.json` and create and configure a dev container VS Code has a [CLI](https://code.visualstudio.com/docs/remote/devcontainer-cli) which may be installed within the Dev Containers extension or through the command line. +### Cachix devenv + +Cachix's [devenv](https://devenv.sh/) supports automatically generating a `.devcontainer.json` file so you can use it with any Dev Container spec supporting tool. See [devenv documentation](https://devenv.sh/integrations/codespaces-devcontainer/) for detais. + +### Jetpack.io Devbox + +[Jetpack.io's VS Code extension](https://marketplace.visualstudio.com/items?itemName=jetpack-io.devbox) supports a **Generate Dev Container files** command so you can use Jetpack.io from Dev Container spec supporting tools. + + ### Visual Studio Code Dev Containers The [**Visual Studio Code Dev Containers** extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) lets you use a [Docker container](https://docker.com) as a full-featured development environment. It allows you to open any folder inside (or mounted into) a container and take advantage of Visual Studio Code's full feature set. There is more information in the Dev Containers [documentation](https://code.visualstudio.com/docs/remote/containers). @@ -101,18 +110,21 @@ If your Codespaces project needs additional permissions for other repositories, } ``` +Note that currently Codespaces reads these properties from devcontainer.json, not image metadata. + #### Product specific limitations Some properties may apply differently to Codespaces. -| Property or variable | Type | Description | -|:------------------|:------------|:------------| +| Property or variable | Type | Description | +|----------|---------|----------------------| | `mounts` | array | Codespaces ignores "bind" mounts with the exception of the Docker socket. Volume mounts are still allowed.| | `forwardPorts` | array | Codespaces does not yet support the `"host:port"` variation of this property. | | `portsAttributes` | object | Codespaces does not yet support the `"host:port"` variation of this property.| | `shutdownAction` | enum | Does not apply to Codespaces. | | `${localEnv:VARIABLE_NAME}` | Any | For Codespaces, the host is in the cloud rather than your local machine.| -| `waitFor` | enum | Codespaces does not yet support `waitFor`. | +| `customizations.codespaces` | object | Codespaces reads this property from devcontainer.json, not image metadata. | +| `hostRequirements` | object | Codespaces reads this property from devcontainer.json, not image metadata. | {: .table .table-bordered .table-responsive} ### Schema From 4bc5ecf0c67ff636096dc4be1fa0a31fea15a635 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Wed, 14 Dec 2022 17:19:25 +0000 Subject: [PATCH 005/312] Adds in my CodeSpaces Features to list SQLite & SMTP4Dev (#101) --- _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 d2112c1a..e1123bcc 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -167,4 +167,9 @@ maintainer: Eki Baskoro contact: https://github.com/ebaskoro/devcontainer-features/issues repository: https://github.com/ebaskoro/devcontainer-features - ociReference: ghcr.io/ebaskoro/devcontainer-features \ No newline at end of file + ociReference: ghcr.io/ebaskoro/devcontainer-features +- name: A collection of useful GitHub CodeSpace features + maintainer: Warren Buckley + contact: https://github.com/warrenbuckley/codespace-features/issues + repository: https://github.com/warrenbuckley/codespace-features + ociReference: ghcr.io/warrenbuckley/codespace-features From c035f27b24faed8db695edfc66f092f1579295fa Mon Sep 17 00:00:00 2001 From: James Mart <42752296+James-Mart@users.noreply.github.com> Date: Wed, 14 Dec 2022 12:23:30 -0500 Subject: [PATCH 006/312] add psibase devcontainer template repo (#102) Co-authored-by: Josh Spicer --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index e1123bcc..25e4fab7 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -163,6 +163,11 @@ contact: https://github.com/oleksis/playground-cli/issues repository: https://github.com/oleksis/playground-cli ociReference: ghcr.io/oleksis/playground-cli +- name: Psibase templates + maintainer: James-Mart + contact: https://github.com/gofractally/psibase-devcontainer-template/issues + repository: https://github.com/gofractally/psibase-devcontainer-template/issues + ociReference: ghcr.io/gofractally/psibase-devcontainer-template - name: Baskoro OSI devcontainer features maintainer: Eki Baskoro contact: https://github.com/ebaskoro/devcontainer-features/issues From 051079f5af9885f1fdb426190384c52d04cd6fd7 Mon Sep 17 00:00:00 2001 From: Rahul goyal <36236894+rahulgoyal436@users.noreply.github.com> Date: Thu, 15 Dec 2022 22:41:09 +0530 Subject: [PATCH 007/312] Update collection-index.yml (#104) Roost cluster feature addition --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 25e4fab7..576cfe4c 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -178,3 +178,8 @@ contact: https://github.com/warrenbuckley/codespace-features/issues repository: https://github.com/warrenbuckley/codespace-features ociReference: ghcr.io/warrenbuckley/codespace-features +- name: Roost Cluster + maintainer: Roost.ai (Harish Agrawal) + contact: https://github.com/roost-io/features/issues + repository: https://github.com/roost-io/features + ociReference: ghcr.io/roost-io/features From a4fd425081c993289887a879d90f645c9d91073e Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Thu, 15 Dec 2022 09:56:28 -0800 Subject: [PATCH 008/312] update hyperlink (#103) --- _posts/2022-11-01-author-a-feature.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_posts/2022-11-01-author-a-feature.md b/_posts/2022-11-01-author-a-feature.md index dabcae96..68829b16 100644 --- a/_posts/2022-11-01-author-a-feature.md +++ b/_posts/2022-11-01-author-a-feature.md @@ -101,8 +101,8 @@ https://github.com/users//packages/container/%2F/setti If you'd like your Features to appear in our [public index](/features) so that other community members can find them, you can do the following: -* Go to [github.com/devcontainers/devcontainers.github.io](github.com/devcontainers/devcontainers.github.io), which is the GitHub repo backing [containers.dev](https://containers.dev/) +* Go to [github.com/devcontainers/devcontainers.github.io](https://github.com/devcontainers/devcontainers.github.io), which is the GitHub repo backing [containers.dev](https://containers.dev/) * Open a PR to modify the [collection-index.yml](https://github.com/devcontainers/devcontainers.github.io/blob/gh-pages/_data/collection-index.yml) file * Features housed in other OCI Artifact container registries can be included as long as they can be downloaded without a login. -Feature collections are scanned to populate a Feature index on the [containers.dev site](/features) and allow them to appear in Dev Container creation UX in [supporting tools](https://containers.dev/supporting) like [VS Code Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) and [GitHub Codespaces](https://github.com/features/codespaces). \ No newline at end of file +Feature collections are scanned to populate a Feature index on the [containers.dev site](/features) and allow them to appear in Dev Container creation UX in [supporting tools](https://containers.dev/supporting) like [VS Code Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) and [GitHub Codespaces](https://github.com/features/codespaces). From 3ce318234e8f0fd9776c20bcca3543fa49339edb Mon Sep 17 00:00:00 2001 From: Lennart Jern Date: Fri, 16 Dec 2022 21:39:33 +0200 Subject: [PATCH 009/312] Add lentzi90 features (#106) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 576cfe4c..eaba313d 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -183,3 +183,8 @@ contact: https://github.com/roost-io/features/issues repository: https://github.com/roost-io/features ociReference: ghcr.io/roost-io/features +- name: lentzi90 devcontainer features + maintainer: Lennart Jern + contact: https://github.com/lentzi90/features/issues + repository: https://github.com/lentzi90/features + ociReference: ghcr.io/lentzi90/features From 966ca8df2ad48f82ba87d6943a0cbaac88776590 Mon Sep 17 00:00:00 2001 From: Josh Abernathy Date: Fri, 16 Dec 2022 14:42:43 -0500 Subject: [PATCH 010/312] Add docs for codespaces.openFiles (#105) --- supporting.md | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/supporting.md b/supporting.md index 849bd857..4cf991f4 100644 --- a/supporting.md +++ b/supporting.md @@ -97,19 +97,34 @@ If your Codespaces project needs additional permissions for other repositories, ```json "customizations": { - // Configure properties specific to Codespaces. - "codespaces": { - "repositories": { - "my_org/my_repo": { - "permissions": { - "issues": "write" - } + // Configure properties specific to Codespaces. + "codespaces": { + "repositories": { + "my_org/my_repo": { + "permissions": { + "issues": "write" } } } + } } ``` +You can customize which files are initially opened when the codespace is created: +```json +"customizations": { + // Configure properties specific to Codespaces. + "codespaces": { + "openFiles": [ + "README" + "src/index.js" + ] + } +} +``` + +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. #### Product specific limitations From b26f99e2a57d1baf77a4c4ddf70e28fa7628050a Mon Sep 17 00:00:00 2001 From: Chuck Lantz Date: Fri, 16 Dec 2022 12:24:19 -0800 Subject: [PATCH 011/312] Add article on using Dockerfiles/Compose, formatting tweaks and clarifications (#107) Co-authored-by: Brigit Murtaugh Co-authored-by: Samruddhi Khandale --- _posts/2022-11-01-author-a-feature.md | 2 +- _posts/2022-12-16-dockerfiles.md | 142 ++++++++++++++++++++++++++ supporting.md | 34 +++--- 3 files changed, 163 insertions(+), 15 deletions(-) create mode 100644 _posts/2022-12-16-dockerfiles.md diff --git a/_posts/2022-11-01-author-a-feature.md b/_posts/2022-11-01-author-a-feature.md index 68829b16..ed9f3a7d 100644 --- a/_posts/2022-11-01-author-a-feature.md +++ b/_posts/2022-11-01-author-a-feature.md @@ -5,7 +5,7 @@ author: "@joshspicer" authorUrl: https://github.com/joshspicer --- -Development container ['Features'](/features) are self-contained, shareable units of installation code and development container configuration. We [define a pattern](/implementors/features-distribution) for authoring and self-publishing Features. +Development container ["Features"](/features) are self-contained, shareable units of installation code and development container configuration. We [define a pattern](/implementors/features-distribution) for authoring and self-publishing Features. In this document, we'll outline a "quickstart" to help you get up-and-running with creating and sharing your first Feature. You may review an example along with guidance in our [devcontainers/feature-starter](https://github.com/devcontainers/feature-starter) repo as well. diff --git a/_posts/2022-12-16-dockerfiles.md b/_posts/2022-12-16-dockerfiles.md new file mode 100644 index 00000000..be8b8c2a --- /dev/null +++ b/_posts/2022-12-16-dockerfiles.md @@ -0,0 +1,142 @@ +--- +layout: post +title: "Using Images, Dockerfiles, and Docker Compose" +author: "@chuxel" +authorUrl: https://github.com/chuxel +--- + +When creating a development container, you have a variety of different ways to customize your environment like ["Features"](/features) or [lifecycle scripts](implementors/json_reference/#lifecycle-scripts). However, if you are familiar with containers, you may want to use a [Dockerfile](#dockerfile) or [Docker Compose / Compose](#docker-compose) to customize your environment. This article will walk through how to use these formats with the Dev Container spec. + +## Using a Dockerfile + +To keep things simple, many [Dev Container Templates](/templates) use container image references. + +```json +{ + "image": "mcr.microsoft.com/devcontainers/base:ubuntu" +} +``` + +However, [Dockerfiles](https://docs.docker.com/engine/reference/builder/) are a great way to extend images, add additional native OS packages, or make minor edits to the OS image. You can reuse any Dockerfile, but let's walk through how to create one from scratch. + +First, add a file named `Dockerfile` next to your `devcontainer.json`. For example: + +```Dockerfile +FROM mcr.microsoft.com/devcontainers/base:ubuntu +# Install the xz-utils package +RUN apt-get update && apt-get install -y xz-utils +``` + +Next, remove the `image` property from `devcontainer.json` (if it exists) and add the `build` and `dockerfile` properties instead: + +```json +{ + "build": { + // Path is relataive to the devcontainer.json file. + "dockerfile": "Dockerfile" + } +} +``` + +That's it! When you start up your Dev Container, the Dockerfile will be automatically built with no additional work. See [Dockerfile scenario reference](implementors/json_reference/#image-specific) for more information on other related devcontainer.json properties. + +### Iterating on an image that includes Dev Container metadata + +Better yet, you can can use a Dockerfile as a part of authoring an image you can share with others. You can even **add Dev Container settings and metadata right into the image itself**. This avoids having to duplicate config and settings in multiple devcontainer.json files and keeps them in sync with your images! + +See the reference on **[pre-building](/implementors/reference/#prebuilding)** to learn more! + +## Using a Dockerfile + +[Docker Compose](https://docs.docker.com/compose/) is a great way to define a multi-container development environment. Rather than adding things like databases or redis to your Dockerfile, you can reference existing images for these services and focus your Dev Container's content on tools and utilities you need for development. + +### Using an image with Docker Compose + +As mentioned in the Dockerfile section, to keep things simple, many [Dev Container Templates](/templates) use container image references. + +```json +{ + "image": "mcr.microsoft.com/devcontainers/base:ubuntu" +} +``` + +Let's create a `docker-compose.yml` file next to your `devcontainer.json` that references the same image and includes a PostgreSQL database: + +```yaml +version: '3.8' +services: + devcontainer: + image: mcr.microsoft.com/devcontainers/base:ubuntu + volumes: + - ../..:/workspaces:cached + network_mode: service:db + command: sleep infinity + + db: + image: postgres:latest + restart: unless-stopped + volumes: + - postgres-data:/var/lib/postgresql/data + environment: + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + POSTGRES_DB: postgres + +volumes: + postgres-data: +``` + +In this example: +- `../..:/workspaces:cached` mounts the workspace folder from the local source tree into the Dev Container. +- `network_mode: service:db` puts the Dev Container on the same network as the database, so that it can access it on `localhost`. +- The `db` section uses the [Postgres](https://hub.docker.com/_/postgres) image with a few settings. + +Next, let's configure devcontainer.json to use it. + +```json +{ + "dockerComposeFile": "docker-compose.yml", + "service": "devcontainer", + "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}" +} +``` + +In this example: +- `service` indicates which service in the `docker-compose.yml` file is the Dev Container. +- `dockerComposeFile` indicates where to find the `docker-compose.yml` file. +- `workspaceFolder` indicates where to mount the workspace folder. This corresponds to a sub-folder under the mount point from `../..:/workspaces:cached` in the `docker-compose.yml` file. + +That's it! + +### Using a Dockerfile with Docker Compose + +You can also combine these scenarios and use Dockerfile with Docker Compose. This time we'll update `docker-compose.yml` to reference the Dockerfile by replacing `image` with a similar `build` section: + +```yaml +version: '3.8' +services: + devcontainer: + build: + context: . + dockerfile: Dockerfile + volumes: + - ../..:/workspaces:cached + network_mode: service:db + + db: + image: postgres:latest + restart: unless-stopped + volumes: + - postgres-data:/var/lib/postgresql/data + environment: + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + POSTGRES_DB: postgres + +volumes: + postgres-data: +``` + +Finally, as in the Dockerfile example, you can use this same setup to author a Dev Container image you can share with others and add Dev Container settings and metadata right into the image itself. + +See the reference on **[pre-building](/implementors/reference/#prebuilding)** to learn more! \ No newline at end of file diff --git a/supporting.md b/supporting.md index 4cf991f4..bdeaab41 100644 --- a/supporting.md +++ b/supporting.md @@ -31,7 +31,7 @@ Visual Studio Code specific properties go under `vscode` inside `customizations` | `settings` | object | Adds default `settings.json` values into a container/machine specific settings file. Defaults to `{}`. | {: .table .table-bordered .table-responsive} -Please note that [Dev Containers](#dev-containers) and [GitHub Codespaces](#github-codespaces) support the VS Code properties. +Please note that the [Dev Containers](#dev-containers) extension and [GitHub Codespaces](#github-codespaces) support these VS Code properties. ### Visual Studio @@ -41,30 +41,36 @@ You may learn more in the [announcement blog post](https://devblogs.microsoft.co ## Tools -## Dev Container CLI +### Dev Container CLI -A dev container command line interface (CLI) that implements this specification. It is in development in the [devcontainers/cli](https://github.com/devcontainers/cli) repo. +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 commands](implementors/json_reference/#lifecycle-scripts) like `postCreateCommand`, providing more power than a plain `docker build` and `docker run`. -### VS Code extension CLI +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`. -VS Code has a [CLI](https://code.visualstudio.com/docs/remote/devcontainer-cli) which may be installed within the Dev Containers extension or through the command line. +#### 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 the 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/) supports automatically generating a `.devcontainer.json` file so you can use it with any Dev Container spec supporting tool. See [devenv documentation](https://devenv.sh/integrations/codespaces-devcontainer/) for detais. +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's VS Code extension](https://marketplace.visualstudio.com/items?itemName=jetpack-io.devbox) supports a **Generate Dev Container files** command so you can use Jetpack.io from Dev Container spec supporting tools. +[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! -### Visual Studio Code Dev Containers +### VS Code Dev Containers extension -The [**Visual Studio Code Dev Containers** extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) lets you use a [Docker container](https://docker.com) as a full-featured development environment. It allows you to open any folder inside (or mounted into) a container and take advantage of Visual Studio Code's full feature set. There is more information in the Dev Containers [documentation](https://code.visualstudio.com/docs/remote/containers). +The [Visual Studio Code Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) lets you use a [Docker container](https://docker.com) as a full-featured development environment. It allows you to open any folder inside (or mounted into) a container and take advantage of Visual Studio Code's full feature set. There is more information in the Dev Containers [documentation](https://code.visualstudio.com/docs/remote/containers). -> **Tip:** If you make a change to your dev container after having built and connected to it, be sure to run **Dev Containers: Rebuild Container** from the Command Palette (`kbstyle(F1)`) to pick up any changes you make. +> **Tip:** If you make a change to your dev container after having built and connected to it, be sure to run **Dev Containers: Rebuild Container** from the Command Palette (cmd/ctrl+shift+p or F1) to pick up any changes you make. #### Product specific properties @@ -82,13 +88,13 @@ Some properties may also have certain limitations in the Dev Containers extensio | `${localWorkspaceFolderBasename}` | Any | Not yet supported when using Clone Repository in Container Volume. | {: .table .table-bordered .table-responsive} +## Services + ### GitHub Codespaces A [codespace](https://docs.github.com/en/codespaces/overview) is a development environment that's hosted in the cloud. Codespaces run on a variety of VM-based compute options hosted by GitHub.com, which you can configure from 2 core machines up to 32 core machines. You can connect to your codespaces from the browser or locally using Visual Studio Code. -> **Tip:** If you make a change to your dev container after having built and connected to your codespace, be sure to run **Codespaces: Rebuild Container** from the Command Palette (`kbstyle(F1)`) to pick up any changes you make. - -> **Tip** Codespaces implements an auto `workspaceFolder` mount in **Docker Compose** scenarios. +> **Tip:** If you make a change to your dev container after having built and connected to your codespace, be sure to run **Codespaces: Rebuild Container** from the Command Palette (cmd/ctrl+shift+p or F1) to pick up any changes you make. #### Product specific properties GitHub Codespaces works with a growing number of tools and, where applicable, their `devcontainer.json` properties. For example, connecting the Codespaces web editor or VS Code enables the use of [VS Code properties](#visual-studio-code). From 68b15bbcb9a068b7acef2af3498ecce8cf41b12a Mon Sep 17 00:00:00 2001 From: Chuck Lantz Date: Fri, 16 Dec 2022 12:39:49 -0800 Subject: [PATCH 012/312] Fix typo, links in dockerfile guide (#108) --- _posts/2022-12-16-dockerfiles.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_posts/2022-12-16-dockerfiles.md b/_posts/2022-12-16-dockerfiles.md index be8b8c2a..904f24fb 100644 --- a/_posts/2022-12-16-dockerfiles.md +++ b/_posts/2022-12-16-dockerfiles.md @@ -5,7 +5,7 @@ author: "@chuxel" authorUrl: https://github.com/chuxel --- -When creating a development container, you have a variety of different ways to customize your environment like ["Features"](/features) or [lifecycle scripts](implementors/json_reference/#lifecycle-scripts). However, if you are familiar with containers, you may want to use a [Dockerfile](#dockerfile) or [Docker Compose / Compose](#docker-compose) to customize your environment. This article will walk through how to use these formats with the Dev Container spec. +When creating a development container, you have a variety of different ways to customize your environment like ["Features"](/features) or [lifecycle scripts](/implementors/json_reference/#lifecycle-scripts). However, if you are familiar with containers, you may want to use a [Dockerfile](/implementors/guide/dockerfiles#dockerfile) or [Docker Compose / Compose](/implementors/guide/dockerfiles#docker-compose) to customize your environment. This article will walk through how to use these formats with the Dev Container spec. ## Using a Dockerfile @@ -46,7 +46,7 @@ Better yet, you can can use a Dockerfile as a part of authoring an image you can See the reference on **[pre-building](/implementors/reference/#prebuilding)** to learn more! -## Using a Dockerfile +## Using Docker Compose [Docker Compose](https://docs.docker.com/compose/) is a great way to define a multi-container development environment. Rather than adding things like databases or redis to your Dockerfile, you can reference existing images for these services and focus your Dev Container's content on tools and utilities you need for development. From 7838c5a5ebd784f7d60bf9e22fef6f25a56828e6 Mon Sep 17 00:00:00 2001 From: Chuck Lantz Date: Fri, 16 Dec 2022 12:48:38 -0800 Subject: [PATCH 013/312] More minor fixes for Dockerfile guide --- _posts/2022-12-16-dockerfiles.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_posts/2022-12-16-dockerfiles.md b/_posts/2022-12-16-dockerfiles.md index 904f24fb..e7c08d7d 100644 --- a/_posts/2022-12-16-dockerfiles.md +++ b/_posts/2022-12-16-dockerfiles.md @@ -5,7 +5,7 @@ author: "@chuxel" authorUrl: https://github.com/chuxel --- -When creating a development container, you have a variety of different ways to customize your environment like ["Features"](/features) or [lifecycle scripts](/implementors/json_reference/#lifecycle-scripts). However, if you are familiar with containers, you may want to use a [Dockerfile](/implementors/guide/dockerfiles#dockerfile) or [Docker Compose / Compose](/implementors/guide/dockerfiles#docker-compose) to customize your environment. This article will walk through how to use these formats with the Dev Container spec. +When creating a development container, you have a variety of different ways to customize your environment like ["Features"](/features) or [lifecycle scripts](/implementors/json_reference/#lifecycle-scripts). However, if you are familiar with containers, you may want to use a [Dockerfile](/guide/dockerfiles#dockerfile) or [Docker Compose / Compose](/guide/dockerfiles#docker-compose) to customize your environment. This article will walk through how to use these formats with the Dev Container spec. ## Using a Dockerfile @@ -122,6 +122,7 @@ services: volumes: - ../..:/workspaces:cached network_mode: service:db + command: sleep infinity db: image: postgres:latest From 00aff545a559ade0cd0671183c621c8f96da7d66 Mon Sep 17 00:00:00 2001 From: Chuck Lantz Date: Fri, 16 Dec 2022 13:01:13 -0800 Subject: [PATCH 014/312] Rename guide to match template links --- _posts/{2022-12-16-dockerfiles.md => 2022-12-16-dockerfile.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename _posts/{2022-12-16-dockerfiles.md => 2022-12-16-dockerfile.md} (95%) diff --git a/_posts/2022-12-16-dockerfiles.md b/_posts/2022-12-16-dockerfile.md similarity index 95% rename from _posts/2022-12-16-dockerfiles.md rename to _posts/2022-12-16-dockerfile.md index e7c08d7d..ecdb6b28 100644 --- a/_posts/2022-12-16-dockerfiles.md +++ b/_posts/2022-12-16-dockerfile.md @@ -5,7 +5,7 @@ author: "@chuxel" authorUrl: https://github.com/chuxel --- -When creating a development container, you have a variety of different ways to customize your environment like ["Features"](/features) or [lifecycle scripts](/implementors/json_reference/#lifecycle-scripts). However, if you are familiar with containers, you may want to use a [Dockerfile](/guide/dockerfiles#dockerfile) or [Docker Compose / Compose](/guide/dockerfiles#docker-compose) to customize your environment. This article will walk through how to use these formats with the Dev Container spec. +When creating a development container, you have a variety of different ways to customize your environment like ["Features"](/features) or [lifecycle scripts](/implementors/json_reference/#lifecycle-scripts). However, if you are familiar with containers, you may want to use a [Dockerfile](/guide/dockerfile#dockerfile) or [Docker Compose / Compose](/guide/dockerfile#docker-compose) to customize your environment. This article will walk through how to use these formats with the Dev Container spec. ## Using a Dockerfile From b5bea87cecf2a7435e03f91595b73b98d45f0c40 Mon Sep 17 00:00:00 2001 From: Chuck Lantz Date: Fri, 16 Dec 2022 13:30:03 -0800 Subject: [PATCH 015/312] Add # --- _posts/2022-12-16-dockerfile.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/_posts/2022-12-16-dockerfile.md b/_posts/2022-12-16-dockerfile.md index ecdb6b28..556abe6f 100644 --- a/_posts/2022-12-16-dockerfile.md +++ b/_posts/2022-12-16-dockerfile.md @@ -7,7 +7,7 @@ authorUrl: https://github.com/chuxel When creating a development container, you have a variety of different ways to customize your environment like ["Features"](/features) or [lifecycle scripts](/implementors/json_reference/#lifecycle-scripts). However, if you are familiar with containers, you may want to use a [Dockerfile](/guide/dockerfile#dockerfile) or [Docker Compose / Compose](/guide/dockerfile#docker-compose) to customize your environment. This article will walk through how to use these formats with the Dev Container spec. -## Using a Dockerfile +## Using a Dockerfile To keep things simple, many [Dev Container Templates](/templates) use container image references. @@ -40,17 +40,17 @@ Next, remove the `image` property from `devcontainer.json` (if it exists) and ad That's it! When you start up your Dev Container, the Dockerfile will be automatically built with no additional work. See [Dockerfile scenario reference](implementors/json_reference/#image-specific) for more information on other related devcontainer.json properties. -### Iterating on an image that includes Dev Container metadata +### Iterating on an image that includes Dev Container metadata Better yet, you can can use a Dockerfile as a part of authoring an image you can share with others. You can even **add Dev Container settings and metadata right into the image itself**. This avoids having to duplicate config and settings in multiple devcontainer.json files and keeps them in sync with your images! See the reference on **[pre-building](/implementors/reference/#prebuilding)** to learn more! -## Using Docker Compose +## Using Docker Compose [Docker Compose](https://docs.docker.com/compose/) is a great way to define a multi-container development environment. Rather than adding things like databases or redis to your Dockerfile, you can reference existing images for these services and focus your Dev Container's content on tools and utilities you need for development. -### Using an image with Docker Compose +### Using an image with Docker Compose As mentioned in the Dockerfile section, to keep things simple, many [Dev Container Templates](/templates) use container image references. @@ -108,7 +108,7 @@ In this example: That's it! -### Using a Dockerfile with Docker Compose +### Using a Dockerfile with Docker Compose You can also combine these scenarios and use Dockerfile with Docker Compose. This time we'll update `docker-compose.yml` to reference the Dockerfile by replacing `image` with a similar `build` section: From 24d9f6f98483a3a0c2e7d18b880b708acb101f98 Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Mon, 19 Dec 2022 12:20:10 -0500 Subject: [PATCH 016/312] installAfter -> installsAfter typo (#109) --- _implementors/features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_implementors/features.md b/_implementors/features.md index 199b8a3d..b32179a1 100644 --- a/_implementors/features.md +++ b/_implementors/features.md @@ -365,7 +365,7 @@ Optimize? true There are several things to keep in mind for an application that implements Features: -- The order of execution of Features is determined by the application, based on the `installAfter` property used by Feature authors. It can be overridden by users if necessary with the `overrideFeatureInstallOrder` in `devcontainer.json`. +- The order of execution of Features is determined by the application, based on the `installsAfter` property used by Feature authors. It can be overridden by users if necessary with the `overrideFeatureInstallOrder` in `devcontainer.json`. - Features are used to create an image that can be used to create a container or not. - Parameters like `privileged`, `init` are included if just 1 feature requires them. - Parameters like `capAdd`, `securityOp` are concatenated. From e4f84990552c392dc64b8672c912e63fd7205b6a Mon Sep 17 00:00:00 2001 From: Robert Syme Date: Tue, 20 Dec 2022 20:33:16 -0500 Subject: [PATCH 017/312] Update collection-index.yml (#110) Add robsyme/features to collections --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index eaba313d..169cbeb8 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -188,3 +188,8 @@ contact: https://github.com/lentzi90/features/issues repository: https://github.com/lentzi90/features ociReference: ghcr.io/lentzi90/features +- name: Nextflow devcontainer features + maintainer: Rob Syme + contact: https://github.com/robsyme/features/issues + repository: https://github.com/robsyme/features + ociReference: ghcr.io/robsyme/features From 1ad2625280b8c33d87d40f41f6b385fb1334941a Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Thu, 22 Dec 2022 16:09:22 -0800 Subject: [PATCH 018/312] Add dev-wasm feature information. (#112) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 169cbeb8..380f65ad 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -193,3 +193,8 @@ contact: https://github.com/robsyme/features/issues repository: https://github.com/robsyme/features ociReference: ghcr.io/robsyme/features +- name: Wasmtime + WASI Web Assembly features + contact: https://github.com/dev-wasm/dev-wasm-feature/issues + repository: https://github.com/dev-wasm/dev-wasm-feature + maintainer: Brendan Burns + ociReference: devwasm.azurecr.io/dev-wasm/dev-wasm-feature From 6ca831626066595e5d82701de66121690d39f09d Mon Sep 17 00:00:00 2001 From: shinepukur <119420007+shinepukur@users.noreply.github.com> Date: Tue, 27 Dec 2022 17:49:04 +0100 Subject: [PATCH 019/312] Update collection-index.yml (#113) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 380f65ad..541fe499 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -198,3 +198,8 @@ repository: https://github.com/dev-wasm/dev-wasm-feature maintainer: Brendan Burns ociReference: devwasm.azurecr.io/dev-wasm/dev-wasm-feature +- name: shinepukur devcontainer features + maintainer: Shine Pukur + contact: https://github.com/shinepukur/devcontainer-features/issues + repository: https://github.com/shinepukur/devcontainer-features + ociReference: ghcr.io/shinepukur/devcontainer-features From 72c85234ff7bc6e426dca861e3ecfa66a85459ea Mon Sep 17 00:00:00 2001 From: Msclock <43399351+msclock@users.noreply.github.com> Date: Thu, 29 Dec 2022 05:14:55 +0800 Subject: [PATCH 020/312] Update collection-index.yml (#116) --- _data/collection-index.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 541fe499..6c0dd87f 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -203,3 +203,9 @@ contact: https://github.com/shinepukur/devcontainer-features/issues repository: https://github.com/shinepukur/devcontainer-features ociReference: ghcr.io/shinepukur/devcontainer-features +- name: msclock devcontainer features + maintainer: msclock + contact: https://github.com/msclock/features/issues + repository: https://github.com/msclock/features + ociReference: ghcr.io/msclock/features + From a6d8f01139b3187ad9589d06e40636d003458c8a Mon Sep 17 00:00:00 2001 From: Grant G Date: Wed, 28 Dec 2022 19:45:05 -0500 Subject: [PATCH 021/312] Add Fig features (#117) * feat: add withfig/features * Update collection-index.yml --- _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 6c0dd87f..787cc977 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -208,4 +208,8 @@ contact: https://github.com/msclock/features/issues repository: https://github.com/msclock/features ociReference: ghcr.io/msclock/features - +- name: Fig Dev Container Features + maintainer: grant0417 + contact: https://github.com/withfig/features/issues + repository: https://github.com/withfig/features + ociReference: ghcr.io/withfig/features From 4b319456f6a020fb73e774d4a77b6f84bc9391c8 Mon Sep 17 00:00:00 2001 From: eitsupi <50911393+eitsupi@users.noreply.github.com> Date: Wed, 4 Jan 2023 05:06:50 +0900 Subject: [PATCH 022/312] Add mamba-org/devcontainer-features to the index (#118) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 787cc977..22da1078 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -213,3 +213,8 @@ contact: https://github.com/withfig/features/issues repository: https://github.com/withfig/features ociReference: ghcr.io/withfig/features +- name: Mamba Features + maintainer: mamba-org + contact: https://github.com/mamba-org/devcontainer-features/issues + repository: https://github.com/mamba-org/devcontainer-features + ociReference: ghcr.io/mamba-org/devcontainer-features From 2777bfabd043900e02e08ddab366c71507f75d7b Mon Sep 17 00:00:00 2001 From: Samruddhi Khandale Date: Tue, 3 Jan 2023 13:29:20 -0800 Subject: [PATCH 023/312] Features - Document 'deprecated' (#115) --- _implementors/features.md | 1 + 1 file changed, 1 insertion(+) diff --git a/_implementors/features.md b/_implementors/features.md index b32179a1..630d6523 100644 --- a/_implementors/features.md +++ b/_implementors/features.md @@ -51,6 +51,7 @@ The properties of the file are as follows: | `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 that should execute before this one. Allows control for feature authors on soft dependencies between different Features. | +| `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. | {: .table .table-bordered .table-responsive} ### The `options` property From 0eae45df8adb3fe7990fe8076944c03edeb2bc11 Mon Sep 17 00:00:00 2001 From: Samruddhi Khandale Date: Tue, 3 Jan 2023 14:28:46 -0800 Subject: [PATCH 024/312] Features - Document 'legacyIds' (#114) * GH Pages - Document 'legacyIds' * nit --- _implementors/features.md | 41 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/_implementors/features.md b/_implementors/features.md index 630d6523..167d2d79 100644 --- a/_implementors/features.md +++ b/_implementors/features.md @@ -51,6 +51,7 @@ The properties of the file are as follows: | `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 that should execute before this one. Allows control for feature authors on soft dependencies between different Features. | +| `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. | {: .table .table-bordered .table-responsive} @@ -362,6 +363,46 @@ Pip? false Optimize? true ``` +### Steps to rename a Feature + +1. Update the Feature [source code](./features-distribution.md#source-code) folder and the `id` property in the [devcontainer-feature.json properties](#devcontainer-featurejson-properties) to reflect the new `id`. Other properties (`name`, `documentationUrl`, etc.) can optionally be updated during this step. +2. Add or update the `legacyIds` property to the Feature, including the previously used `id`. +3. Bump the semantic version of the Feature. +4. Rerun the `devcontainer features publish` command, or equivalent tool that implements the [Features distribution specification](./features-distribution.md#distribution). + +#### Example: Renaming a Feature + +Let's say we currently have a `docker-from-docker` Feature 👇 + +Current `devcontainer-feature.json` : + +```jsonc +{ + "id": "docker-from-docker", + "version": "2.0.1", + "name": "Docker (Docker-from-Docker)", + "documentationURL": "https://github.com/devcontainers/features/tree/main/src/docker-from-docker", + .... +} +``` + +We'd want to rename this Feature to `docker-outside-of-docker`. The source code folder of the Feature will be updated to `docker-outside-of-docker` and the updated `devcontainer-feature.json` will look like 👇 + +```jsonc +{ + "id": "docker-outside-of-docker", + "version": "2.0.2", + "name": "Docker (Docker-outside-of-Docker)", + "documentationURL": "https://github.com/devcontainers/features/tree/main/src/docker-outside-of-docker", + "legacyIds": [ + "docker-from-docker" + ] + .... +} +``` + +**Note** - The semantic version of the Feature defined by the `version` property should be **continued** and should not be restarted at `1.0.0`. + ### Implementation notes There are several things to keep in mind for an application that implements Features: From a9c66f81f3249746d6d206908b52b6d34f2226a7 Mon Sep 17 00:00:00 2001 From: Samruddhi Khandale Date: Wed, 4 Jan 2023 14:26:11 -0800 Subject: [PATCH 025/312] Features list : Omit listing deprecated Features (#120) --- Gemfile.lock | 4 ++-- features.html | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4d917c7d..f05bd56a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -225,7 +225,7 @@ DEPENDENCIES tzinfo-data RUBY VERSION - ruby 2.7.6p219 + ruby 2.7.7p221 BUNDLED WITH - 2.3.24 + 2.3.26 diff --git a/features.html b/features.html index 9ade82e0..88f45683 100644 --- a/features.html +++ b/features.html @@ -25,12 +25,14 @@

Available Dev Container Featur {% for c in site.data.devcontainer-index.collections %} {% for f in c.features %} - - {{ f.name | strip_html }} - {{ c.sourceInformation.maintainer | strip_html }} - {{ f.id | strip_html }}:{{ f.majorVersion | strip_html }} - {{ f.version | strip_html }} - + {% 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 From 80c6f9caf71742f60e0c2f33f0d157ccd20571b9 Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Wed, 4 Jan 2023 14:37:10 -0800 Subject: [PATCH 026/312] Update reference.md (#121) --- _implementors/reference.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_implementors/reference.md b/_implementors/reference.md index 0544432a..ef6a8250 100644 --- a/_implementors/reference.md +++ b/_implementors/reference.md @@ -39,6 +39,8 @@ Commands: devcontainer build [path] Build a dev container image devcontainer run-user-commands Run user commands devcontainer read-configuration Read configuration + devcontainer features Features commands + devcontainer templates Templates commands devcontainer exec [args..] Execute a command on a running dev container Options: From c65070b852a6b34ffbe54436961a4b0043ddf1ed Mon Sep 17 00:00:00 2001 From: Chuck Lantz Date: Thu, 5 Jan 2023 16:33:38 -0800 Subject: [PATCH 027/312] Fix/add links, refresh image metadata description (#122) --- _implementors/json_reference.md | 2 +- _implementors/reference.md | 29 ++++++++++++++++++----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/_implementors/json_reference.md b/_implementors/json_reference.md index 7cb3e2cb..9a1ba8df 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -8,7 +8,7 @@ index: 4 The `devcontainer.json` file contains any needed metadata and settings required to configurate a **development container** for a given well-defined tool and runtime stack. It can be used by [tools and services that support the dev container spec](../../supporting) to create a **development environment** that contains one or more **development containers**. -Metadata properties marked with a 🏷️️ can be stored in the `devcontainer.metadata` **container image label** in addition to `devcontainer.json`. This label can contain an array of json snippets that will be automatically merged with `devcontainer.json` contents (if any) when a container is created. +Metadata properties marked with a 🏷️️ can be stored in the `devcontainer.metadata` **[container image label](/implementors/reference/#labels)** in addition to `devcontainer.json`. This label can contain an array of json snippets that will be automatically merged with `devcontainer.json` contents (if any) when a container is created. ## General devcontainer.json properties diff --git a/_implementors/reference.md b/_implementors/reference.md index ef6a8250..b37fd9a7 100644 --- a/_implementors/reference.md +++ b/_implementors/reference.md @@ -104,22 +104,19 @@ These steps are also provided in the CLI repo's [README](https://github.com/devc ### Prebuilding We recommend pre-building images with the tools you need rather than creating and building a container image each time you open your project in a dev container. Using pre-built images will result in a faster container startup, simpler configuration, and allows you to pin to a specific version of tools to improve supply-chain security and avoid potential breaks. You can automate pre-building your image by scheduling the build using a DevOps or continuous integration (CI) service like GitHub Actions. -We recommend using the dev container CLI to pre-build your images. Once you've built your image, you can push it to a container registry (like the [Azure Container Registry](https://learn.microsoft.com/azure/container-registry/container-registry-get-started-docker-cli?tabs=azure-cli), [GitHub Container Registry](https://docs.github.com/packages/working-with-a-github-packages-registry/working-with-the-container-registry#pushing-container-images), or [Docker Hub](https://docs.docker.com/engine/reference/commandline/push)) and reference it directly. +We recommend 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)) to pre-build your images. Once you've built your image, you can push it to a container registry (like the [Azure Container Registry](https://learn.microsoft.com/azure/container-registry/container-registry-get-started-docker-cli?tabs=azure-cli), [GitHub Container Registry](https://docs.github.com/packages/working-with-a-github-packages-registry/working-with-the-container-registry#pushing-container-images), or [Docker Hub](https://docs.docker.com/engine/reference/commandline/push)) and reference it directly. -#### 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/), such that, the image and the built-in Features can be used with a devcontainer.json (image-, Dockerfile- or Docker Compose-based) that does not repeat the dev container config or Feature metadata. Other tools should be able to record the same metadata without necessarily using Features themselves. - -The metadata label is **automatically added** when you pre-build using the Dev Container CLI (or most Dev Container spec supporting tools) and includes settings from devcontainer.json and any referenced Dev Container Features. +```bash +devcontainer build --workspace-folder . --push true --image-name : +``` -However, if you are using something else to build your images, you can opt to manually add properties to an image label instead. For example, consider this Dockerfile snippet: +#### Metadata in image labels -```Dockerfile -LABEL devcontainer.metadata='[{ "capAdd": [ "SYS_PTRACE" ], "remoteUser": "devcontainer", "postCreateCommand": "yarn install" }]' +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. -In either case, the result will be merged with any local devcontainer.json content at the time you create the container (see the [the spec](https://github.com/devcontainers/spec/blob/main/proposals/image-metadata.md) 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 { @@ -127,4 +124,14 @@ In either case, the result will be merged with any local devcontainer.json conte } ``` +Note that you can also opt to you can opt to manually add metadata to an image label instead. These proprerties will be picked up even if you didn't use the Dev Container CLI to build (and can be updated by the CLI even if you do). For example, consider this Dockerfile snippet: + +```Dockerfile +LABEL devcontainer.metadata='[{ \ + "capAdd": [ "SYS_PTRACE" ], \ + "remoteUser": "devcontainer", \ + "postCreateCommand": "yarn install" \ +}]' +``` + See [Dev Container metadata reference](../json_reference) for information on which properties are supported. From 59078935e38cbba615b7388847b557d6d7f23894 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oleksis=20Fraga=20Men=C3=A9ndez?= <44526468+oleksis@users.noreply.github.com> Date: Fri, 6 Jan 2023 12:35:58 -0500 Subject: [PATCH 028/312] Update Oleksis' Collection Dev Container Features (#123) --- _data/collection-index.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 22da1078..cb738f5f 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -158,11 +158,11 @@ contact: https://github.com/jsburckhardt/devcontainer-features/issues repository: https://github.com/jsburckhardt/devcontainer-features ociReference: ghcr.io/jsburckhardt/devcontainer-features -- name: NAPPTIVE Playground CLI Features +- name: Oleksis' Dev Container Features maintainer: oleksis - contact: https://github.com/oleksis/playground-cli/issues - repository: https://github.com/oleksis/playground-cli - ociReference: ghcr.io/oleksis/playground-cli + contact: https://github.com/oleksis/devcontainer-features/issues + repository: https://github.com/oleksis/devcontainer-features + ociReference: ghcr.io/oleksis/devcontainer-features - name: Psibase templates maintainer: James-Mart contact: https://github.com/gofractally/psibase-devcontainer-template/issues From 64764e1259a88aa112c570bc44515b6d4c24c6b7 Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Fri, 6 Jan 2023 09:53:16 -0800 Subject: [PATCH 029/312] Typo (#125) --- _implementors/reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_implementors/reference.md b/_implementors/reference.md index b37fd9a7..791b9e19 100644 --- a/_implementors/reference.md +++ b/_implementors/reference.md @@ -124,7 +124,7 @@ This allows you to have a separate **more complex** devcontainer.json you use to } ``` -Note that you can also opt to you can opt to manually add metadata to an image label instead. These proprerties will be picked up even if you didn't use the Dev Container CLI to build (and can be updated by the CLI even if you do). For example, consider this Dockerfile snippet: +Note that you can also opt to you can opt to manually add metadata to an image label instead. These properties will be picked up even if you didn't use the Dev Container CLI to build (and can be updated by the CLI even if you do). For example, consider this Dockerfile snippet: ```Dockerfile LABEL devcontainer.metadata='[{ \ From eab6ffb669887d74141116676b59898bdb3d007d Mon Sep 17 00:00:00 2001 From: Faisal Date: Fri, 6 Jan 2023 12:34:43 -0600 Subject: [PATCH 030/312] Add devcontainer feature for Astronomer (#126) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index cb738f5f..8945d55c 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -218,3 +218,8 @@ contact: https://github.com/mamba-org/devcontainer-features/issues repository: https://github.com/mamba-org/devcontainer-features ociReference: ghcr.io/mamba-org/devcontainer-features +- name: Astronomer Features + maintainer: fhoda + contact: https://github.com/astronomer/devcontainer-features/issues + repository: https://github.com/astronomer/devcontainer-features + ociReference: ghcr.io/astronomer/devcontainer-features From f41cb0034852b6be104fce317365a083e67b780d Mon Sep 17 00:00:00 2001 From: Maya Kaczorowski <15946341+mayakacz@users.noreply.github.com> Date: Fri, 6 Jan 2023 11:44:31 -0800 Subject: [PATCH 031/312] Add Tailscale devcontainer feature (#119) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 8945d55c..b87f08b4 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -223,3 +223,8 @@ contact: https://github.com/astronomer/devcontainer-features/issues repository: https://github.com/astronomer/devcontainer-features ociReference: ghcr.io/astronomer/devcontainer-features +- name: Tailscale devcontainer features + maintainer: DentonGentry + contact: https://github.com/tailscale/codespace/issues + repository: https://github.com/tailscale/codespace + ociReference: ghcr.io/tailscale/codespace/tailscale From 2140f55dff5c349d69336ba6abebe11f04bf8ca0 Mon Sep 17 00:00:00 2001 From: Samruddhi Khandale Date: Fri, 6 Jan 2023 13:01:59 -0800 Subject: [PATCH 032/312] Revert "Add Tailscale devcontainer feature (#119)" (#127) This reverts commit f41cb0034852b6be104fce317365a083e67b780d. --- _data/collection-index.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index b87f08b4..8945d55c 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -223,8 +223,3 @@ contact: https://github.com/astronomer/devcontainer-features/issues repository: https://github.com/astronomer/devcontainer-features ociReference: ghcr.io/astronomer/devcontainer-features -- name: Tailscale devcontainer features - maintainer: DentonGentry - contact: https://github.com/tailscale/codespace/issues - repository: https://github.com/tailscale/codespace - ociReference: ghcr.io/tailscale/codespace/tailscale From 150fc61d1fbb6cbddfd163c3c6e4b06eb8a589ad Mon Sep 17 00:00:00 2001 From: Matthieu FRONTON Date: Mon, 9 Jan 2023 18:11:10 +0100 Subject: [PATCH 033/312] Fix broken link (#128) Relative link leads to 404 error page : https://containers.dev/guide/implementors/json_reference/#image-specific Absolute link is correct : https://containers.dev/implementors/json_reference/#image-specific --- _posts/2022-12-16-dockerfile.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2022-12-16-dockerfile.md b/_posts/2022-12-16-dockerfile.md index 556abe6f..687f13d5 100644 --- a/_posts/2022-12-16-dockerfile.md +++ b/_posts/2022-12-16-dockerfile.md @@ -38,7 +38,7 @@ Next, remove the `image` property from `devcontainer.json` (if it exists) and ad } ``` -That's it! When you start up your Dev Container, the Dockerfile will be automatically built with no additional work. See [Dockerfile scenario reference](implementors/json_reference/#image-specific) for more information on other related devcontainer.json properties. +That's it! When you start up your Dev Container, the Dockerfile will be automatically built with no additional work. See [Dockerfile scenario reference](/implementors/json_reference/#image-specific) for more information on other related devcontainer.json properties. ### Iterating on an image that includes Dev Container metadata From a01196b187b9c92991a6d8c4c8b3d4c0b595fe1b Mon Sep 17 00:00:00 2001 From: Matthieu FRONTON Date: Mon, 9 Jan 2023 18:13:14 +0100 Subject: [PATCH 034/312] Update collection-index.yml (#129) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 8945d55c..867b96dd 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -223,3 +223,8 @@ contact: https://github.com/astronomer/devcontainer-features/issues repository: https://github.com/astronomer/devcontainer-features ociReference: ghcr.io/astronomer/devcontainer-features +- name: Testing Automation Features & more + maintainer: Matthieu Fronton + contact: https://github.com/frntn/devcontainers-features/issues + repository: https://github.com/frntn/devcontainers-features + ociReference: ghcr.io/frntn/devcontainers-features From 559f0b0bcf5bbe5ff79733bc3134121cb267cc51 Mon Sep 17 00:00:00 2001 From: Eliise Date: Mon, 9 Jan 2023 18:42:44 +0100 Subject: [PATCH 035/312] Add EliiseS/devcontainer features to the list (#124) * Add EliiseS devcontainer features * Use lower case 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 867b96dd..79cd4baf 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -223,6 +223,11 @@ contact: https://github.com/astronomer/devcontainer-features/issues repository: https://github.com/astronomer/devcontainer-features ociReference: ghcr.io/astronomer/devcontainer-features +- name: Devcontainer features by @EliiseS + maintainer: EliiseS + contact: https://github.com/EliiseS/devcontainer-features/issues + repository: https://github.com/EliiseS/devcontainer-features + ociReference: ghcr.io/eliises/devcontainer-features - name: Testing Automation Features & more maintainer: Matthieu Fronton contact: https://github.com/frntn/devcontainers-features/issues From e89095db4021989c00963e723c34f3982f4cdea0 Mon Sep 17 00:00:00 2001 From: Christian Sutter Date: Tue, 10 Jan 2023 17:26:37 +0000 Subject: [PATCH 036/312] Add csutter's lightweight templates (#130) - Adds `csutter/lightweight-devcontainer-templates` to the collection of available devcontainer templates --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 79cd4baf..4e196dc0 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -233,3 +233,8 @@ contact: https://github.com/frntn/devcontainers-features/issues repository: https://github.com/frntn/devcontainers-features ociReference: ghcr.io/frntn/devcontainers-features +- name: csutter's devcontainer templates + maintainer: csutter + contact: https://github.com/csutter/devcontainer-templates/issues + repository: https://github.com/csutter/devcontainer-templates + ociReference: ghcr.io/csutter/devcontainer-templates From 3700b105dd8eb67ac89c02f6062ebfad0516f3fa Mon Sep 17 00:00:00 2001 From: Christopher MacGown Date: Thu, 12 Jan 2023 09:04:53 -0800 Subject: [PATCH 037/312] Add ChristopherMacGown/devcontainer-features to the collection index. (#131) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 4e196dc0..9f507cf6 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -238,3 +238,8 @@ contact: https://github.com/csutter/devcontainer-templates/issues repository: https://github.com/csutter/devcontainer-templates ociReference: ghcr.io/csutter/devcontainer-templates +- name: Convenient features + maintainer: ChristopherMacGown + contact: https://github.com/ChristopherMacGown/devcontainer-features/issues + repository: https://github.com/ChristopherMacGown/devcontainer-features + ociReference: ghcr.io/christophermacgown/devcontainer-features From 108492c98c303bca1e0d4e9fa4ae491f242963fb Mon Sep 17 00:00:00 2001 From: Samruddhi Khandale Date: Tue, 17 Jan 2023 09:34:27 -0800 Subject: [PATCH 038/312] Features spec - Document 'mounts' property (#134) * Features spec - Document 'mounts' property * remove string support * Update features.md * Update features.md --- _implementors/features.md | 1 + 1 file changed, 1 insertion(+) diff --git a/_implementors/features.md b/_implementors/features.md index 167d2d79..b33120a8 100644 --- a/_implementors/features.md +++ b/_implementors/features.md @@ -53,6 +53,7 @@ The properties of the file are as follows: | `installsAfter` | array | Array of ID's of Features that should execute before this one. Allows control for feature authors on soft dependencies between different Features. | | `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/#add-bind-mounts-or-volumes-using-the---mount-flag). The Pre-defined [devcontainerId](/_implementors/json_reference.md#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 `options` property From 9050980287d77829d9a66a19bee6d16d744c5603 Mon Sep 17 00:00:00 2001 From: Samruddhi Khandale Date: Tue, 17 Jan 2023 09:35:05 -0800 Subject: [PATCH 039/312] Update devcontainer.json schema - Adds 'overrideFeatureInstallOrder' (#133) --- _implementors/json_schema.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/_implementors/json_schema.md b/_implementors/json_schema.md index 9e83ed6a..05b2ce65 100644 --- a/_implementors/json_schema.md +++ b/_implementors/json_schema.md @@ -31,6 +31,13 @@ You may review the current devcontainer.json schemas in the spec repo, which inc "description": "Features to add to the dev container.", "additionalProperties": true }, + "overrideFeatureInstallOrder": { + "type": "array", + "description": "Array consisting of the Feature id (without the semantic version) of Features in the order the user wants them to be installed.", + "items": { + "type": "string" + } + }, "forwardPorts": { "type": "array", "description": "Ports that are forwarded from the container to the local machine. Can be an integer port number, or a string of the format \"host:port_number\".", From 76c7fdf322e48e42ae1336a418f4aed3799c8acd Mon Sep 17 00:00:00 2001 From: Samruddhi Khandale Date: Tue, 17 Jan 2023 09:35:13 -0800 Subject: [PATCH 040/312] Copy over spec changes for `installsAfter` clarification (#132) --- _implementors/features.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/_implementors/features.md b/_implementors/features.md index b33120a8..4d2376d5 100644 --- a/_implementors/features.md +++ b/_implementors/features.md @@ -50,7 +50,7 @@ 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 that should execute before this one. Allows control for feature authors on soft dependencies between different Features. | +| `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. | | `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/#add-bind-mounts-or-volumes-using-the---mount-flag). The Pre-defined [devcontainerId](/_implementors/json_reference.md#variables-in-devcontainerjson) variable may be referenced in the value. For example:
`"mounts": [{ "source": "dind-var-lib-docker", "target": "/var/lib/docker", "type": "volume" }]` | @@ -252,7 +252,7 @@ If any of the following properties are provided in the Feature's `devcontainer-f This property is declared by the user in their `devcontainer.json` file. -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. +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 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 `:`). @@ -274,13 +274,15 @@ Example: #### (2) The `installsAfter` Feature property -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. +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. + +> 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. 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. | Property | Type | Description | | :--- | :--- | :--- | -| `installsAfter` | array | Array consisting of the Feature `id` that should be installed before the given Feature. | +| `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} ### Option Resolution From 95afbf0e42e4f50f19d5e7140cb6d0be318db36a Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Wed, 18 Jan 2023 14:54:32 -0800 Subject: [PATCH 041/312] Joshspicer/feature schema (#135) * Add link to spec of devcontainer-feature.json schema https://github.com/devcontainers/spec/issues/140 * capitalize Feature --- _implementors/features.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_implementors/features.md b/_implementors/features.md index 4d2376d5..de401903 100644 --- a/_implementors/features.md +++ b/_implementors/features.md @@ -29,7 +29,9 @@ A Feature is a self contained entity in a folder with at least a `devcontainer-f ## devcontainer-feature.json properties -the `devcontainer-feature.json` file defines information about the feature to be used by any supporting tools and the way the Feature will be executed. +The `devcontainer-feature.json` file defines information about the Feature to be used by any supporting tools and the way the Feature will be executed. + +[devContainerFeature.schema.json](https://github.com/devcontainers/spec/blob/main/schemas/devContainerFeature.schema.json) defines the schema for the `devcontainer-feature.json` file. The properties of the file are as follows: From f499f61712309041e9c2b4b676a47b2960ed16a4 Mon Sep 17 00:00:00 2001 From: Marcel Lupo Date: Thu, 19 Jan 2023 17:57:39 +0000 Subject: [PATCH 042/312] Update collection-index.yml - Add GitHub Actions runner devcontainer template (#137) * Update collection-index.yml Add GH-runner devcontainer template * Update collection-index.yml remove '.' * Update collection-index.yml Update maintainer name * Update _data/collection-index.yml Thank you, made to lowercase :) 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 9f507cf6..0d10a63e 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -243,3 +243,8 @@ contact: https://github.com/ChristopherMacGown/devcontainer-features/issues repository: https://github.com/ChristopherMacGown/devcontainer-features ociReference: ghcr.io/christophermacgown/devcontainer-features + - name: Pwd9000-ML devcontainer templates + maintainer: Marcel Lupo @Pwd9000-ML + contact: https://github.com/Pwd9000-ML/devcontainer-templates/issues + repository: https://github.com/Pwd9000-ML/devcontainer-templates + ociReference: ghcr.io/pwd9000-ml/devcontainer-templates From b1a6b14e48d3f55f593fb9e33a2c6c3759d17497 Mon Sep 17 00:00:00 2001 From: Samruddhi Khandale Date: Thu, 19 Jan 2023 10:15:21 -0800 Subject: [PATCH 043/312] Fix YAMLParseError for collection-inde.yml (#139) --- _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 0d10a63e..41884305 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -243,7 +243,7 @@ contact: https://github.com/ChristopherMacGown/devcontainer-features/issues repository: https://github.com/ChristopherMacGown/devcontainer-features ociReference: ghcr.io/christophermacgown/devcontainer-features - - name: Pwd9000-ML devcontainer templates +- name: Pwd9000-ML devcontainer templates maintainer: Marcel Lupo @Pwd9000-ML contact: https://github.com/Pwd9000-ML/devcontainer-templates/issues repository: https://github.com/Pwd9000-ML/devcontainer-templates From 028b1f155e5bdc8a99786542aef86603f47b8a77 Mon Sep 17 00:00:00 2001 From: Mikael Ahlinder Date: Mon, 23 Jan 2023 18:14:03 +0100 Subject: [PATCH 044/312] Add features for mickeahlinder (#141) Currently only contains a feature for installing the `tfenv` Terraform version manager. --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 41884305..9b72516c 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -248,3 +248,8 @@ contact: https://github.com/Pwd9000-ML/devcontainer-templates/issues repository: https://github.com/Pwd9000-ML/devcontainer-templates ociReference: ghcr.io/pwd9000-ml/devcontainer-templates +- name: mickeahlinder devcontainer features + maintainer: Mikael Ahlinder + contact: https://github.com/mickeahlinder/devcontainer-features/issues + repository: https://github.com/mickeahlinder/devcontainer-features + ociReference: ghcr.io/mickeahlinder/devcontainer-features \ No newline at end of file From 19155527a7851e11de4a9511790f24322e921920 Mon Sep 17 00:00:00 2001 From: Samruddhi Khandale Date: Tue, 24 Jan 2023 10:09:04 -0800 Subject: [PATCH 045/312] Update description of `build.cacheFrom` (#142) --- _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 9a1ba8df..370f1589 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -49,7 +49,7 @@ The focus of `devcontainer.json` is to describe how to enrich a container for th | `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/#set-build-time-variables---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.target` | string | A string that specifies a [Docker image build target](https://docs.docker.com/engine/reference/commandline/build/#specifying-target-build-stage---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`.
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. | +| `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. | | `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/#add-bind-mounts-or-volumes-using-the---mount-flag). 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. | From 971fa632a504f02d3bae78698072b09e28b7829d Mon Sep 17 00:00:00 2001 From: Balazs Nagy Date: Tue, 24 Jan 2023 19:10:45 +0100 Subject: [PATCH 046/312] Add Balazs's features to collection (#138) * Add Balazs's features to collection I've made two features (bezel, nx) what I was missing from the feature list * reference typo fix --- _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 9b72516c..22b36e6f 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -243,6 +243,11 @@ contact: https://github.com/ChristopherMacGown/devcontainer-features/issues repository: https://github.com/ChristopherMacGown/devcontainer-features ociReference: ghcr.io/christophermacgown/devcontainer-features +- name: Devcontainer features by @Balazs + maintainer: Balazs23 + contact: https://github.com/Balazs23/devcontainers-features/issues + repository: https://github.com/Balazs23/devcontainers-features + ociReference: ghcr.io/balazs23/devcontainers-features - name: Pwd9000-ML devcontainer templates maintainer: Marcel Lupo @Pwd9000-ML contact: https://github.com/Pwd9000-ML/devcontainer-templates/issues @@ -252,4 +257,4 @@ maintainer: Mikael Ahlinder contact: https://github.com/mickeahlinder/devcontainer-features/issues repository: https://github.com/mickeahlinder/devcontainer-features - ociReference: ghcr.io/mickeahlinder/devcontainer-features \ No newline at end of file + ociReference: ghcr.io/mickeahlinder/devcontainer-features From eb558d020e764fe6e86720359550083f0ef00611 Mon Sep 17 00:00:00 2001 From: James C Kimble Jr Date: Wed, 25 Jan 2023 11:48:03 -0600 Subject: [PATCH 047/312] Add jckimble to collection-index.yml (#143) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 22b36e6f..10f1d37e 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -258,3 +258,8 @@ contact: https://github.com/mickeahlinder/devcontainer-features/issues repository: https://github.com/mickeahlinder/devcontainer-features ociReference: ghcr.io/mickeahlinder/devcontainer-features +- name: jckimble Dev Container / Codespaces Features + maintainer: James C Kimble Jr + contact: https://github.com/jckimble/devcontainer-features/issues + repository: https://github.com/jckimble/devcontainer-features + ociReference: ghcr.io/jckimble/devcontainer-features From 233fd92d8e3a75b0bdcce3d252064e05f0087528 Mon Sep 17 00:00:00 2001 From: NicoVIII Date: Wed, 25 Jan 2023 19:16:43 +0100 Subject: [PATCH 048/312] Remove pnpm, it was moved to devcontainers-contrib (#144) Like discussed here, pnpm was moved into devcontainers-contrib: https://github.com/devcontainers-contrib/features/issues/265 The old repository can be removed from the index to avoid the duplicate listing of pnpm. The one in devcontainers-contrib should be used from now on. --- _data/collection-index.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 10f1d37e..664d0620 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -88,11 +88,6 @@ contact: https://github.com/joshspicer/features/issues repository: https://github.com/joshspicer/features ociReference: ghcr.io/joshspicer/features -- name: pnpm (requires npm) - maintainer: NicoVIII - contact: https://github.com/NicoVIII/devcontainer-features/issues - repository: https://github.com/NicoVIII/devcontainer-features - ociReference: ghcr.io/NicoVIII/devcontainer-features - name: PHP Features maintainer: Shyim contact: https://github.com/shyim/devcontainers-features/issues From 5d2586d45866787583f01225856827090546ea73 Mon Sep 17 00:00:00 2001 From: Torben Wetter Date: Wed, 25 Jan 2023 21:10:11 +0100 Subject: [PATCH 049/312] Add IU LaTeX Container Templates (#145) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 664d0620..19cdda28 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -258,3 +258,8 @@ contact: https://github.com/jckimble/devcontainer-features/issues repository: https://github.com/jckimble/devcontainer-features ociReference: ghcr.io/jckimble/devcontainer-features +- name: IU LaTeX Container Templates + maintainer: Torben Wetter + contact: https://github.com/TorbenWetter/iu-latex-container-templates/issues + repository: https://github.com/TorbenWetter/iu-latex-container-templates + ociReference: ghcr.io/torbenwetter/iu-latex-container-templates From aea245d0b7328f8297268ee816e1973018ec7a41 Mon Sep 17 00:00:00 2001 From: Samruddhi Khandale Date: Tue, 31 Jan 2023 11:36:44 -0800 Subject: [PATCH 050/312] Fix broken link to 'Locally Referenced Addendum' (#140) --- _implementors/features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_implementors/features.md b/_implementors/features.md index de401903..c1526c59 100644 --- a/_implementors/features.md +++ b/_implementors/features.md @@ -207,7 +207,7 @@ The `id` format specified dicates how a supporting tool will locate and download (*) OCI registry must implement the [OCI Artifact Distribution Specification](https://github.com/opencontainers/distribution-spec). Some implementors can be [found here](https://oras.land/implementors/). -(**) The provided path is always relative to the folder containing the `devcontainer.json`. Further requirements are outlined in the [Locally Referenced Addendum](devcontainer-features-distribution#Addendum:-Locally-Referenced). +(**) The provided path is always relative to the folder containing the `devcontainer.json`. Further requirements are outlined in the [Locally Referenced Addendum](../features-distribution#addendum-locally-referenced). ## Versioning From 013fc6c99af9895a49c1b5a65892f373ba333bde Mon Sep 17 00:00:00 2001 From: Israel <70794050+Standard-IO@users.noreply.github.com> Date: Mon, 6 Feb 2023 17:01:03 -0600 Subject: [PATCH 051/312] entry added to index (#146) * entry added to index * Update _data/collection-index.yml Co-authored-by: Samruddhi Khandale --------- Co-authored-by: standardio 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 19cdda28..0c9736d8 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -263,3 +263,8 @@ contact: https://github.com/TorbenWetter/iu-latex-container-templates/issues repository: https://github.com/TorbenWetter/iu-latex-container-templates ociReference: ghcr.io/torbenwetter/iu-latex-container-templates +- name: Python3 with Pyenv and Poetry + maintainer: Israel Rescalvo + contact: https://github.com/Standard-IO/devcontainers-templates/issues + repository: https://github.com/Standard-IO/devcontainers-templates + ociReference: ghcr.io/standard-io/devcontainers-templates From a563c767bc262b03fadc00c8c61cee6cd09c5b10 Mon Sep 17 00:00:00 2001 From: Kenji Brameld Date: Thu, 9 Feb 2023 13:54:24 -0600 Subject: [PATCH 052/312] Add index for ROS (#147) * Add index for ROS * Update collection-index.yml --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 0c9736d8..87c88194 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -268,3 +268,8 @@ contact: https://github.com/Standard-IO/devcontainers-templates/issues repository: https://github.com/Standard-IO/devcontainers-templates ociReference: ghcr.io/standard-io/devcontainers-templates +- name: ROS Templates + maintainer: Kenji Brameld + contact: https://github.com/ijnek/ros-devcontainer-template/issues + repository: https://github.com/ijnek/ros-devcontainer-template + ociReference: ghcr.io/ijnek/ros-devcontainer-template From 26b496be68146ae0aaf1a7bba5f3c6f542752310 Mon Sep 17 00:00:00 2001 From: Naresh Sikha <3207964+r3dpoint@users.noreply.github.com> Date: Thu, 9 Feb 2023 13:02:06 -0800 Subject: [PATCH 053/312] Tailwindcss Standalone CLI (#148) * Tailwindcss Standalone CLI Adding non-official Tailwindcss Standalone CLI devcontainer feature to the registry. * 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 87c88194..a51eba56 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -273,3 +273,8 @@ 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: Assorted Features + maintainer: r3dpoint + contact: https://github.com/r3dpoint/devcontainer-features/issues + repository: https://github.com/r3dpoint/devcontainer-features + ociReference: ghcr.io/r3dpoint/devcontainer-features \ No newline at end of file From a43650b73e270484c1770ef5b90542c7e84b3b53 Mon Sep 17 00:00:00 2001 From: Adam Fowler Date: Mon, 13 Feb 2023 18:48:12 +0100 Subject: [PATCH 054/312] Add Swift devcontainer template (#150) --- _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 a51eba56..eee399ca 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -277,4 +277,9 @@ maintainer: r3dpoint contact: https://github.com/r3dpoint/devcontainer-features/issues repository: https://github.com/r3dpoint/devcontainer-features - ociReference: ghcr.io/r3dpoint/devcontainer-features \ No newline at end of file + ociReference: ghcr.io/r3dpoint/devcontainer-features +- name: Swift Container Templates + maintainer: Swift Server Workgroup + 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 \ No newline at end of file From b0567c2c41b8cfad4f0f89c22dfe03d653d583be Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Tue, 14 Feb 2023 22:21:23 +0000 Subject: [PATCH 055/312] Update templates-distribution.md (#152) --- _implementors/templates-distribution.md | 68 +++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/_implementors/templates-distribution.md b/_implementors/templates-distribution.md index b80e0a08..81b65242 100644 --- a/_implementors/templates-distribution.md +++ b/_implementors/templates-distribution.md @@ -64,16 +64,13 @@ Tooling that handles publishing Templates will not republish Templates if that e ## Packaging - Templates are distributed as tarballs. The tarball contains the entire contents of the Template sub-directory, including the `devcontainer-template.json`, `.devcontainer.json` (or `.devcontainer/devcontainer.json`), and any other files in the directory. 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). - -
-### devcontainer-collection.json +### devcontainer-collection.json The `devcontainer-collection.json` is an auto-generated metadata file. @@ -133,4 +130,65 @@ NAMESPACE=devcontainers/templates oras push ${REGISTRY}/${NAMESPACE}:latest \ --manifest-config /dev/null:application/vnd.devcontainers \ ./devcontainer-collection.json:application/vnd.devcontainers.collection.layer.v1+json -``` \ No newline at end of file +``` + +## 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/)). + +To see all the available options, run `devcontainers templates publish --help`. + +## Example + +Given a directory that is organized according to the [Templates distribution specification](https://containers.dev/implementors/templates-distribution/) - for example: + +``` +├── src +│ ├── color +│ │ ├── devcontainer-template.json +│ │ └──| .devcontainer +│ │ └── devcontainer.json +│ ├── hello +│ │ ├── devcontainer-template.json +│ │ └──| .devcontainer +│ │ ├── devcontainer.json +│ │ └── Dockerfile +| ├── ... +│ │ ├── devcontainer-template.json +│ │ └──| .devcontainer +│ │ └── devcontainer.json +├── test +│ ├── color +│ │ └── test.sh +│ ├── hello +│ │ └── test.sh +│ └──test-utils +│ └── test-utils.sh +... +``` + +The following command will publish each Template above (`color,hello`) to the registry `ghcr.io` with the following namespace (prefix) `devcontainers/templates`. + +``` +[/tmp]$ GITHUB_TOKEN="$CR_PAT" devcontainer templates publish -r ghcr.io -n devcontainers/templates ./src +``` + +To later apply a published Template (in the example below, the `color` template) with the CLI, the following `apply` command would be used: + +``` +[/tmp]$ devcontainer templates apply \ + -t 'ghcr.io/devcontainers/templates/color' \ + -a '{"favorite": "red"}' +``` + +### Authentication Methods + +> NOTE: OS-specific docker credential helpers (Docker Desktop credential helper) are not currently recognized by the CLI. +- Adding a $HOME/.docker/config.json with your credentials following [this commonly defined format](https://www.systutorials.com/docs/linux/man/5-docker-config-json/). + - Your `docker login` command may write this file for you depending on your operating system. +- Using our custom env variable DEVCONTAINERS_OCI_AUTH + - eg: `DEVCONTAINERS_OCI_AUTH=service1|user1|token1,service2|user2|token2` + +For publishing to `ghcr.io` +- Using the `devcontainers/action` GitHub action to handle the `GITHUB_TOKEN` credential for you. +- Providing a GITHUB_TOKEN with permission to `write:packages`. From b8e8c84c7719548718f5ae6bf8b5f876c60b1db1 Mon Sep 17 00:00:00 2001 From: Hamish Cox <20359560+HamishWHC@users.noreply.github.com> Date: Thu, 16 Feb 2023 04:15:42 +1100 Subject: [PATCH 056/312] Add UNSW COMP3231 OS Development Template (#153) * Update collection-index.yml * 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 eee399ca..85d797e9 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -282,4 +282,9 @@ maintainer: Swift Server Workgroup 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 \ No newline at end of file + ociReference: ghcr.io/swift-server/swift-devcontainer-template +- name: UNSW cs3231 OS Development + maintainer: Hamish Cox + contact: https://github.com/HamishWHC/cs3231-devcontainer/issues + repository: https://github.com/HamishWHC/cs3231-devcontainer + ociReference: ghcr.io/hamishwhc/cs3231-devcontainer From c335352e8d60d84978141db6e2ccd7000b963a1f Mon Sep 17 00:00:00 2001 From: Akhil Date: Thu, 16 Feb 2023 22:36:05 +0530 Subject: [PATCH 057/312] Patch 1 (#154) * Android SDK Tools and Apt packages * fix --- _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 85d797e9..057f5b5e 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -283,8 +283,13 @@ 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 repository: https://github.com/HamishWHC/cs3231-devcontainer - ociReference: ghcr.io/hamishwhc/cs3231-devcontainer + ociReference: ghcr.io/hamishwhc/cs3231-devcontainer \ No newline at end of file From 019129911c561110c76b2931ed27e3d63e3e2620 Mon Sep 17 00:00:00 2001 From: Samruddhi Khandale Date: Thu, 16 Feb 2023 09:28:07 -0800 Subject: [PATCH 058/312] Update collection-index (#155) --- _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 057f5b5e..f1bdda4d 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -284,7 +284,7 @@ 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 + maintainer: akhildevelops contact: https://github.com/akhildevelops/devcontainer-features/issues repository: https://github.com/akhildevelops/devcontainer-features ociReference: ghcr.io/akhildevelops/devcontainer-features From 099aea3f4f8b856c5ed56b0237c5d35815fe040e Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Fri, 17 Feb 2023 15:09:36 -0800 Subject: [PATCH 059/312] Cleanup pass (#156) * Update reference.md * Update spec.md * Update json_reference.md * Update templates.md * Update templates-distribution.md * Update contributing.md * Update features.md * Update features-distribution.md * Update features.md * Update features-distribution.md * Update templates.md * Update templates-distribution.md * Update supporting.md * Update features.md * Update features-distribution.md --- _implementors/contributing.md | 2 +- _implementors/features-distribution.md | 4 +- _implementors/features.md | 16 ++++---- _implementors/json_reference.md | 2 +- _implementors/reference.md | 4 +- _implementors/spec.md | 9 ++--- _implementors/templates-distribution.md | 5 ++- _implementors/templates.md | 50 +++++++++++++------------ supporting.md | 3 +- 9 files changed, 47 insertions(+), 48 deletions(-) diff --git a/_implementors/contributing.md b/_implementors/contributing.md index 66bd95cc..af94fa40 100644 --- a/_implementors/contributing.md +++ b/_implementors/contributing.md @@ -3,7 +3,7 @@ layout: implementors title: "How to contribute to the Development Container Specification" shortTitle: "Contributing" author: Microsoft -index: 8 +index: 9 --- We're excited for your contributions to the Dev Container Specification! This document outlines how you can get involved. diff --git a/_implementors/features-distribution.md b/_implementors/features-distribution.md index 45ac4231..fa1b5aa0 100644 --- a/_implementors/features-distribution.md +++ b/_implementors/features-distribution.md @@ -17,7 +17,7 @@ Goals include: - For users, provide the ability for a user to pin to a particular version (absolute, or semantic version) of a Feature to allow for consistent, repeatable environments. - Provide the ability to standardize publishing such that [supporting tools](../../supporting) may implement their own mechanism to aid Feature discoverability as they see fit. -> **Tip:** This section covers details on the Features specification. If you are looking for summarized information on creating your own Features, see the [template](https://github.com/devcontainers/feature-template) and [core Features](https://github.com/devcontainers/features) repositories. +> **Tip:** 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. ## Source Code @@ -71,7 +71,7 @@ Features are distributed as tarballs. The tarball contains the entire contents o The tarball is named `devcontainer-feature-.tgz`, where `` is the Feature's `id` field. -A reference implementation for packaging and distributing Features is provided as a GitHub Action (https://github.com/devcontainers/action). +A reference implementation for packaging and distributing Features is provided as a [GitHub Action](https://github.com/devcontainers/action). ### devcontainer-collection.json diff --git a/_implementors/features.md b/_implementors/features.md index c1526c59..259e28b0 100644 --- a/_implementors/features.md +++ b/_implementors/features.md @@ -8,13 +8,11 @@ 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. -> **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). - Feature metadata is captured by a `devcontainer-feature.json` file in the root folder of the feature. -> **Tip:** This section covers details on the Features specification. If you are looking for summarized information on creating your own Features, see the [template](https://github.com/devcontainers/feature-template) and [core Features](https://github.com/devcontainers/features) repositories. +> **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. ## Folder Structure @@ -175,11 +173,11 @@ Below is a valid `features` object provided as an example. } ``` -> Note: The `:latest` version annotation is added implicitly if omitted. To pin to a specific package version ([example](https://github.com/devcontainers/features/pkgs/container/features/go/versions)), append it to the end of the Feature. +> **Note:** The `:latest` version annotation is added implicitly if omitted. To pin to a specific package version ([example](https://github.com/devcontainers/features/pkgs/container/features/go/versions)), append it to the end of the Feature. An option's value can be provided as either a `string` or `boolean`, and should match what is expected by the feature in the `devcontainer-feature.json` file. -As a shorthand, the value of a `feature` can be provided as a single string. This string is mapped to an option called `version`. In the example below, both examples are equivalent. +As a shorthand, the value of the `features` property can be provided as a single string. This string is mapped to an option called `version`. In the example below, both examples are equivalent. ```jsonc "features": { @@ -217,7 +215,7 @@ Tooling that handles releasing Features will not republish Features if that exac ## Authoring -Features can be authored in a number of languages, the most straightforward being bash scripts. If a Feature is authored in a different language information about it should be included in the metadata so that users can make an informed choice about it. +Features can be authored in a number of languages, the most straightforward being bash scripts. If a Feature is authored in a different language, information about it should be included in the metadata so that users can make an informed choice about it. Reference information about the application required to execute the Feature should be included in `devcontainer-feature.json` in the metadata section. @@ -227,7 +225,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 dev container Features distribution page](../features-distribution)._ ## Execution diff --git a/_implementors/json_reference.md b/_implementors/json_reference.md index 370f1589..bfd0cd6f 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -172,7 +172,7 @@ Variables can be referenced in certain string values in `devcontainer.json` in t | `${devcontainerId}` | Any | Identifier derived from a set of container labels that uniquely idenity 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`. | {: .table .table-bordered .table-responsive} -## Schema +## Schema You can see the VS Code implementation of the dev container schema [here](https://github.com/microsoft/vscode/blob/main/extensions/configuration-editing/schemas/devContainer.schema.src.json). diff --git a/_implementors/reference.md b/_implementors/reference.md index 791b9e19..9442ca36 100644 --- a/_implementors/reference.md +++ b/_implementors/reference.md @@ -124,7 +124,7 @@ This allows you to have a separate **more complex** devcontainer.json you use to } ``` -Note that you can also opt to you can opt to manually add metadata to an image label instead. These properties will be picked up even if you didn't use the Dev Container CLI to build (and can be updated by the CLI even if you do). For example, consider this Dockerfile snippet: +Note that you can also opt to manually add metadata to an image label instead. These properties will be picked up even if you didn't use the Dev Container CLI to build (and can be updated by the CLI even if you do). For example, consider this Dockerfile snippet: ```Dockerfile LABEL devcontainer.metadata='[{ \ @@ -134,4 +134,4 @@ LABEL devcontainer.metadata='[{ \ }]' ``` -See [Dev Container metadata reference](../json_reference) for information on which properties are supported. +See the [Dev Container metadata reference](../json_reference) for information on which properties are supported. diff --git a/_implementors/spec.md b/_implementors/spec.md index dc72cfa5..fc04d2fa 100644 --- a/_implementors/spec.md +++ b/_implementors/spec.md @@ -36,7 +36,6 @@ Certain dev container metadata properties can be stored in an image label as an 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 [ { @@ -62,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 which 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 | Feature Metadata | | -------- | ----------- | ----------- | :---------------: | :--------------: | @@ -181,7 +180,7 @@ Users control the permissions of applications executed in the containers, allowi * **Container User**: The user that will be used for all operations that run inside a container. This concept is native to containers. It may be set in the container image, using the `containerUser` property for **image** and **dockerfile** scenarios, or using an orchestratric specific property like `user` property in Docker Compose files. * **Remote User**: Used to run the [lifecycle](#lifecycle) scripts inside the container. This is also the user tools and editors that connect to the container should use to run their processes. This concept is not native to containers. Set using the `remoteEnv` property in all cases and defaults to the container user. -This separation allows the ENTRYPOINT for the image to execute with different permissions than the developer and allows for developers to switch users without recreating their containers. +This separation allows the `ENTRYPOINT` for the image to execute with different permissions than the developer and allows for developers to switch users without recreating their containers. # Lifecycle @@ -203,7 +202,7 @@ The exact steps required to validate configuration can vary based on exactly whe ## Environment Creation -The creation process goes through the steps necesarry to go from the user configuration to a working **environment** that is ready to be used. +The creation process goes through the steps necessary to go from the user configuration to a working **environment** that is ready to be used. ### Initialization @@ -274,7 +273,7 @@ Like during the create process, remote [environment variables](#environment-vari Dev containers support a single command for each of its lifecycle scripts. While serial execution of multiple commands can be achieved with `;`, `&&`, etc., parallel execution deserves first-class support. -All lifecycle scripts have been extended to support `object` types. The key of the `object` will be a unique name for the command and the value will be the `string` or `array` command. Each command must exit successfully for the stage to be considered successful. +All lifecycle scripts have been extended to support `object` types. The key of the `object` will be a unique name for the command, and the value will be the `string` or `array` command. Each command must exit successfully for the stage to be considered successful. Each entry in the `object` will be run in parallel during that lifecycle step. diff --git a/_implementors/templates-distribution.md b/_implementors/templates-distribution.md index 81b65242..ab2d7ae9 100644 --- a/_implementors/templates-distribution.md +++ b/_implementors/templates-distribution.md @@ -1,9 +1,9 @@ --- layout: implementors -title: "Dev Container Templates distribution and discovery [proposal]" +title: "Dev Container Templates distribution and discovery" shortTitle: "Templates distribution" author: Microsoft -index: 10 +index: 8 --- **TL;DR Check out the [quick start repository](https://github.com/devcontainers/template-starter) to get started on distributing your own Dev Container Templates.** @@ -78,6 +78,7 @@ The `devcontainer-collection.json` is an auto-generated metadata file. | :--- | :--- | :--- | | `sourceInformation` | object | Metadata from the implementing packaging tool. | | `templates` | array | The list of Templates that are contained in this collection.| +{: .table .table-bordered .table-responsive} Each Template's `devcontainer-template.json` metadata file is appended into the `templates` top-level array. diff --git a/_implementors/templates.md b/_implementors/templates.md index a8e5fdbc..d559a5cb 100644 --- a/_implementors/templates.md +++ b/_implementors/templates.md @@ -1,14 +1,14 @@ --- layout: implementors -title: "Dev Container Templates reference [proposal]" +title: "Dev Container Templates reference" shortTitle: "Templates" author: Microsoft -index: 9 +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. -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). +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)). Template metadata is captured by a `devcontainer-template.json` file in the root folder of the Template. @@ -41,6 +41,7 @@ The properties of the file are as follows: | `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. | +{: .table .table-bordered .table-responsive} ### The `options` property The `options` property contains a map of option IDs and their related configuration settings. These `options` are used by the supporting tools to prompt the user to choose from different Template configuration options. The tools would replace the option ID with the selected value in all the files (within the sub-directory of the Template). This replacement would happen before dropping the `.devcontainer.json` (or `.devcontainer/devcontainer.json`) and other files (within the sub-directory of the Template) required to containerize your project. See [option resolution](#option-resolution) for more details. For example: @@ -66,6 +67,7 @@ The `options` property contains a map of option IDs and their related configurat | `optionId.proposals` | array | A list of suggested string values. Free-form values **are** allowed. Omit when using `optionId.enum`. | | `optionId.enum` | array | A strict list of allowed string values. Free-form values are **not** allowed. Omit when using `optionId.proposals`. | | `optionId.default` | string | Default value for the option. | +{: .table .table-bordered .table-responsive} > `Note`: The `options` must be unique for every `devcontainer-template.json` @@ -87,7 +89,7 @@ Tooling that handles releasing Templates will not republish Templates if that ex ## Release -_For information on distributing Templates, see [templates-distribution](/implementors/templates-distribution)._ +_For information on distributing Templates, see the [Templates distribution doc](/implementors/templates-distribution)._ ### Option Resolution @@ -119,7 +121,7 @@ Suppose the `java` Template has the following `options` parameters declared in t "17", "11" ], - "default": "17-bullseye" + "default": "17-bullseye" }, "nodeVersion": { "type": "string", @@ -145,14 +147,14 @@ and it has the following `.devcontainer.json` file: ```json { - "name": "Java", - "image": "mcr.microsoft.com/devcontainers/java:0-${templateOption:imageVariant}", - "features": { - "ghcr.io/devcontainers/features/node:1": { - "version": "${templateOption:nodeVersion}", - "installMaven": "${templateOption:installMaven}" - } - }, + "name": "Java", + "image": "mcr.microsoft.com/devcontainers/java:0-${templateOption:imageVariant}", + "features": { + "ghcr.io/devcontainers/features/node:1": { + "version": "${templateOption:nodeVersion}", + "installMaven": "${templateOption:installMaven}" + } + }, // ... } ``` @@ -161,7 +163,7 @@ A user tries to add the `java` Template to their project using the [supporting t The supporting tool could then use a string replacer for all the files within the sub-directory of the Template. In this example, `.devcontainer.json` needs to be modified and hence, the inputs can provided to it as follows: -``` +```json { imageVariant:"17-bullseye", nodeVersion: "latest", @@ -173,16 +175,16 @@ The modified `.devcontainer.json` will be as follows: ```json { - "name": "Go", - "image": "mcr.microsoft.com/devcontainers/go:0-17-bullseye", - "features": { - "ghcr.io/devcontainers/features/node:1": { - "version": "latest", - "installMaven": "false" - } - }, - ... + "name": "Go", + "image": "mcr.microsoft.com/devcontainers/go:0-17-bullseye", + "features": { + "ghcr.io/devcontainers/features/node:1": { + "version": "latest", + "installMaven": "false" + } + }, + ... } ``` -The modified `.devcontainer.json` would be dropped into any existing folder as a starting point for containerizing your project. \ No newline at end of file +The modified `.devcontainer.json` would be dropped into any existing folder as a starting point for containerizing your project. diff --git a/supporting.md b/supporting.md index bdeaab41..6d0ac8dd 100644 --- a/supporting.md +++ b/supporting.md @@ -45,12 +45,11 @@ You may learn more in the [announcement blog post](https://devblogs.microsoft.co 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`. #### 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 the 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 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. Press cmd/ctrl+shift+p or F1 and select the **Dev Containers: Install devcontainer CLI** command to install it. From 17626803e9f231640f20592ee8dc8cdef8524bbd Mon Sep 17 00:00:00 2001 From: Lauri Takacsi Date: Tue, 21 Feb 2023 14:22:11 -0800 Subject: [PATCH 060/312] Add trunk to collection index (#158) --- _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 f1bdda4d..206e7961 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -292,4 +292,9 @@ maintainer: Hamish Cox contact: https://github.com/HamishWHC/cs3231-devcontainer/issues repository: https://github.com/HamishWHC/cs3231-devcontainer - ociReference: ghcr.io/hamishwhc/cs3231-devcontainer \ No newline at end of file + ociReference: ghcr.io/hamishwhc/cs3231-devcontainer +- name: TRunk CLI Features (trunk.io) + maintainer: trunk-io + contact: https://github.com/trunk-io/devcontainer-feature/issues + repository: https://github.com/trunk-io/devcontainer-feature + ociReference: ghcr.io/trunk-io/devcontainer-feature From c74327e7091da85882dd28e2cc95754ee590050d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Mon, 27 Feb 2023 19:20:50 +0200 Subject: [PATCH 061/312] Add MultiversX templates (experimental) (#160) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 206e7961..263fc582 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -298,3 +298,8 @@ contact: https://github.com/trunk-io/devcontainer-feature/issues repository: https://github.com/trunk-io/devcontainer-feature ociReference: ghcr.io/trunk-io/devcontainer-feature +- name: MultiversX Dev Container Templates + maintainer: MultiversX + contact: https://github.com/multiversx/mx-template-devcontainers/issues + repository: https://github.com/multiversx/mx-template-devcontainers + ociReference: ghcr.io/multiversx/mx-template-devcontainers From 45f8b32ffde9cba10ec16ad04aaaf805779b14ea Mon Sep 17 00:00:00 2001 From: Joseph Heck Date: Mon, 27 Feb 2023 13:40:28 -0800 Subject: [PATCH 062/312] adding feature 'jemalloc' to the index (#162) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 263fc582..5167d5fc 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -303,3 +303,8 @@ contact: https://github.com/multiversx/mx-template-devcontainers/issues repository: https://github.com/multiversx/mx-template-devcontainers ociReference: ghcr.io/multiversx/mx-template-devcontainers +- name: jemalloc + maintainer: Joseph Heck + contact: https://github.com/heckj/jemalloc/issues + repository: https://github.com/heckj/jemalloc + ociReference: ghcr.io/heckj/jemalloc From e57ffdb51825c04ebaf1cbaf592b273c4ffcb84a Mon Sep 17 00:00:00 2001 From: Jason Walker Date: Tue, 28 Feb 2023 11:08:28 -0500 Subject: [PATCH 063/312] Added guide for GitLab CI (#161) * Added guide for GitLab CI * Grammar/spelling corrections for GitLab CI guide * Updated image path in GitLab CI guide example code * Changed 'devcontainer' to 'dev container' in GitLab guide for consistency * Added indication that CDK Feature is community maintained --- _posts/2023-02-15-gitlab-ci.md | 150 +++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 _posts/2023-02-15-gitlab-ci.md diff --git a/_posts/2023-02-15-gitlab-ci.md b/_posts/2023-02-15-gitlab-ci.md new file mode 100644 index 00000000..85104558 --- /dev/null +++ b/_posts/2023-02-15-gitlab-ci.md @@ -0,0 +1,150 @@ +--- +layout: post +title: "Working with GitLab CI" +author: "@raginjason" +authorUrl: https://github.com/raginjason +--- + +For simple use cases you can use your development container (dev container) for CI without much issue. Once you begin using more advanced dev container functionality such as [Features](/features), you will need dev container tooling in your CI pipeline. While GitHub CI has the [devcontainers-ci GitHub Action](https://github.com/marketplace/actions/devcontainers-ci), there is no such analog in GitLab CI. To achieve the goal of using your dev container in GitLab CI, the container must be pre-built. + +This document will guide you on how to build a dev container with GitLab CI, push that dev container to the GitLab Container Registry, and finally reference that dev container in your main project for both local development and GitLab CI. + +For the purpose of this document, we will assume the main project is named `my-project` and lives under the `my-user` path. The example here uses a few [Features](/features), which is what forces the container to be pre-built. + +## The Development Container GitLab project + +Create a project in GitLab where the stand-alone dev container project will live. As the main project is assumed to be named `my-project`, let's assume the dev container project name will be `my-project-dev-container` + +### Development Container .devcontainer/devcontainer.json + +The example here is a CDK project for Python makes use of both the [AWS CLI](https://github.com/devcontainers/features/tree/main/src/aws-cli) and the community-maintained [AWS CDK](http://github.com/devcontainers-contrib/features/tree/main/src/aws-cdk) Features. + +`.devcontainer/devcontainer.json`: + +```json +{ + "build": { + "context": "..", + "dockerfile": "Dockerfile" + }, + "features": { + "ghcr.io/devcontainers/features/aws-cli:1": {}, + "ghcr.io/devcontainers-contrib/features/aws-cdk:2": {} + }, + "customizations": { + "vscode": { + "settings": { + "python.formatting.provider": "black" + } + } + } +} +``` + +### Development Container Dockerfile + +As this is a Python project working with CDK, the `Dockerfile` will begin by using the latest Python dev container image and then install some basic packages via `pip`. + +`Dockerfile`: + +```Dockerfile +FROM mcr.microsoft.com/devcontainers/python:latest + +RUN pip3 --disable-pip-version-check --no-cache-dir install aws_cdk_lib constructs jsii pylint \ + && rm -rf /tmp/pip-tmp +``` + +### Development Container .gitlab-ci.yml + +Since there is no GitLab CI equivalent to [devcontainers-ci GitHub Action](https://github.com/marketplace/actions/devcontainers-ci), we will need to install the devcontainers CLI manually. The following will: + +1. Install the packages that the devcontainers CLI requires +2. Install the devcontainers CLI itself +3. Login to GitLab Container Repository +4. Build the dev container and push it to the GitLab Container Repository + +`.gitlab-ci.yml`: + +```yaml +image: docker:latest + +variables: + DOCKER_TLS_CERTDIR: "/certs" + +services: + - docker:dind + +before_script: + - apk add --update nodejs npm python3 make g++ + - npm install -g @devcontainers/cli + +build: + stage: build + script: + - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY} + - devcontainer build --workspace-folder . --push true --image-name ${CI_REGISTRY_IMAGE}:latest +``` + +## The Main GitLab project + +### Main .devcontainer/devcontainer.json + +`.devcontainer/devcontainer.json`: + +```json +{ + "image": "registry.gitlab.com/my-user/my-project-dev-container" +} +``` + +### Main .gitlab.ci.yml + +Assuming the dev container project name is based off the main project name, the `${CI_REGISTRY_NAME}` variable can be used. This configuration performs some basic sanity checks and linting once merge requests are submitted. + +`.gitlab-ci.json`: + +```yaml +image: ${CI_REGISTRY_IMAGE}-dev-container:latest + +before_script: + - python --version + - cdk --version + +stages: + - Build + - Lint + +py_compile: + stage: Build + script: + - find . -type f -name "*.py" -print | xargs -n1 python3 -m py_compile + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + +cdk synth: + stage: Build + script: + - JSII_DEPRECATED=fail cdk --app "python3 app.py" synth + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + +Pylint: + stage: Lint + script: + - pylint * + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + +Black code format: + stage: Lint + script: + - black --check --diff . + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' +``` + +## Conclusion + +It's worth noting that the best practice would be to pin the versions of the various packages installed by `pip`, `apk`, `npm` and the like. Version pinning was omitted from this guide so that it can be executed as-is without issue. + +The above provides a starting point for a dev container that's used for both local development and in GitLab CI. It can easily be customized for other languages and tool chains. Take it and make it your own, happy coding! \ No newline at end of file From 3ac31abc0da4387b97901565291d5fede942ec07 Mon Sep 17 00:00:00 2001 From: Joseph Heck Date: Tue, 28 Feb 2023 14:35:06 -0800 Subject: [PATCH 064/312] adding additional features and migrating jemalloc into a combined set (#164) --- _data/collection-index.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 5167d5fc..190f4174 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -303,8 +303,8 @@ contact: https://github.com/multiversx/mx-template-devcontainers/issues repository: https://github.com/multiversx/mx-template-devcontainers ociReference: ghcr.io/multiversx/mx-template-devcontainers -- name: jemalloc +- name: Swift Dev Container Features maintainer: Joseph Heck - contact: https://github.com/heckj/jemalloc/issues - repository: https://github.com/heckj/jemalloc - ociReference: ghcr.io/heckj/jemalloc + contact: https://github.com/heckj/devcontainer-swift-additions/issues + repository: https://github.com/heckj/devcontainer-swift-additions + ociReference: ghcr.io/heckj/devcontainer-swift-additions From 556accc6faf5326e9799e63370bd234adaefa755 Mon Sep 17 00:00:00 2001 From: Andrii Tararaka Date: Thu, 2 Mar 2023 20:35:07 +0200 Subject: [PATCH 065/312] Add new feature 'kubeseal' (#165) * Add new feature 'kubeseal' * Updated collection-index entry after code review Updated oci reference to point to root repository rather than a specific tool --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 190f4174..fdb5cae1 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -308,3 +308,8 @@ contact: https://github.com/heckj/devcontainer-swift-additions/issues repository: https://github.com/heckj/devcontainer-swift-additions ociReference: ghcr.io/heckj/devcontainer-swift-additions +- name: gickis Dev Container Features + maintainer: Andrii Tararaka + contact: https://github.com/gickis/devcontainer-features/issues + repository: https://github.com/gickis/devcontainer-features + ociReference: ghcr.io/gickis/devcontainer-features From 862a1ea1321d91d46ef998c367808c0b4789e07e Mon Sep 17 00:00:00 2001 From: Jonathan Nagayoshi Date: Tue, 7 Mar 2023 10:27:50 -0600 Subject: [PATCH 066/312] feat: adds sonikro devcontainer-feature repository to the collection (#166) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index fdb5cae1..99fabcdd 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -313,3 +313,8 @@ contact: https://github.com/gickis/devcontainer-features/issues repository: https://github.com/gickis/devcontainer-features ociReference: ghcr.io/gickis/devcontainer-features +- name: sonikro Dev Container Features + maintainer: Jonathan Nagayoshi + contact: https://github.com/sonikro/devcontainer-features/issues + repository: https://github.com/sonikro/devcontainer-features + ociReference: ghcr.io/sonikro/devcontainer-features From 7e65ced40c84ffb8883f63b3777bcdab3897a55f Mon Sep 17 00:00:00 2001 From: jarrodcolburn Date: Tue, 7 Mar 2023 10:30:07 -0600 Subject: [PATCH 067/312] added flutter sdk features collection (#167) 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 99fabcdd..a10da80b 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -313,6 +313,11 @@ 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 ecc4e7e7ef676dbb2f58c2499a2b5cc544ad8669 Mon Sep 17 00:00:00 2001 From: JasonTheDeveloper Date: Thu, 9 Mar 2023 04:13:42 +1100 Subject: [PATCH 068/312] feat(features): add jasonthedeveloper features to collection (#169) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index a10da80b..a4e78eb1 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -323,3 +323,8 @@ contact: https://github.com/sonikro/devcontainer-features/issues repository: https://github.com/sonikro/devcontainer-features ociReference: ghcr.io/sonikro/devcontainer-features +- name: Features by JasonTheDeveloper + maintainer: JasonTheDeveloper + contact: https://github.com/JasonTheDeveloper/features/issues + repository: https://github.com/JasonTheDeveloper/features + ociReference: ghcr.io/jasonthedeveloper/features From 952356dd573fca534ecfdae8c72cb1ef7d656ea9 Mon Sep 17 00:00:00 2001 From: John Muchovej <5000729+jmuchovej@users.noreply.github.com> Date: Wed, 8 Mar 2023 17:50:27 -0500 Subject: [PATCH 069/312] Adding John Muchovej's Devcontainer Templates (#170) * Adding John Muchovej's Devcontainer Features/Templates * Remove `../features` until published. --- _data/collection-index.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index a4e78eb1..8a473057 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -328,3 +328,7 @@ contact: https://github.com/JasonTheDeveloper/features/issues repository: https://github.com/JasonTheDeveloper/features ociReference: ghcr.io/jasonthedeveloper/features +- name: Templates by John Muchovej + maintainer: John Muchovej + contact: https://github.com/jmuchovej/devcontainers + ociReference: ghcr.io/jmuchovej/templates From 115b65cb1ff180ef6b4a45cbf8ffb1dac23d6c85 Mon Sep 17 00:00:00 2001 From: John Muchovej <5000729+jmuchovej@users.noreply.github.com> Date: Wed, 8 Mar 2023 18:42:20 -0500 Subject: [PATCH 070/312] Fix missing repository entry (#171) Forgot to add the `repository` link. https://github.com/devcontainers/devcontainers.github.io/pull/170#discussion_r1130168002 --- _data/collection-index.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 8a473057..e56b141e 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -330,5 +330,6 @@ ociReference: ghcr.io/jasonthedeveloper/features - name: Templates by John Muchovej maintainer: John Muchovej - contact: https://github.com/jmuchovej/devcontainers + contact: https://github.com/jmuchovej/devcontainers/issues + repository: https://github.com/jmuchovej/devcontainers ociReference: ghcr.io/jmuchovej/templates From 2de3c80dcae255db04a6dd754e42bb57e47dfa44 Mon Sep 17 00:00:00 2001 From: Dasith Wijesiriwardena Date: Fri, 10 Mar 2023 04:27:19 +1100 Subject: [PATCH 071/312] Add Grype feature (#172) * Add Grype feature * update repo name --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index e56b141e..2082c637 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -333,3 +333,8 @@ contact: https://github.com/jmuchovej/devcontainers/issues repository: https://github.com/jmuchovej/devcontainers ociReference: ghcr.io/jmuchovej/templates +- name: Features by dasiths + maintainer: dasiths + contact: https://dasith.me + repository: https://github.com/dasiths/devcontainer-features + ociReference: ghcr.io/dasiths/devcontainer-features From 28aab73483d4d35a99389cc8a93ffc9d877c57f3 Mon Sep 17 00:00:00 2001 From: Dasith Wijesiriwardena Date: Fri, 10 Mar 2023 11:11:17 +1100 Subject: [PATCH 072/312] update maintainer name (#173) --- _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 2082c637..302ed74e 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -334,7 +334,7 @@ repository: https://github.com/jmuchovej/devcontainers ociReference: ghcr.io/jmuchovej/templates - name: Features by dasiths - maintainer: dasiths + maintainer: Dasith Wijes contact: https://dasith.me repository: https://github.com/dasiths/devcontainer-features ociReference: ghcr.io/dasiths/devcontainer-features From dbbe44f565b6966dc7f001683a7a77ccdc7a7342 Mon Sep 17 00:00:00 2001 From: Felix Wieland Date: Mon, 13 Mar 2023 17:19:59 +0100 Subject: [PATCH 073/312] added features for 1password, maelstrom and terraspace (#175) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 302ed74e..e2090277 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -338,3 +338,8 @@ contact: https://dasith.me repository: https://github.com/dasiths/devcontainer-features ociReference: ghcr.io/dasiths/devcontainer-features +- name: flexwie devcontainer features + maintainer: Felix Wieland + contact: https://github.com/flexwie/devcontainer-features/issues + repository: https://github.com/flexwie/devcontainer-features + ociReference: ghcr.io/flexwie/devcontainer-features From 522e3e2124b7c48a357ec461eccb844c9ed58b8a Mon Sep 17 00:00:00 2001 From: jarrodcolburn Date: Mon, 13 Mar 2023 11:25:12 -0500 Subject: [PATCH 074/312] Add Favicon (#176) * Add favicon file * change favicon .png -> .ico * extract css theme color for use site * use jekyll site to provide css color * set meta theme color to change title bar color --- _config.yml | 1 + _includes/head.html | 3 ++- css/main.scss | 6 +++--- img/favicon.ico | Bin 0 -> 178545 bytes 4 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 img/favicon.ico diff --git a/_config.yml b/_config.yml index 855811df..ea6505ee 100644 --- a/_config.yml +++ b/_config.yml @@ -7,6 +7,7 @@ description: > url: https://devcontainers.github.io # the base hostname & protocol for your site git_address: https://github.com/devcontainers/devcontainers.github.io git_edit_address: https://github.com/devcontainers/devcontainers.github.io/settings/pages/blob/gh-pages +theme_color: 2753E3 # Build settings markdown: kramdown diff --git a/_includes/head.html b/_includes/head.html index 0c08952d..96f19362 100644 --- a/_includes/head.html +++ b/_includes/head.html @@ -11,7 +11,8 @@ - + + diff --git a/css/main.scss b/css/main.scss index 53433b0a..b205fef8 100644 --- a/css/main.scss +++ b/css/main.scss @@ -24,7 +24,7 @@ body { } .bg-primary { - background-color: #2753e3 !important; + background-color: #{{ site.theme_color }} !important; } .header-container { @@ -442,7 +442,7 @@ pre[class=highlight] { } .nav .nav-link { - color: #2753e3 !important; + color: #{{ site.theme_color }} !important; } .nav .nav-link:hover { @@ -450,7 +450,7 @@ pre[class=highlight] { } a { - color: #2753e3; + color: #{{ site.theme_color }}; } a:hover { diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..dff7dd5a96749bdc3b486f52a277213592cce918 GIT binary patch literal 178545 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 z%0D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 JYk*sX|39EGtRVmZ literal 0 HcmV?d00001 From 0835e8e722a12abf9260ba6b40adb32fb5f64a75 Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Wed, 15 Mar 2023 14:35:46 -0700 Subject: [PATCH 075/312] 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 bfd0cd6f..0cb20e4e 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -169,7 +169,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 idenity 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 | 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`. | {: .table .table-bordered .table-responsive} ## Schema From b097ab1c81eaef2226cc9f0456decd98efdaac3d Mon Sep 17 00:00:00 2001 From: Ian Purton <36966+ianpurton@users.noreply.github.com> Date: Thu, 16 Mar 2023 17:43:33 +0100 Subject: [PATCH 076/312] Update collection-index.yml (#177) Add support for the rust on nails devcontainer --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index e2090277..e0095680 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -343,3 +343,8 @@ contact: https://github.com/flexwie/devcontainer-features/issues repository: https://github.com/flexwie/devcontainer-features ociReference: ghcr.io/flexwie/devcontainer-features +- name: Rust on Nails + maintainer: Ian Purton + contact: https://github.com/purton-tech/rust-on-nails/issues + repository: https://github.com/purton-tech/rust-on-nails + ociReference: ghcr.io/purton-tech/rust-on-nails From 8974b2fc2518bd13e596aad45d44dbd4ceece93a Mon Sep 17 00:00:00 2001 From: Kevin Harrigan <8164246+ksh5022@users.noreply.github.com> Date: Mon, 20 Mar 2023 11:42:38 -0400 Subject: [PATCH 077/312] docs: add ksh5022 features to index (#178) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index e0095680..a82128b3 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -348,3 +348,8 @@ contact: https://github.com/purton-tech/rust-on-nails/issues repository: https://github.com/purton-tech/rust-on-nails ociReference: ghcr.io/purton-tech/rust-on-nails +- name: ksh5022 devcontainer features + maintainer: Kevin Harrigan + contact: https://github.com/ksh5022/devcontainer-features/issues + repository: https://github.com/ksh5022/devcontainer-features + ociReference: ghcr.io/ksh5022/devcontainer-features From 3ff5b10fe73c5d6996d0b6d6285baf14586ccb83 Mon Sep 17 00:00:00 2001 From: Adam Fowler Date: Mon, 20 Mar 2023 15:44:21 +0000 Subject: [PATCH 078/312] Use swift-server-community version of heckj features (#179) --- _data/collection-index.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index a82128b3..98b5be03 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -304,10 +304,10 @@ repository: https://github.com/multiversx/mx-template-devcontainers ociReference: ghcr.io/multiversx/mx-template-devcontainers - name: Swift Dev Container Features - maintainer: Joseph Heck - contact: https://github.com/heckj/devcontainer-swift-additions/issues - repository: https://github.com/heckj/devcontainer-swift-additions - ociReference: ghcr.io/heckj/devcontainer-swift-additions + maintainer: Joseph Heck/Adam Fowler + contact: https://github.com/swift-server-community/swift-devcontainer-features/issues + repository: https://github.com/swift-server-community/swift-devcontainer-features + ociReference: ghcr.io/swift-server-community/swift-devcontainer-features - name: gickis Dev Container Features maintainer: Andrii Tararaka contact: https://github.com/gickis/devcontainer-features/issues From 9c5c83133ddff0daee1f4f054f11d7fe33c31aa6 Mon Sep 17 00:00:00 2001 From: Guilherme Monteiro Pereira Date: Wed, 29 Mar 2023 14:50:39 -0300 Subject: [PATCH 079/312] Add new feature Airplane.dev CLI (#180) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 98b5be03..c8fb579e 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -353,3 +353,8 @@ contact: https://github.com/ksh5022/devcontainer-features/issues repository: https://github.com/ksh5022/devcontainer-features ociReference: ghcr.io/ksh5022/devcontainer-features +- name: GMkonan devcontainer features + maintainer: GMkonan + contact: https://github.com/GMkonan/feature/issues + repository: https://github.com/GMkonan/feature + ociReference: ghcr.io/gmkonan/feature From 50baefde8d473dd793b8f6f9ae661f8dafc2d84b Mon Sep 17 00:00:00 2001 From: azutake Date: Tue, 4 Apr 2023 03:29:29 +0900 Subject: [PATCH 080/312] Update collection-index.yml (#182) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index c8fb579e..7bf8e7ce 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -358,3 +358,8 @@ contact: https://github.com/GMkonan/feature/issues repository: https://github.com/GMkonan/feature ociReference: ghcr.io/gmkonan/feature +- name: Azutake Dev Container features + maintainer: Azutake + contact: https://github.com/azutake/devcontainer-features/issues + repository: https://github.com/azutake/devcontainer-features + ociReference: ghcr.io/azutake/devcontainer-features From c7b9fba0e328708ee44fc362f202dc8a76f36799 Mon Sep 17 00:00:00 2001 From: Stuart Leeks Date: Mon, 3 Apr 2023 19:30:57 +0100 Subject: [PATCH 081/312] Add Dapr feature (#181) * Add Dapr feature * Fixup reference --------- 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 7bf8e7ce..641c1b07 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -358,6 +358,11 @@ contact: https://github.com/GMkonan/feature/issues repository: https://github.com/GMkonan/feature ociReference: ghcr.io/gmkonan/feature +- name: Dapr devcontainer features + maintainer: Dapr maintainers + contact: https://github.com/dapr/cli/issues + repository: https://github.com/dapr/cli + ociReference: ghcr.io/dapr/cli - name: Azutake Dev Container features maintainer: Azutake contact: https://github.com/azutake/devcontainer-features/issues From de660a4ac6bc56a6048ab36fbfe1c41451100ad7 Mon Sep 17 00:00:00 2001 From: Michael Lohr Date: Fri, 7 Apr 2023 18:17:35 +0200 Subject: [PATCH 082/312] Add michidk's feature repo to the collection index (#183) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 641c1b07..fc139c12 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -368,3 +368,8 @@ contact: https://github.com/azutake/devcontainer-features/issues repository: https://github.com/azutake/devcontainer-features ociReference: ghcr.io/azutake/devcontainer-features +- name: Features by michidk + maintainer: Michael Lohr + contact: https://github.com/michidk/ + repository: https://github.com/michidk/devcontainers-features + ociReference: ghcr.io/michidk/devcontainers-features From f066595fe5c423202a9c0a05924f2d29af031b52 Mon Sep 17 00:00:00 2001 From: wxw-matt <55307382+wxw-matt@users.noreply.github.com> Date: Tue, 11 Apr 2023 01:41:11 +0930 Subject: [PATCH 083/312] Add a new feature named script_runner (#184) This feature allows developers to run remote shell scripts. --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index fc139c12..c5426ee0 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -373,3 +373,8 @@ contact: https://github.com/michidk/ repository: https://github.com/michidk/devcontainers-features ociReference: ghcr.io/michidk/devcontainers-features +- name: A powerful and handy feature that runs remote shell scripts + maintainer: Xiaowei Wang + contact: https://github.com/wxw-matt/devcontainer-features/issues + repository: https://github.com/wxw-matt/devcontainer-features + ociReference: ghcr.io/wxw-matt/devcontainer-features From f7e4d20ff81e6423efe7f64a11418907948c554a Mon Sep 17 00:00:00 2001 From: Curtis Mayberry Date: Tue, 11 Apr 2023 11:11:42 -0500 Subject: [PATCH 084/312] Update collection-index.yml (#185) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index c5426ee0..1ef0349b 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -373,6 +373,11 @@ contact: https://github.com/michidk/ repository: https://github.com/michidk/devcontainers-features ociReference: ghcr.io/michidk/devcontainers-features +- name: Integrated Circuit Design Environment Templates + maintainer: Curtis Mayberry + contact: https://github.com/curtisma/ + repository: https://github.com/cascode-labs/viper-ic-devcontainers + ociReference: ghcr.io/cascode-labs/viper-ic-devcontainers - name: A powerful and handy feature that runs remote shell scripts maintainer: Xiaowei Wang contact: https://github.com/wxw-matt/devcontainer-features/issues From dff8283645307f19d7f34a14783cb035a51451d0 Mon Sep 17 00:00:00 2001 From: Jason Vercellone Date: Thu, 13 Apr 2023 10:43:50 -0500 Subject: [PATCH 085/312] Add sfdx-cli feature to index (#189) Co-authored-by: jason-vercellone_MKI --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 1ef0349b..147eca7a 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -383,3 +383,8 @@ contact: https://github.com/wxw-matt/devcontainer-features/issues repository: https://github.com/wxw-matt/devcontainer-features ociReference: ghcr.io/wxw-matt/devcontainer-features +- name: Salesforce CLI Features + maintainer: Jason Vercellone + contact: https://github.com/vercellone/devcontainer-features/issues + repository: https://github.com/vercellone/devcontainer-features + ociReference: ghcr.io/vercellone/devcontainer-features From 293da0b84fd2c71aafecc0f8699ac908cb43164f Mon Sep 17 00:00:00 2001 From: Joe M Date: Mon, 17 Apr 2023 17:28:44 +0100 Subject: [PATCH 086/312] Add entry in collection-index.yml (#191) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 147eca7a..6ccf16c0 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -388,3 +388,8 @@ contact: https://github.com/vercellone/devcontainer-features/issues repository: https://github.com/vercellone/devcontainer-features ociReference: ghcr.io/vercellone/devcontainer-features +- name: Features by joedmck + maintainer: Joe McKinnon + contact: https://github.com/joedmck/devcontainer-features/issues + repository: https://github.com/joedmck/devcontainer-features + ociReference: ghcr.io/joedmck/devcontainer-features From 427ccd1957b97da078f41ca145d337a94b528d7a Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Wed, 19 Apr 2023 10:20:19 -0700 Subject: [PATCH 087/312] Add report note (#193) --- features.html | 2 ++ templates.html | 2 ++ 2 files changed, 4 insertions(+) diff --git a/features.html b/features.html index 88f45683..88d3d855 100644 --- a/features.html +++ b/features.html @@ -12,6 +12,8 @@

Available Dev Container Featur Feature quick start repository to add your own!

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.

diff --git a/templates.html b/templates.html index 42f620be..089fe51c 100644 --- a/templates.html +++ b/templates.html @@ -12,6 +12,8 @@

Available Dev Container Templa Template quick start repository to add your own!

Templates listed here will be presented in the UX of supporting tools. +

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

From 6d3b07f3e05b15bf099ee52c11c59f4f78e468c5 Mon Sep 17 00:00:00 2001 From: "Cody A. Taylor" Date: Wed, 19 Apr 2023 19:45:19 -0400 Subject: [PATCH 088/312] Add CodeMan99/features to the index. (#192) * Add CodeMan99/features to the index. * Lowercase ociReference name. 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 6ccf16c0..f1242c9a 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -393,3 +393,8 @@ contact: https://github.com/joedmck/devcontainer-features/issues repository: https://github.com/joedmck/devcontainer-features ociReference: ghcr.io/joedmck/devcontainer-features +- name: Features by CodeMan99 + maintainer: Cody Taylor + contact: https://github.com/CodeMan99/features/issues + repository: https://github.com/CodeMan99/features + ociReference: ghcr.io/codeman99/features From 4f54be105ff3550a946daf03eef503ad3efee377 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Fri, 21 Apr 2023 09:14:21 +0200 Subject: [PATCH 089/312] Pick up control manifest (#194) --- .github/workflows/publish.yml | 6 ++++++ .gitignore | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index e94d6eb2..5fe63fd7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -36,6 +36,12 @@ jobs: mv oras-install/oras /usr/local/bin/ rm -rf oras_0.13.0_*.tar.gz oras-install/ + - name: Fetch devcontainer-control-manifest.json + run: | + cd _data + oras pull ghcr.io/devcontainers/control-manifest:latest + cp devcontainer-control-manifest.json ../static/ + - name: Fetch devcontainer-index.json run: | cd _data diff --git a/.gitignore b/.gitignore index 535fbe39..df8ee589 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ npm-debug.log _site spec-generator/node_modules spec-generator/out -devcontainer-index.json \ No newline at end of file +devcontainer-index.json +devcontainer-control-manifest.json \ No newline at end of file From 41d1b91851adb59d736a58a5841caa7da295ae20 Mon Sep 17 00:00:00 2001 From: favalos Date: Mon, 24 Apr 2023 08:52:14 -0700 Subject: [PATCH 090/312] Added Temporalio feature to the index. (#200) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index f1242c9a..9fc830e5 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -398,3 +398,8 @@ contact: https://github.com/CodeMan99/features/issues repository: https://github.com/CodeMan99/features ociReference: ghcr.io/codeman99/features +- name: Features by Favalos + maintainer: Fernando Avalos + contact: https://github.com/favalos/devcontainer-features/issues + repository: https://github.com/favalos/devcontainer-features + ociReference: ghcr.io/favalos/devcontainer-features From bac2fb821f46c0d068ba78e7ad203522bb0441fb Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Mon, 24 Apr 2023 10:57:18 -0700 Subject: [PATCH 091/312] Update dev container (#199) * Update dev container * Bump version --------- Co-authored-by: bamurtaugh --- .devcontainer/Dockerfile | 14 - .devcontainer/base.Dockerfile | 26 -- .devcontainer/devcontainer.json | 40 ++- .devcontainer/post-create.sh | 12 - .gitattributes | 3 + Gemfile | 6 +- Gemfile.lock | 498 +++++++++++++++++--------------- README.md | 2 +- 8 files changed, 293 insertions(+), 308 deletions(-) delete mode 100644 .devcontainer/Dockerfile delete mode 100644 .devcontainer/base.Dockerfile delete mode 100644 .devcontainer/post-create.sh create mode 100644 .gitattributes diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 19e72747..00000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -# [Choice] Debian OS version (use bullseye on local arm64/Apple Silicon): bullseye, buster -ARG VARIANT=bullseye -FROM mcr.microsoft.com/vscode/devcontainers/jekyll:0-${VARIANT} - -# [Choice] Node.js version: none, lts/*, 16, 14, 12, 10 -ARG NODE_VERSION="none" -RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi - -# [Optional] Uncomment this section to install additional OS packages. -# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ -# && apt-get -y install --no-install-recommends - -# [Optional] Uncomment this line to install global node packages. -# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g " 2>&1 \ No newline at end of file diff --git a/.devcontainer/base.Dockerfile b/.devcontainer/base.Dockerfile deleted file mode 100644 index 9e3296a6..00000000 --- a/.devcontainer/base.Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# [Choice] Debian OS version (use 2.7-bullseye on local arm64/Apple Silicon): 2.7-bullseye, 2.7-buster -ARG VARIANT=2.7-bullseye -FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT} -COPY library-scripts/meta.env /usr/local/etc/vscode-dev-containers - -# ENV Variables required by Jekyll -ENV LANG=en_US.UTF-8 \ - LANGUAGE=en_US:en \ - TZ=Etc/UTC \ - LC_ALL=en_US.UTF-8 \ - LANG=en_US.UTF-8 \ - LANGUAGE=en_US - -# Install bundler, latest jekyll, and github-pages for older jekyll -RUN gem install bundler jekyll github-pages - -# [Choice] Node.js version: none, lts/*, 16, 14, 12, 10 -ARG NODE_VERSION="none" -RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi - -# [Optional] Uncomment this section to install additional OS packages. -# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ -# && apt-get -y install --no-install-recommends - -# [Optional] Uncomment this line to install global node packages. -# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g " 2>&1 diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index dffec322..74ca7760 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,23 +1,16 @@ -// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: -// https://github.com/microsoft/vscode-dev-containers/tree/v0.231.6/containers/jekyll +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/jekyll { "name": "Jekyll", - "build": { - "dockerfile": "Dockerfile", - "args": { - // Update 'VARIANT' to pick a Debian OS version: bullseye, buster - // Use bullseye when on local arm64/Apple Silicon. - "VARIANT": "bullseye", - // Enable Node.js: pick the latest LTS version - "NODE_VERSION": "lts/*" - } - }, - - // Set *default* container specific settings.json values on container create. - "settings": {}, + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/jekyll:1-bullseye", - // Add the IDs of extensions you want installed when the container is created. - "extensions": [], + // Features to add to the dev container. More info: https://containers.dev/features. + "features": { + "ghcr.io/devcontainers/features/node:1": { + "version": "latest" + } + }, // Use 'forwardPorts' to make a list of ports inside the container available locally. "forwardPorts": [ @@ -25,11 +18,14 @@ 4000, // Live reload server 35729 - ], + ] + + // Uncomment the next line to run commands after the container is created. + // "postCreateCommand": "jekyll --version" - // Use 'postCreateCommand' to run commands after the container is created. - "postCreateCommand": "sh .devcontainer/post-create.sh", + // Configure tool-specific properties. + // "customizations": {}, - // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. - "remoteUser": "vscode" + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" } diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh deleted file mode 100644 index 8c25f3d5..00000000 --- a/.devcontainer/post-create.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -# Install the version of Bundler. -if [ -f Gemfile.lock ] && grep "BUNDLED WITH" Gemfile.lock > /dev/null; then - cat Gemfile.lock | tail -n 2 | grep -C2 "BUNDLED WITH" | tail -n 1 | xargs gem install bundler -v -fi - -# If there's a Gemfile, then run `bundle install` -# It's assumed that the Gemfile will install Jekyll too -if [ -f Gemfile ]; then - bundle install -fi diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..5dc46e6b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +* text=auto eol=lf +*.{cmd,[cC][mM][dD]} text eol=crlf +*.{bat,[bB][aA][tT]} text eol=crlf \ No newline at end of file diff --git a/Gemfile b/Gemfile index 29414965..6809aa94 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ source "https://rubygems.org/" ruby RUBY_VERSION -gem "jekyll", "3.6.2" +gem "jekyll", "3.9.3" # to use GitHub Pages # gem "github-pages", group: :jekyll_plugins @@ -14,4 +14,6 @@ group :jekyll_plugins do end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] \ No newline at end of file +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +gem 'webrick', '~> 1.7' \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index f05bd56a..7e8d347f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,231 +1,267 @@ -GEM - remote: https://rubygems.org/ - specs: - activesupport (4.2.9) - i18n (~> 0.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - addressable (2.5.2) - public_suffix (>= 2.0.2, < 4.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.11.1) - colorator (1.1.0) - concurrent-ruby (1.0.5) - ethon (0.11.0) - ffi (>= 1.3.0) - execjs (2.7.0) - faraday (0.15.2) - multipart-post (>= 1.2, < 3) - ffi (1.9.25) - forwardable-extended (2.6.0) - gemoji (3.0.0) - github-pages (170) - activesupport (= 4.2.9) - github-pages-health-check (= 1.3.5) - jekyll (= 3.6.2) - jekyll-avatar (= 0.5.0) - jekyll-coffeescript (= 1.0.2) - jekyll-default-layout (= 0.1.4) - jekyll-feed (= 0.9.2) - jekyll-gist (= 1.4.1) - jekyll-github-metadata (= 2.9.3) - jekyll-mentions (= 1.2.0) - jekyll-optional-front-matter (= 0.3.0) - jekyll-paginate (= 1.1.0) - jekyll-readme-index (= 0.2.0) - jekyll-redirect-from (= 0.12.1) - jekyll-relative-links (= 0.5.2) - jekyll-sass-converter (= 1.5.0) - jekyll-seo-tag (= 2.3.0) - jekyll-sitemap (= 1.1.1) - jekyll-swiss (= 0.4.0) - jekyll-theme-architect (= 0.1.0) - jekyll-theme-cayman (= 0.1.0) - jekyll-theme-dinky (= 0.1.0) - jekyll-theme-hacker (= 0.1.0) - jekyll-theme-leap-day (= 0.1.0) - jekyll-theme-merlot (= 0.1.0) - jekyll-theme-midnight (= 0.1.0) - jekyll-theme-minimal (= 0.1.0) - jekyll-theme-modernist (= 0.1.0) - jekyll-theme-primer (= 0.5.2) - jekyll-theme-slate (= 0.1.0) - jekyll-theme-tactile (= 0.1.0) - jekyll-theme-time-machine (= 0.1.0) - jekyll-titles-from-headings (= 0.5.0) - jemoji (= 0.8.1) - kramdown (= 1.14.0) - liquid (= 4.0.0) - listen (= 3.0.6) - mercenary (~> 0.3) - minima (= 2.1.1) - rouge (= 2.2.1) - terminal-table (~> 1.4) - github-pages-health-check (1.3.5) - addressable (~> 2.3) - net-dns (~> 0.8) - octokit (~> 4.0) - public_suffix (~> 2.0) - typhoeus (~> 0.7) - html-pipeline (2.8.0) - activesupport (>= 2) - nokogiri (>= 1.4) - i18n (0.9.5) - concurrent-ruby (~> 1.0) - jekyll (3.6.2) - addressable (~> 2.4) - colorator (~> 1.0) - jekyll-sass-converter (~> 1.0) - jekyll-watch (~> 1.1) - kramdown (~> 1.14) - liquid (~> 4.0) - mercenary (~> 0.3.3) - pathutil (~> 0.9) - rouge (>= 1.7, < 3) - safe_yaml (~> 1.0) - jekyll-avatar (0.5.0) - jekyll (~> 3.0) - jekyll-coffeescript (1.0.2) - coffee-script (~> 2.2) - coffee-script-source (~> 1.11.1) - jekyll-default-layout (0.1.4) - jekyll (~> 3.0) - jekyll-feed (0.9.2) - jekyll (~> 3.3) - jekyll-gist (1.4.1) - octokit (~> 4.2) - jekyll-github-metadata (2.9.3) - jekyll (~> 3.1) - octokit (~> 4.0, != 4.4.0) - jekyll-mentions (1.2.0) - activesupport (~> 4.0) - html-pipeline (~> 2.3) - jekyll (~> 3.0) - jekyll-optional-front-matter (0.3.0) - jekyll (~> 3.0) - jekyll-paginate (1.1.0) - jekyll-readme-index (0.2.0) - jekyll (~> 3.0) - jekyll-redirect-from (0.12.1) - jekyll (~> 3.3) - jekyll-relative-links (0.5.2) - jekyll (~> 3.3) - jekyll-remote-theme (0.3.1) - jekyll (~> 3.5) - rubyzip (>= 1.2.1, < 3.0) - jekyll-sass-converter (1.5.0) - sass (~> 3.4) - jekyll-seo-tag (2.3.0) - jekyll (~> 3.3) - jekyll-sitemap (1.1.1) - jekyll (~> 3.3) - jekyll-swiss (0.4.0) - jekyll-theme-architect (0.1.0) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-cayman (0.1.0) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-dinky (0.1.0) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-hacker (0.1.0) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-leap-day (0.1.0) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-merlot (0.1.0) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-midnight (0.1.0) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-minimal (0.1.0) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-modernist (0.1.0) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-primer (0.5.2) - jekyll (~> 3.5) - jekyll-github-metadata (~> 2.9) - jekyll-seo-tag (~> 2.2) - jekyll-theme-slate (0.1.0) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-tactile (0.1.0) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-time-machine (0.1.0) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-titles-from-headings (0.5.0) - jekyll (~> 3.3) - jekyll-watch (1.5.1) - listen (~> 3.0) - jemoji (0.8.1) - activesupport (~> 4.0, >= 4.2.9) - gemoji (~> 3.0) - html-pipeline (~> 2.2) - jekyll (>= 3.0) - kramdown (1.14.0) - liquid (4.0.0) - listen (3.0.6) - rb-fsevent (>= 0.9.3) - rb-inotify (>= 0.9.7) - mercenary (0.3.6) - mini_portile2 (2.3.0) - minima (2.1.1) - jekyll (~> 3.3) - minitest (5.11.3) - multipart-post (2.0.0) - net-dns (0.8.0) - nokogiri (1.8.2) - mini_portile2 (~> 2.3.0) - octokit (4.9.0) - sawyer (~> 0.8.0, >= 0.5.3) - pathutil (0.16.1) - forwardable-extended (~> 2.6) - public_suffix (2.0.5) - rb-fsevent (0.10.3) - rb-inotify (0.9.10) - ffi (>= 0.5.0, < 2) - rouge (2.2.1) - rubyzip (1.2.1) - safe_yaml (1.0.4) - sass (3.5.6) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - sawyer (0.8.1) - addressable (>= 2.3.5, < 2.6) - faraday (~> 0.8, < 1.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) - typhoeus (0.8.0) - ethon (>= 0.8.0) - tzinfo (1.2.5) - thread_safe (~> 0.1) - unicode-display_width (1.4.0) - -PLATFORMS - ruby - -DEPENDENCIES - github-pages - jekyll (= 3.6.2) - jekyll-remote-theme - jemoji - tzinfo-data - -RUBY VERSION - ruby 2.7.7p221 - -BUNDLED WITH - 2.3.26 +GEM + remote: https://rubygems.org/ + specs: + activesupport (7.0.4.3) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + addressable (2.8.4) + public_suffix (>= 2.0.2, < 6.0) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.11.1) + colorator (1.1.0) + commonmarker (0.23.9) + concurrent-ruby (1.2.2) + dnsruby (1.70.0) + simpleidn (~> 0.2.1) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + ethon (0.16.0) + ffi (>= 1.15.0) + eventmachine (1.2.7) + execjs (2.8.1) + faraday (2.7.4) + faraday-net_http (>= 2.0, < 3.1) + ruby2_keywords (>= 0.0.4) + faraday-net_http (3.0.2) + ffi (1.15.5) + forwardable-extended (2.6.0) + gemoji (3.0.1) + github-pages (228) + github-pages-health-check (= 1.17.9) + jekyll (= 3.9.3) + jekyll-avatar (= 0.7.0) + jekyll-coffeescript (= 1.1.1) + jekyll-commonmark-ghpages (= 0.4.0) + jekyll-default-layout (= 0.1.4) + jekyll-feed (= 0.15.1) + jekyll-gist (= 1.5.0) + jekyll-github-metadata (= 2.13.0) + jekyll-include-cache (= 0.2.1) + jekyll-mentions (= 1.6.0) + jekyll-optional-front-matter (= 0.3.2) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.3.0) + jekyll-redirect-from (= 0.16.0) + jekyll-relative-links (= 0.6.1) + jekyll-remote-theme (= 0.4.3) + jekyll-sass-converter (= 1.5.2) + jekyll-seo-tag (= 2.8.0) + jekyll-sitemap (= 1.4.0) + jekyll-swiss (= 1.0.0) + jekyll-theme-architect (= 0.2.0) + jekyll-theme-cayman (= 0.2.0) + jekyll-theme-dinky (= 0.2.0) + jekyll-theme-hacker (= 0.2.0) + jekyll-theme-leap-day (= 0.2.0) + jekyll-theme-merlot (= 0.2.0) + jekyll-theme-midnight (= 0.2.0) + jekyll-theme-minimal (= 0.2.0) + jekyll-theme-modernist (= 0.2.0) + jekyll-theme-primer (= 0.6.0) + jekyll-theme-slate (= 0.2.0) + jekyll-theme-tactile (= 0.2.0) + jekyll-theme-time-machine (= 0.2.0) + jekyll-titles-from-headings (= 0.5.3) + jemoji (= 0.12.0) + kramdown (= 2.3.2) + kramdown-parser-gfm (= 1.1.0) + liquid (= 4.0.4) + mercenary (~> 0.3) + minima (= 2.5.1) + nokogiri (>= 1.13.6, < 2.0) + rouge (= 3.26.0) + terminal-table (~> 1.4) + github-pages-health-check (1.17.9) + addressable (~> 2.3) + dnsruby (~> 1.60) + octokit (~> 4.0) + public_suffix (>= 3.0, < 5.0) + typhoeus (~> 1.3) + html-pipeline (2.14.3) + activesupport (>= 2) + nokogiri (>= 1.4) + http_parser.rb (0.8.0) + i18n (1.12.0) + concurrent-ruby (~> 1.0) + jekyll (3.9.3) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (>= 0.7, < 2) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (>= 1.17, < 3) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-avatar (0.7.0) + jekyll (>= 3.0, < 5.0) + jekyll-coffeescript (1.1.1) + coffee-script (~> 2.2) + coffee-script-source (~> 1.11.1) + jekyll-commonmark (1.4.0) + commonmarker (~> 0.22) + jekyll-commonmark-ghpages (0.4.0) + commonmarker (~> 0.23.7) + jekyll (~> 3.9.0) + jekyll-commonmark (~> 1.4.0) + rouge (>= 2.0, < 5.0) + jekyll-default-layout (0.1.4) + jekyll (~> 3.0) + jekyll-feed (0.15.1) + jekyll (>= 3.7, < 5.0) + jekyll-gist (1.5.0) + octokit (~> 4.2) + jekyll-github-metadata (2.13.0) + jekyll (>= 3.4, < 5.0) + octokit (~> 4.0, != 4.4.0) + jekyll-include-cache (0.2.1) + jekyll (>= 3.7, < 5.0) + jekyll-mentions (1.6.0) + html-pipeline (~> 2.3) + jekyll (>= 3.7, < 5.0) + jekyll-optional-front-matter (0.3.2) + jekyll (>= 3.0, < 5.0) + jekyll-paginate (1.1.0) + jekyll-readme-index (0.3.0) + jekyll (>= 3.0, < 5.0) + jekyll-redirect-from (0.16.0) + jekyll (>= 3.3, < 5.0) + jekyll-relative-links (0.6.1) + jekyll (>= 3.3, < 5.0) + jekyll-remote-theme (0.4.3) + addressable (~> 2.0) + jekyll (>= 3.5, < 5.0) + jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) + rubyzip (>= 1.3.0, < 3.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-seo-tag (2.8.0) + jekyll (>= 3.8, < 5.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-swiss (1.0.0) + jekyll-theme-architect (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-cayman (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-dinky (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-hacker (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-leap-day (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-merlot (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-midnight (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-minimal (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-modernist (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-primer (0.6.0) + jekyll (> 3.5, < 5.0) + jekyll-github-metadata (~> 2.9) + jekyll-seo-tag (~> 2.0) + jekyll-theme-slate (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-tactile (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-time-machine (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-titles-from-headings (0.5.3) + jekyll (>= 3.3, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.12.0) + gemoji (~> 3.0) + html-pipeline (~> 2.2) + jekyll (>= 3.0, < 5.0) + kramdown (2.3.2) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.8.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.3.6) + minima (2.5.1) + jekyll (>= 3.5, < 5.0) + jekyll-feed (~> 0.9) + jekyll-seo-tag (~> 2.1) + minitest (5.18.0) + nokogiri (1.14.3-x86_64-linux) + racc (~> 1.4) + octokit (4.25.1) + faraday (>= 1, < 3) + sawyer (~> 0.9) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (4.0.7) + racc (1.6.2) + rb-fsevent (0.11.2) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.2.5) + rouge (3.26.0) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + safe_yaml (1.0.5) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.9.2) + addressable (>= 2.3.5) + faraday (>= 0.17.3, < 3) + simpleidn (0.2.1) + unf (~> 0.1.4) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.8.2) + unicode-display_width (1.8.0) + webrick (1.8.1) + +PLATFORMS + x86_64-linux + +DEPENDENCIES + github-pages + jekyll (= 3.9.3) + jekyll-remote-theme + jemoji + tzinfo-data + webrick (~> 1.7) + +RUBY VERSION + ruby 3.2.2p53 + +BUNDLED WITH + 2.4.10 diff --git a/README.md b/README.md index 5b35dcb2..ad707b3b 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ You may build GitHub Pages sites with [Jekyll](https://jekyllrb.com/), which is You may review this repo's dev container in the [`.devcontainer`](https://github.com/devcontainers/containers.dev/tree/gh-pages/.devcontainer) folder. -It is from this [Jekyll definition](https://github.com/microsoft/vscode-dev-containers/tree/main/containers/jekyll). +It is from this [Jekyll Dev Container Template](https://github.com/devcontainers/templates/tree/main/src/jekyll). ### Steps to build and run From 495a772d80d97aa0ab655e9e0c8ec8036e585733 Mon Sep 17 00:00:00 2001 From: SeongHoon Ryu <4997174+ryush00@users.noreply.github.com> Date: Tue, 2 May 2023 00:39:40 +0900 Subject: [PATCH 092/312] Update onAutoForward description to include 'openBrowserOnce' option (#201) --- _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 0cb20e4e..7dc88362 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -108,7 +108,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 `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. `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. | | `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} From 6c4aeed6c1dbffbf1caf4947c31e715a304e7fc1 Mon Sep 17 00:00:00 2001 From: eitsupi <50911393+eitsupi@users.noreply.github.com> Date: Tue, 2 May 2023 00:51:34 +0900 Subject: [PATCH 093/312] add devcontainers-community/templates to index (#202) --- _data/collection-index.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 9fc830e5..75a128cd 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -403,3 +403,9 @@ contact: https://github.com/favalos/devcontainer-features/issues repository: https://github.com/favalos/devcontainer-features ociReference: ghcr.io/favalos/devcontainer-features +- name: Community Templates + maintainer: devcontainers-community + contact: https://github.com/devcontainers-community/templates/issues + repository: https://github.com/devcontainers-community/templates + ociReference: ghcr.io/devcontainers-community/templates + From a915473024aa30d4074df1284ab8e21c0ad1dc5a Mon Sep 17 00:00:00 2001 From: Lee-Orr Date: Thu, 4 May 2023 12:23:15 -0400 Subject: [PATCH 094/312] Update collection-index.yml (#204) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 75a128cd..d8674134 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -408,4 +408,9 @@ contact: https://github.com/devcontainers-community/templates/issues repository: https://github.com/devcontainers-community/templates ociReference: ghcr.io/devcontainers-community/templates +- name: Rusty Features + maintainer: Lee-Orr + contact: https://github.com/lee-orr/rusty-dev-containers/issues + repository: https://github.com/lee-orr/rusty-dev-containers + ociReference: ghcr.io/lee-orr/rusty-dev-containers From bc4420ad7593f70b04a36fbae4ac32f710590fe6 Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Tue, 9 May 2023 15:34:41 -0700 Subject: [PATCH 095/312] Add Feature Lifecycle Hooks (#205) * add lifecycle hooks * Update spec.md * fix hyperlinks * Update _implementors/features.md Co-authored-by: Brigit Murtaugh --------- Co-authored-by: Brigit Murtaugh --- _implementors/features.md | 38 ++++++++++++++++++++++++++++++++------ _implementors/spec.md | 10 +++++----- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/_implementors/features.md b/_implementors/features.md index 259e28b0..05ff374b 100644 --- a/_implementors/features.md +++ b/_implementors/features.md @@ -27,7 +27,9 @@ A Feature is a self contained entity in a folder with at least a `devcontainer-f ## devcontainer-feature.json properties -The `devcontainer-feature.json` file defines information about the Feature to be used by any supporting tools and the way the Feature will be executed. +The `devcontainer-feature.json` file defines metadata about a given Feature. + +All properties are optional **except for `id`, `version`, and `name`**. [devContainerFeature.schema.json](https://github.com/devcontainers/spec/blob/main/schemas/devContainerFeature.schema.json) defines the schema for the `devcontainer-feature.json` file. @@ -35,10 +37,10 @@ The properties of the file are as follows: | Property | Type | Description | | :--- | :--- | :--- | -| `id` | string | ID of the feature/definition. The `id` should be unique in the context of the repository/published package where the feature exists and must match the name of the directory where the `devcontainer-feature.json` resides. | -| `version` | string | The semantic version of the Feature. | -| `name` | string | Name of the feature/definition. | -| `description` | string | Description of the feature/definition. | +| `id` | string | Required: Identifier of the Feature. Must be unique in the context of the repository where the Feature exists and must match the name of the directory where the `devcontainer-feature.json` resides. | +| `version` | string | Required: The semantic version of the Feature (e.g: 1.0.0). | +| `name` | string | Required: A "human-friendly" display name for the Feature. | +| `description` | string | Description of the Feature. | | `documentationURL` | string | Url that points to the documentation of the Feature. | | `licenseURL` | string | Url that points to the license of the Feature. | | `keywords` | array | List of strings relevant to a user that would search for this definition/Feature. | @@ -53,9 +55,33 @@ The properties of the file are as follows: | `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. | | `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/#add-bind-mounts-or-volumes-using-the---mount-flag). The Pre-defined [devcontainerId](/_implementors/json_reference.md#variables-in-devcontainerjson) variable may be referenced in the value. For example:
`"mounts": [{ "source": "dind-var-lib-docker", "target": "/var/lib/docker", "type": "volume" }]` | +| `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/#add-bind-mounts-or-volumes-using-the---mount-flag). 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} + + +### Lifecycle Hooks + +The following lifecycle hooks may be declared as properties of `devcontainer-feature.json`. + +| Property | Type| +| :--- | :--- | +| `onCreateCommand` | [string, array, object](/implementors/json_reference#formatting-string-vs-array-properties)| +| `updateContentCommand` | [string, array, object](/implementors/json_reference#formatting-string-vs-array-properties)| +| `postCreateCommand` | [string, array, object](/implementors/json_reference#formatting-string-vs-array-properties)| +| `postStartCommand` | [string, array, object](/implementors/json_reference#formatting-string-vs-array-properties) | +| `postAttachCommand` | [string, array, object](/implementors/json_reference#formatting-string-vs-array-properties) | {: .table .table-bordered .table-responsive} +#### 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). + +For each lifecycle hook (in [Feature installation order](/implementors/features/#installation-order)), each command contributed by a Feature is executed in sequence (blocking the next command from executing). Commands provided by Features are always executed _before_ any user-provided lifecycle commands (i.e: in the `devcontainer.json`). + +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). + ### 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: diff --git a/_implementors/spec.md b/_implementors/spec.md index fc04d2fa..fb05e19f 100644 --- a/_implementors/spec.md +++ b/_implementors/spec.md @@ -72,11 +72,11 @@ To apply the metadata together with a user's devcontainer.json at runtime, the f | `securityOpt` | `string[]` | Union of all `securityOpt` arrays without duplicates. | x | x | | `entrypoint` | `string` | Collected list of all entrypoints. | | x | | `mounts` | `(string \| { type, src, dst })[]` | Collected list of all mountpoints. Conflicts: Last source wins. | x | x | -| `onCreateCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all onCreateCommands. | x | | -| `updateContentCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all updateContentCommands. | x | | -| `postCreateCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all postCreateCommands. | x | | -| `postStartCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all postStartCommands. | x | | -| `postAttachCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all postAttachCommands. | x | | +| `onCreateCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all onCreateCommands. | x | x | +| `updateContentCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all updateContentCommands. | x | x | +| `postCreateCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all postCreateCommands. | x | x | +| `postStartCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all postStartCommands. | x | x | +| `postAttachCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all postAttachCommands. | x | x | | `waitFor` | enum | Last value wins. | x | | | `customizations` | Object of tool-specific customizations. | Merging is left to the tools. | x | x | | `containerUser` | `string` | Last value wins. | x | | From c98f380d8313ce5d5a93f1430ac409e6c404c8a5 Mon Sep 17 00:00:00 2001 From: Ivan Stasiuk Date: Thu, 11 May 2023 17:13:53 +0100 Subject: [PATCH 096/312] feat: brokeyourbike features (#206) * feat: brokeyourbike features * fix: repository link --- _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 d8674134..0d090515 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -413,4 +413,8 @@ contact: https://github.com/lee-orr/rusty-dev-containers/issues repository: https://github.com/lee-orr/rusty-dev-containers ociReference: ghcr.io/lee-orr/rusty-dev-containers - +- name: Assorted Features + maintainer: brokeyourbike + contact: https://github.com/brokeyourbike/devcontainer-features/issues + repository: https://github.com/brokeyourbike/devcontainer-features + ociReference: ghcr.io/brokeyourbike/devcontainer-features From 57f76b9c6e77cc4338b1e5538bd4f006991f8ff3 Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Fri, 12 May 2023 11:23:12 -0700 Subject: [PATCH 097/312] Update json_reference.md (#207) --- _implementors/json_reference.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_implementors/json_reference.md b/_implementors/json_reference.md index 7dc88362..ad888891 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -18,9 +18,9 @@ Metadata properties marked with a 🏷️️ can be stored in the `devcontainer. | `forwardPorts` 🏷️ | array | An array of port numbers or `"host:port"` values (e.g. `[3000, "db:5432"]`) that should always be forwarded from inside the primary container to the local machine (including on the web). The property is most useful for forwarding ports that cannot be auto-forwarded because the related process that starts before the `devcontainer.json` supporting service / tool connects or for forwarding a service not in the primary container in Docker Compose scenarios (e.g. `"db:5432"`). Defaults to `[]`. | | `portsAttributes` 🏷️ | object | Object that maps a port number, `"host:port"` value, range, or regular expression to a set of default options. See [port attributes](#port-attributes) for available options. For example:
`"portsAttributes": {"3000": {"label": "Application port"}}` | | `otherPortsAttributes` 🏷️ | object | Default options for ports, port ranges, and hosts that aren't configured using `portsAttributes`. See [port attributes](#port-attributes) for available options. For example:
`"otherPortsAttributes": {"onAutoForward": "silent"}` | -| `remoteEnv` 🏷️ | object | A set of name-value pairs that sets or overrides environment variables for the `devcontainer.json` supporting service / tool (or sub-processes like terminals) but not the container as a whole. Environment and [pre-defined variables](#variables-in-devcontainerjson) may be referenced in the values. | +| `containerEnv` 🏷️ | object | A set of name-value pairs that sets or overrides environment variables for the container. Environment and [pre-defined variables](#variables-in-devcontainerjson) may be referenced in the values. For example:
`"containerEnv": { "MY_VARIABLE": "${localEnv:MY_VARIABLE}" }`
If you want to reference an existing container variable while setting this one (like updating the `PATH`), use `remoteEnv` instead.
`containerEnv` will set the variable on the Docker container itself, so all processes spawned in the container will have access to it. But it will also be static for the life of the container - you must rebuild the container to update the value.
We recommend using `containerEnv` (over `remoteEnv`) as much as possible since it allows all processes to see the variable and isn't client-specific. | +| `remoteEnv` 🏷️ | object | A set of name-value pairs that sets or overrides environment variables for the `devcontainer.json` supporting service / tool (or sub-processes like terminals) but not the container as a whole. Environment and [pre-defined variables](#variables-in-devcontainerjson) may be referenced in the values.
You may want to use `remoteEnv` (over `containerEnv`) if the value isn't static since you can update its value without having to rebuild the full container. | | `remoteUser` 🏷️ | string | Overrides the user that `devcontainer.json` supporting services tools / runs as in the container (along with sub-processes like terminals, tasks, or debugging). Does not change the user the container as a whole runs as which can be set using `containerUser`. Defaults to the user the container as a whole is running as (often `root`).
You may learn more in the [remoteUser section below](#remoteUser). | -| `containerEnv` 🏷️ | object | A set of name-value pairs that sets or overrides environment variables for the container. Environment and [pre-defined variables](#variables-in-devcontainerjson) may be referenced in the values. For example:
`"containerEnv": { "MY_VARIABLE": "${localEnv:MY_VARIABLE}" }`
If you want to reference an existing container variable while setting this one (like updating the `PATH`), use `remoteEnv` instead. | | `containerUser` 🏷️ | string | Overrides the user for all operations run as inside the container. Defaults to either `root` or the last `USER` instruction in the related Dockerfile used to create the image. If you want any connected tools or related processes to use a different user than the one for the container, see `remoteUser`. | | `updateRemoteUserUID` 🏷️ | boolean | On Linux, if `containerUser` or `remoteUser` is specified, the user's UID/GID will be updated to match the local user's UID/GID to avoid permission problems with bind mounts. Defaults to `true`. | | `userEnvProbe` 🏷️ | enum | Indicates the type of shell to use to "probe" for user environment variables to include in `devcontainer.json` supporting services' / tools' processes: `none`, `interactiveShell`, `loginShell`, or `loginInteractiveShell` (default). The specific shell used is based on the default shell for the user (typically bash). For example, bash interactive shells will typically include variables set in `/etc/bash.bashrc` and `~/.bashrc` while login shells usually include variables from `/etc/profile` and `~/.profile`. Setting this property to `loginInteractiveShell` will get variables from all four files. | From bce63d0ac7c55245c54ec773b1a00dab83a9b04b Mon Sep 17 00:00:00 2001 From: Ivan Stasiuk Date: Mon, 15 May 2023 17:43:14 +0100 Subject: [PATCH 098/312] chore: mainterner name (#208) --- _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 0d090515..f256b3ff 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -414,7 +414,7 @@ repository: https://github.com/lee-orr/rusty-dev-containers ociReference: ghcr.io/lee-orr/rusty-dev-containers - name: Assorted Features - maintainer: brokeyourbike + maintainer: Ivan Stasiuk contact: https://github.com/brokeyourbike/devcontainer-features/issues repository: https://github.com/brokeyourbike/devcontainer-features ociReference: ghcr.io/brokeyourbike/devcontainer-features From 938f6f4453353515b96af5eaad34f9a67fe4b2b5 Mon Sep 17 00:00:00 2001 From: infu Date: Wed, 24 May 2023 19:53:07 +0200 Subject: [PATCH 099/312] Update collection-index.yml (#216) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index f256b3ff..a30b2870 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -418,3 +418,8 @@ contact: https://github.com/brokeyourbike/devcontainer-features/issues repository: https://github.com/brokeyourbike/devcontainer-features ociReference: ghcr.io/brokeyourbike/devcontainer-features +- name: Internet Computer Templates + maintainer: VVV Interactive | Internet Base + contact: https://github.com/vvv-interactive/ibdev/issues + repository: https://github.com/vvv-interactive/ibdev + ociReference: ghcr.io/vvv-interactive/ibdev From 5f5a74c82116f1047a80fadd794213bf969cfafe Mon Sep 17 00:00:00 2001 From: Joshua Ji Date: Tue, 30 May 2023 12:54:55 -0600 Subject: [PATCH 100/312] Update collection-index.yml (#219) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index a30b2870..f5e3d228 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -423,3 +423,8 @@ contact: https://github.com/vvv-interactive/ibdev/issues repository: https://github.com/vvv-interactive/ibdev ociReference: ghcr.io/vvv-interactive/ibdev +- name: Features by joshuanianji + maintainer: Joshua Ji + contact: https://github.com/joshuanianji/devcontainer-features/issues + repository: https://github.com/joshuanianji/devcontainer-features + ociReference: ghcr.io/joshuanianji/devcontainer-features \ No newline at end of file From eb3eb5ea8515abe418c3fd859bd0aaa579f79f0c Mon Sep 17 00:00:00 2001 From: Nikita Kurpas Date: Thu, 1 Jun 2023 00:45:29 +0900 Subject: [PATCH 101/312] Add NikitaKurpas/features (#218) * Update collection-index.yml Add NikitaKurpas/features * Make ociReference lower case 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 f5e3d228..ea8c06fd 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -423,8 +423,13 @@ contact: https://github.com/vvv-interactive/ibdev/issues repository: https://github.com/vvv-interactive/ibdev ociReference: ghcr.io/vvv-interactive/ibdev +- name: Features by Nikita Kurpas + maintainer: Nikita Kurpas + contact: https://github.com/NikitaKurpas/features/issues + repository: https://github.com/NikitaKurpas/features + ociReference: ghcr.io/nikitakurpas/features - name: Features by joshuanianji maintainer: Joshua Ji contact: https://github.com/joshuanianji/devcontainer-features/issues repository: https://github.com/joshuanianji/devcontainer-features - ociReference: ghcr.io/joshuanianji/devcontainer-features \ No newline at end of file + ociReference: ghcr.io/joshuanianji/devcontainer-features From 011d79a263f470f50818776d1c35c3bd4a02a65f Mon Sep 17 00:00:00 2001 From: Thanan Traiongthawon <95660+nullcoder@users.noreply.github.com> Date: Thu, 1 Jun 2023 08:14:02 -0700 Subject: [PATCH 102/312] Add `nullcoder/devcontainer-features` repo. (#220) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index ea8c06fd..e2c9cec1 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -433,3 +433,8 @@ contact: https://github.com/joshuanianji/devcontainer-features/issues repository: https://github.com/joshuanianji/devcontainer-features ociReference: ghcr.io/joshuanianji/devcontainer-features +- name: Features by nullcoder + maintainer: Thanan Traiongthawon + contact: https://github.com/nullcoder/devcontainer-features/issues + repository: https://github.com/nullcoder/devcontainer-features + ociReference: ghcr.io/nullcoder/devcontainer-features From 1ec83a2bb6d522fac973575727091c095d57551d Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Tue, 6 Jun 2023 13:21:57 -0700 Subject: [PATCH 103/312] Add tool (#221) --- supporting.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/supporting.md b/supporting.md index 6d0ac8dd..8951538c 100644 --- a/supporting.md +++ b/supporting.md @@ -147,6 +147,10 @@ Some properties may apply differently to Codespaces. | `hostRequirements` | object | Codespaces reads this property from devcontainer.json, not image metadata. | {: .table .table-bordered .table-responsive} +### 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. + ### Schema You can explore the [VS Code implementation](implementors/json_schema) of the dev container schema. From 6208ad03a4b05bf049936f087bdd35193474fa18 Mon Sep 17 00:00:00 2001 From: Jerred Shepherd Date: Mon, 12 Jun 2023 11:23:27 -0700 Subject: [PATCH 104/312] Update collection-index.yml (#222) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index e2c9cec1..16ac6745 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -438,3 +438,8 @@ contact: https://github.com/nullcoder/devcontainer-features/issues repository: https://github.com/nullcoder/devcontainer-features ociReference: ghcr.io/nullcoder/devcontainer-features +- name: Features by shepherdjerred + maintainer: Jerred Shepherd + contact: https://github.com/shepherdjerred/devcontainers-features/issues + repository: https://github.com/shepherdjerred/devcontainers-features + ociReference: ghcr.io/shepherdjerred/devcontainers-features From d0f264f4a5810e1d742f519629dd93646b87ea8a Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Tue, 13 Jun 2023 14:40:23 -0700 Subject: [PATCH 105/312] Add domain name section (#223) * Add domain section * Add descriptions, registries * Add acr --------- Co-authored-by: bamurtaugh --- _implementors/reference.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/_implementors/reference.md b/_implementors/reference.md index 9442ca36..3c43c914 100644 --- a/_implementors/reference.md +++ b/_implementors/reference.md @@ -135,3 +135,10 @@ LABEL devcontainer.metadata='[{ \ ``` See the [Dev Container metadata reference](../json_reference) for information on which properties are supported. + +### 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: + +* `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 From 8306b24edbc687cd84dfbec76ee06a88964fb203 Mon Sep 17 00:00:00 2001 From: jayree Date: Wed, 14 Jun 2023 02:25:29 +0200 Subject: [PATCH 106/312] Update collection-index.yml (#224) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 16ac6745..9400afbf 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -443,3 +443,8 @@ contact: https://github.com/shepherdjerred/devcontainers-features/issues repository: https://github.com/shepherdjerred/devcontainers-features ociReference: ghcr.io/shepherdjerred/devcontainers-features +- name: Features by jayree + maintainer: jayree + contact: https://github.com/jayree/devcontainer-features/issues + repository: https://github.com/jayree/devcontainer-features + ociReference: ghcr.io/jayree/devcontainer-features From 324d488c22056e0e4e23247ec1604e12e0b280c6 Mon Sep 17 00:00:00 2001 From: Dov Benyomin Sohacheski Date: Thu, 15 Jun 2023 19:48:55 +0300 Subject: [PATCH 107/312] Update collection-index.yml (#227) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 9400afbf..7c8391e1 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -448,3 +448,8 @@ contact: https://github.com/jayree/devcontainer-features/issues repository: https://github.com/jayree/devcontainer-features ociReference: ghcr.io/jayree/devcontainer-features +- name: Features by bdsoha + maintainer: bdsoha + contact: https://github.com/bdsoha/devcontainers/issues + repository: https://github.com/bdsoha/devcontainers + ociReference: ghcr.io/bdsoha/devcontainers From 2575923a389652b39e9b436f1063f12e87589115 Mon Sep 17 00:00:00 2001 From: Samruddhi Khandale Date: Tue, 20 Jun 2023 10:13:22 -0700 Subject: [PATCH 108/312] Fixes broken link for docker mounts (#225) --- _implementors/features.md | 2 +- _implementors/json_reference.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/_implementors/features.md b/_implementors/features.md index 05ff374b..e7b62174 100644 --- a/_implementors/features.md +++ b/_implementors/features.md @@ -55,7 +55,7 @@ The properties of the file are as follows: | `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. | | `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/#add-bind-mounts-or-volumes-using-the---mount-flag). 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" }]` | +| `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} diff --git a/_implementors/json_reference.md b/_implementors/json_reference.md index ad888891..9bb6c98e 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -30,7 +30,7 @@ Metadata properties marked with a 🏷️️ can be stored in the `devcontainer. | `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. | | `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/#add-bind-mounts-or-volumes-using-the---mount-flag). 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" }]` | +| `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) | @@ -51,7 +51,7 @@ The focus of `devcontainer.json` is to describe how to enrich a container for th | `build.target` | string | A string that specifies a [Docker image build target](https://docs.docker.com/engine/reference/commandline/build/#specifying-target-build-stage---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. | -| `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/#add-bind-mounts-or-volumes-using-the---mount-flag). 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"` | +| `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" ]` . | {: .table .table-bordered .table-responsive} From a9fc47ffc6eb78f1a1e6fc2f3faad43d56aa8158 Mon Sep 17 00:00:00 2001 From: jayree Date: Tue, 20 Jun 2023 19:18:07 +0200 Subject: [PATCH 109/312] Update collection-index.yml (#230) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 7c8391e1..04d6ac3c 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -448,6 +448,11 @@ contact: https://github.com/jayree/devcontainer-features/issues repository: https://github.com/jayree/devcontainer-features ociReference: ghcr.io/jayree/devcontainer-features +- name: Templates by jayree + maintainer: jayree + contact: https://github.com/jayree/devcontainer-templates/issues + repository: https://github.com/jayree/devcontainer-templates + ociReference: ghcr.io/jayree/devcontainer-templates - name: Features by bdsoha maintainer: bdsoha contact: https://github.com/bdsoha/devcontainers/issues From 64d030769319d5a120091050252f9014d8e7e358 Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Tue, 20 Jun 2023 10:35:16 -0700 Subject: [PATCH 110/312] Clarify devcontainer depth (#229) --- _implementors/spec.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_implementors/spec.md b/_implementors/spec.md index fb05e19f..4a61ef2c 100644 --- a/_implementors/spec.md +++ b/_implementors/spec.md @@ -26,7 +26,7 @@ While the structure of this metadata is critical, it is also important to call o - .devcontainer/devcontainer.json - .devcontainer.json -- .devcontainer/**/devcontainer.json (where ** is a sub-folder) +- .devcontainer//devcontainer.json (where is a sub-folder, one level deep) It is valid that these files may exist in more than one location, so consider providing a mechanism for users to select one when appropriate. From ae2460661402d89f0e7388407968402670ffd99e Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Fri, 23 Jun 2023 09:05:39 -0700 Subject: [PATCH 111/312] Guide: Authoring Features - Best Practices (#228) * initial scaffolding * adding to PATH * more sections * remove hash from link * Apply suggestions from code review Co-authored-by: Brigit Murtaugh * change wording * alpine example * more details in all the sections * proofread * add a link * Update _posts/2023-06-14-feature-authoring-best-practices.md Co-authored-by: Samruddhi Khandale * chrmarti suggestions --------- Co-authored-by: Brigit Murtaugh Co-authored-by: Samruddhi Khandale --- ...-06-14-feature-authoring-best-practices.md | 160 ++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 _posts/2023-06-14-feature-authoring-best-practices.md diff --git a/_posts/2023-06-14-feature-authoring-best-practices.md b/_posts/2023-06-14-feature-authoring-best-practices.md new file mode 100644 index 00000000..2bf5a1cd --- /dev/null +++ b/_posts/2023-06-14-feature-authoring-best-practices.md @@ -0,0 +1,160 @@ +--- +layout: post +title: "Best Practices: Authoring a Dev Container Feature" +author: "@joshspicer" +authorUrl: https://github.com/joshspicer +--- + +Last November I wrote about the basics around [authoring a Dev Container Feature](/guide/author-a-feature). Since then, [hundreds](https://containers.dev/features) of Features have been written by the community. The flexibility of Features has enabled a wide variety of use cases, from installing a single tool to setting up specific aspects of a project's development environment that can be shared across repositories. To that effect, many different patterns for Feature authorship have emerged, and the core team has learned a lot about what works well and what doesn't. + +## Utilize the `test` command + +Bundled with the [devcontainer cli](https://github.com/devcontainers/cli) is the `devcontainer features test` command. This command is designed to help Feature authors test their Feature in a variety of scenarios. It is highly recommended that Feature authors use this command to test their Feature before publishing. Some documentation on the `test` command can be found [here](https://github.com/devcontainers/cli/blob/main/docs/features/test.md), and an example can be found in the [Feature quick start repo](https://github.com/devcontainers/feature-starter). This repo is updated periodically as new functionality is added to the reference implementation. + +## Feature idempotency + +The most useful Features are idempotent. This means that if a Feature is installed multiple times with different options (something that will come into play with [Feature Dependencies](https://github.com/devcontainers/spec/blob/main/proposals/feature-dependencies.md)), the Feature should be able to handle this gracefully. This is especially important for option-rich Features that you anticipate others may depend on in the future. + +> 🔧 There is an open spec proposal for installing the same Feature twice in a given `devcontainer.json` [(devcontainers/spec#44)](https://github.com/devcontainers/spec/issues/44). While the syntax to do so in a given `devcontainer.json` is not yet defined, Feature dependencies will effectively allow for this. + +For Features that install a versioned tool (eg: version x of `go` and version y of `ruby` ), a robust Feature should be able to install multiple versions of the tool. If your tool has a version manager (java's `SDKMAN`, ruby's `rvm`) it is usually as simple as installing the version manager and then running a command to install the desired version of that tool. + +For instances where there isn't an existing version manager available, a well-designed Feature should consider installing distict versions of itself to a well known location. A pattern that many Features utilize successfully is writing each version of each tool to a central folder and symlinking the "active" version to a folder on the PATH. + +Features can redefine the PATH variable with `containerEnv`, like so: + +```bash +# devcontainer-feature.json +"containerEnv": { + "PATH": "/usr/local/myTool/bin:${PATH}" +} +``` + +> 🔧 A spec proposal is open for simplifying the process of adding a path to the $PATH variable: [(devcontainers/spec#251)](https://github.com/devcontainers/spec/issues/251). + +To make testing for idempotency easy, [this change to the reference implementation](https://github.com/devcontainers/cli/pull/553) introduces a new mode to the `devcontainer features test` command that will attempt to install a Feature multiple times. This is useful for testing that a Feature is idempotent, and also for testing that a Feature is able to logically "juggle" multiple versions of a tool. + +## Writing your install script + + +> 🔧 Many of the suggestions in this section may benefit from the [Feature library/code reuse proposal](https://github.com/devcontainers/spec/blob/main/proposals/features-library.md). + +This section includes some tips for the contents of the `install.sh` entrypoint script. + +### Detect Platform/OS + +> 🔧 A spec proposal is open for detecting the platform/OS and providing better warnings [(devcontainers/spec#58)](https://github.com/devcontainers/spec/issues/58). + +Features are often designed to work on a subset of possible base images. For example, the majority of Features in the [`devcontainers/features`](https://github.com/devcontainers/features) repo are designed to work broadly with debian-derived images. The limitation is often simply due to the wide array of base images available, and the fact that many Features will use an OS-specific package manager. To make it easy for users to understand which base images a Feature is designed to work with, it is recommended that Features include a check for the OS and provide a helpful error message if the OS is not supported. + +One possible way to implement this check is shown below. + +```bash +# Source /etc/os-release to get OS info +# Looks something like: +# PRETTY_NAME="Debian GNU/Linux 11 (bullseye)" +# NAME="Debian GNU/Linux" +# VERSION_ID="11" +# VERSION="11 (bullseye)" +# VERSION_CODENAME=bullseye +# ID=debian +# HOME_URL="https://www.debian.org/" +# SUPPORT_URL="https://www.debian.org/support" +# BUG_REPORT_URL="https://bugs.debian.org/" +. /etc/os-release +# Store host architecture +architecture="$(dpkg --print-architecture)" + +DOCKER_MOBY_ARCHIVE_VERSION_CODENAMES="buster bullseye focal bionic xenial" +if [[ "${DOCKER_MOBY_ARCHIVE_VERSION_CODENAMES}" != *"${VERSION_CODENAME}"* ]]; then + print_error "Unsupported distribution version '${VERSION_CODENAME}'. To resolve, either: (1) set feature option '\"moby\": false' , or (2) choose a compatible OS distribution" + print_error "Supported distributions include: ${DOCKER_MOBY_ARCHIVE_VERSION_CODENAMES}" + exit 1 +fi +``` + +If you are targeting distros that may not have your desired scripting language installed (eg: `bash` is often not installed on `alpine` images), you can either use plain `/bin/sh` - which is available virtually everywhere - or you can verify (and install) the scripting language in a small bootstrap script as shown below. + +```sh +#!/bin/sh + +# ... +# ... + +if [ "$(id -u)" -ne 0 ]; then + echo -e 'Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.' + exit 1 +fi + +# If we're using Alpine, install bash before executing +. /etc/os-release +if [ "${ID}" = "alpine" ]; then + apk add --no-cache bash +fi + +exec /bin/bash "$(dirname $0)/main.sh" "$@" +exit $? +``` + +Validating functionality against several base images can be done by using the `devcontainer features test` command with the `--base-image` flag, or with a [scenario](https://github.com/devcontainers/cli/blob/main/docs/features/test.md#scenarios). For example, one could add a [workflow like this to their repo](https://github.com/devcontainers/features/blob/d934503a050ba84e6b42a006aacd891c4088eb62/.github/workflows/test-all.yaml#L9-L52). + +```yaml +name: "Test Features matrixed with a set of base images" +on: + push: + branches: + - main + workflow_dispatch: + +jobs: + test: + runs-on: ubuntu-latest + continue-on-error: true + strategy: + matrix: + features: [ + "anaconda", + "aws-cli", + "azure-cli", + # ... + ] + baseImage: + [ + "ubuntu:bionic", + "ubuntu:focal", + "ubuntu:jammy", + "debian:11", + "debian:12", + "mcr.microsoft.com/devcontainers/base:ubuntu", + "mcr.microsoft.com/devcontainers/base:debian", + ] + steps: + - uses: actions/checkout@v3 + + - name: "Install latest devcontainer CLI" + run: npm install -g @devcontainers/cli + {% raw %} + - name: "Generating tests for '${{ matrix.features }}' against '${{ matrix.baseImage }}'" + run: devcontainer features test --skip-scenarios -f ${{ matrix.features }} -i ${{ matrix.baseImage }} + {% endraw %} +``` + +### Detect the non-root user + +Feature installation scripts are run as `root`. In contrast, many dev containers have a `remoteUser` set (either implicitly through [image metadata](https://containers.dev/implementors/spec/#image-metadata) or directly in the `devcontainer.json`). In a Feature's installation script, one should be mindful of the final user and account for instances where the user is not `root`. + +Feature authors should take advantage of the [`_REMOTE_USER` and similar variables](https://containers.dev/implementors/features/#user-env-var) injected during the build. + +```bash +# Install tool in effective remoteUser's bin folder +mkdir -p "$_REMOTE_USER_HOME/bin" +curl $TOOL_DOWNLOAD_LINK -o "$_REMOTE_USER_HOME/bin/$TOOL" +chown $_REMOTE_USER:$_REMOTE_USER "$_REMOTE_USER_HOME/bin/$TOOL" +chmod 755 "$_REMOTE_USER_HOME/bin/$TOOL" +``` + +### Implement redundant paths/strategies + +Most Features in [the index today](https://containers.dev/features) have some external/upstream dependency. Very often these upstream dependencies can change (ie: versioning pattern, rotated GPG key, etc...) that may cause a Feature to fail to install. To mitigate this, one strategy is to implement multiple paths to install a given tool (if available). For example, a Feature that installs `go` might try to install it from the upstream package manager, and if not fall back to a GitHub release. + +Writing several [scenario tests](https://github.com/devcontainers/cli/blob/main/docs/features/test.md#scenarios) that force the Feature to go down distinct installation paths will help you catch cases where a given path no longer works. \ No newline at end of file From 4b6f855e772e8e6cfa4fc5fc38460e01fb01443a Mon Sep 17 00:00:00 2001 From: Nishant Date: Mon, 26 Jun 2023 13:44:07 -0400 Subject: [PATCH 112/312] updated dev container schema URL (#240) * updated dev container schema url * updated wordings --- _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 9bb6c98e..f33673d2 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -174,7 +174,7 @@ Variables can be referenced in certain string values in `devcontainer.json` in t ## Schema -You can see the VS Code implementation of the dev container schema [here](https://github.com/microsoft/vscode/blob/main/extensions/configuration-editing/schemas/devContainer.schema.src.json). +You can see the dev container schema [here](https://github.com/devcontainers/spec/blob/main/schemas/devContainer.base.schema.json). ## Publishing vs forwarding ports From 3ff8b4f9dd6472f572cd283e72c81cac2fb44b01 Mon Sep 17 00:00:00 2001 From: Nafnix <75488773+nafnix@users.noreply.github.com> Date: Thu, 29 Jun 2023 00:15:38 +0800 Subject: [PATCH 113/312] Update collection-index.yml (#246) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 04d6ac3c..a0a9c982 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -458,3 +458,8 @@ contact: https://github.com/bdsoha/devcontainers/issues repository: https://github.com/bdsoha/devcontainers ociReference: ghcr.io/bdsoha/devcontainers +- name: Python3 with Pyenv and PDM + maintainer: Nafnix + contact: https://github.com/nafnix/devcontainers-templates/issues + repository: https://github.com/nafnix/devcontainers-templates + ociReference: ghcr.io/nafnix/devcontainers-templates From 00f17599171da1135e588a52e3f0c7c17db03c44 Mon Sep 17 00:00:00 2001 From: Josh Spicer Date: Thu, 29 Jun 2023 10:18:40 -0700 Subject: [PATCH 114/312] Update spec.md (#247) --- _implementors/spec.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_implementors/spec.md b/_implementors/spec.md index 4a61ef2c..86d1303e 100644 --- a/_implementors/spec.md +++ b/_implementors/spec.md @@ -63,7 +63,7 @@ The metadata is added to the image as a `devcontainer.metadata` label with a JSO 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 | Feature Metadata | +| Property | Type/Format | Merge Logic | devcontainer.json | devcontainer-feature.json | | -------- | ----------- | ----------- | :---------------: | :--------------: | | `id` | E.g., `ghcr.io/devcontainers/features/node:1` | Not merged. | | x | | `init` | `boolean` | `true` if at least one is `true`, `false` otherwise. | x | x | From 3c5bb903c4d31b63cbc488150c966bab2eadad96 Mon Sep 17 00:00:00 2001 From: "Soojin (Min) Choi" Date: Fri, 30 Jun 2023 09:06:46 -0700 Subject: [PATCH 115/312] add datascience-py-r template (#248) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index a0a9c982..ab4d0444 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -463,3 +463,8 @@ contact: https://github.com/nafnix/devcontainers-templates/issues repository: https://github.com/nafnix/devcontainers-templates ociReference: ghcr.io/nafnix/devcontainers-templates +- name: Data science with Python and R + maintainer: VS Code Data Science + contact: https://github.com/microsoft/datascience-py-r/issues + repository: https://github.com/microsoft/datascience-py-r + ociReference: ghcr.io/microsoft/datascience-py-r From 76b1f5d8e5cb9a5bed70c869757415d647a720d0 Mon Sep 17 00:00:00 2001 From: Samruddhi Khandale Date: Fri, 30 Jun 2023 14:23:36 -0700 Subject: [PATCH 116/312] Adds support for RSS feeds by adding "jekyll-feed" plugin (#245) * Adds support for RSS feeds by adding "jekyll-feed" plugin * adds gem to gemfile --- Gemfile | 1 + Gemfile.lock | 1 + _config.yml | 1 + 3 files changed, 3 insertions(+) diff --git a/Gemfile b/Gemfile index 6809aa94..84cb538e 100644 --- a/Gemfile +++ b/Gemfile @@ -11,6 +11,7 @@ group :jekyll_plugins do gem "jemoji" gem "github-pages" gem "jekyll-remote-theme" + gem "jekyll-feed" end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem diff --git a/Gemfile.lock b/Gemfile.lock index 7e8d347f..248f6025 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -255,6 +255,7 @@ PLATFORMS DEPENDENCIES github-pages jekyll (= 3.9.3) + jekyll-feed jekyll-remote-theme jemoji tzinfo-data diff --git a/_config.yml b/_config.yml index ea6505ee..f8cf0b94 100644 --- a/_config.yml +++ b/_config.yml @@ -16,6 +16,7 @@ highlighter: rouge plugins: - github-pages - jemoji + - jekyll-feed exclude: From 3a340d21b79d024ebfb315fc81567d0a1e1b3e7e Mon Sep 17 00:00:00 2001 From: Tom Harvey Date: Mon, 3 Jul 2023 21:48:57 +0200 Subject: [PATCH 117/312] Adding features by tomharvey with AWS SSO Util (#250) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index ab4d0444..02cdc685 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -468,3 +468,8 @@ contact: https://github.com/microsoft/datascience-py-r/issues repository: https://github.com/microsoft/datascience-py-r ociReference: ghcr.io/microsoft/datascience-py-r +- name: Features by tomharvey + maintainer: Tom Harvey + contact: https://github.com/tomharvey/devcontainer-features/issues + repository: https://github.com/tomharvey/devcontainer-features + ociReference: ghcr.io/tomharvey/devcontainer-features From ec11e4b53bf58c2ac9c539d7bedf8103c931dd4b Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Fri, 7 Jul 2023 08:34:48 -0700 Subject: [PATCH 118/312] Add tools note (#251) Co-authored-by: bamurtaugh --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 5c901c91..ba5eaa3f 100644 --- a/index.html +++ b/index.html @@ -27,7 +27,7 @@

Development Containers

From 44bb154e79edc759ad4434bb2ec26914ee1ce15b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niko=20B=C3=B6ckerman?= Date: Tue, 5 Sep 2023 18:54:19 +0300 Subject: [PATCH 140/312] Fix anchors in links to Docker CLI build page (#282) Anchors used to reference specific parts in https://docs.docker.com/engine/reference/commandline/build/ no longer exist. This commit fixes the links to reference existing anchors. --- _implementors/json_reference.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_implementors/json_reference.md b/_implementors/json_reference.md index ef2c1919..5ed1398a 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -47,8 +47,8 @@ The focus of `devcontainer.json` is to describe how to enrich a container for th | `image` | string | **Required** when using an image. The name of an image in a container registry ([DockerHub](https://hub.docker.com), [GitHub Container Registry](https://docs.github.com/packages/guides/about-github-container-registry), [Azure Container Registry](https://azure.microsoft.com/services/container-registry/)) that `devcontainer.json` supporting services / tools should use to create the dev container. | | `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/#set-build-time-variables---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.target` | string | A string that specifies a [Docker image build target](https://docs.docker.com/engine/reference/commandline/build/#specifying-target-build-stage---target) that should be passed when building a Dockerfile. Defaults to not set. For example: `"build": { "target": "development" }` | +| `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.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. | | `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"` | From aa4528031bad44571f101803c32ca5d2f0f96b70 Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Tue, 5 Sep 2023 09:43:33 -0700 Subject: [PATCH 141/312] Add a guide on prebuilds (#277) * Scaffold post, enable multiple authors * Add initial content * Guide content updates * Feedback * Content and wording * fix displaying author(s) * Typo * Link between guides * Feedback * Typo --------- Co-authored-by: bamurtaugh Co-authored-by: Josh Spicer --- _layouts/post.html | 10 +- _posts/2022-11-01-author-a-feature.md | 6 +- _posts/2022-12-16-dockerfile.md | 10 +- _posts/2023-02-15-gitlab-ci.md | 6 +- ...-06-14-feature-authoring-best-practices.md | 6 +- _posts/2023-08-22-prebuild.md | 138 ++++++++++++++++++ 6 files changed, 164 insertions(+), 12 deletions(-) create mode 100644 _posts/2023-08-22-prebuild.md diff --git a/_layouts/post.html b/_layouts/post.html index 3bf16631..06a0a3dd 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -2,7 +2,13 @@ layout: singlePage ---
-

{{ page.date | date_to_string }} - {{ page.author }}

+

{{ page.date | date_to_string }} - + {% assign i = 0 %} + {% for a in page.author %} + {{ page.author[i] }} + {% assign i = i | plus:1 %} + {% endfor %} +

{{ content }} -
\ No newline at end of file + diff --git a/_posts/2022-11-01-author-a-feature.md b/_posts/2022-11-01-author-a-feature.md index 8f72734a..ab7a0139 100644 --- a/_posts/2022-11-01-author-a-feature.md +++ b/_posts/2022-11-01-author-a-feature.md @@ -1,8 +1,10 @@ --- layout: post title: "Authoring a Dev Container Feature" -author: "@joshspicer" -authorUrl: https://github.com/joshspicer +author: + - "@joshspicer" +authorUrl: + - https://github.com/joshspicer --- Development container ["Features"](/features) are self-contained, shareable units of installation code and development container configuration. We [define a pattern](/implementors/features-distribution) for authoring and self-publishing Features. diff --git a/_posts/2022-12-16-dockerfile.md b/_posts/2022-12-16-dockerfile.md index 14f8c6b0..f6e8cc1d 100644 --- a/_posts/2022-12-16-dockerfile.md +++ b/_posts/2022-12-16-dockerfile.md @@ -1,8 +1,10 @@ --- layout: post title: "Using Images, Dockerfiles, and Docker Compose" -author: "@chuxel" -authorUrl: https://github.com/chuxel +author: + - "@chuxel" +authorUrl: + - https://github.com/chuxel --- When creating a development container, you have a variety of different ways to customize your environment like ["Features"](/features) or [lifecycle scripts](/implementors/json_reference/#lifecycle-scripts). However, if you are familiar with containers, you may want to use a [Dockerfile](/guide/dockerfile#dockerfile) or [Docker Compose / Compose](/guide/dockerfile#docker-compose) to customize your environment. This article will walk through how to use these formats with the Dev Container spec. @@ -44,7 +46,7 @@ That's it! When you start up your Dev Container, the Dockerfile will be automati Better yet, you can can use a Dockerfile as a part of authoring an image you can share with others. You can even **add Dev Container settings and metadata right into the image itself**. This avoids having to duplicate config and settings in multiple devcontainer.json files and keeps them in sync with your images! -See the reference on **[pre-building](/implementors/reference/#prebuilding)** to learn more! +See the guide on **[pre-building](/_posts/2023-08-22-prebuild.md)** to learn more! ## Using Docker Compose @@ -140,4 +142,4 @@ volumes: Finally, as in the Dockerfile example, you can use this same setup to create a Dev Container image that you can share with others. You can also add Dev Container settings and metadata right into the image itself. -See the reference on **[pre-building](/implementors/reference/#prebuilding)** to learn more! \ No newline at end of file +See the guide on **[pre-building](/_posts/2023-08-22-prebuild.md)** to learn more! diff --git a/_posts/2023-02-15-gitlab-ci.md b/_posts/2023-02-15-gitlab-ci.md index 85104558..63d3b5d0 100644 --- a/_posts/2023-02-15-gitlab-ci.md +++ b/_posts/2023-02-15-gitlab-ci.md @@ -1,8 +1,10 @@ --- layout: post title: "Working with GitLab CI" -author: "@raginjason" -authorUrl: https://github.com/raginjason +author: + - "@raginjason" +authorUrl: + - https://github.com/raginjason --- For simple use cases you can use your development container (dev container) for CI without much issue. Once you begin using more advanced dev container functionality such as [Features](/features), you will need dev container tooling in your CI pipeline. While GitHub CI has the [devcontainers-ci GitHub Action](https://github.com/marketplace/actions/devcontainers-ci), there is no such analog in GitLab CI. To achieve the goal of using your dev container in GitLab CI, the container must be pre-built. diff --git a/_posts/2023-06-14-feature-authoring-best-practices.md b/_posts/2023-06-14-feature-authoring-best-practices.md index 2bf5a1cd..adca4d49 100644 --- a/_posts/2023-06-14-feature-authoring-best-practices.md +++ b/_posts/2023-06-14-feature-authoring-best-practices.md @@ -1,8 +1,10 @@ --- layout: post title: "Best Practices: Authoring a Dev Container Feature" -author: "@joshspicer" -authorUrl: https://github.com/joshspicer +author: + - "@joshspicer" +authorUrl: + - https://github.com/joshspicer --- Last November I wrote about the basics around [authoring a Dev Container Feature](/guide/author-a-feature). Since then, [hundreds](https://containers.dev/features) of Features have been written by the community. The flexibility of Features has enabled a wide variety of use cases, from installing a single tool to setting up specific aspects of a project's development environment that can be shared across repositories. To that effect, many different patterns for Feature authorship have emerged, and the core team has learned a lot about what works well and what doesn't. diff --git a/_posts/2023-08-22-prebuild.md b/_posts/2023-08-22-prebuild.md new file mode 100644 index 00000000..ad7b5159 --- /dev/null +++ b/_posts/2023-08-22-prebuild.md @@ -0,0 +1,138 @@ +--- +layout: post +title: "Speed Up Your Workflow with Prebuilds" +author: + - "@bamurtaugh" + - "@craiglpeters" +authorUrl: + - "https://github.com/bamurtaugh" + - "https://github.com/craiglpeters" + +--- + +Getting dev containers up and running for your projects is exciting - you've unlocked environments that include all the dependencies your projects need to run, and you can spend so much more time on coding rather than configuration. + +Once your dev container has everything it needs, you might start thinking more about ways to optimize it. For instance, it might take a while to build. Maybe it takes 5 minutes. Maybe it takes an hour! + +You can get back to working fast and productively after that initial container build, but what if you need to work on another machine and build the container again? Or what if some of your teammates want to use the container on their machines and will need to build it too? It'd be great to make the build time faster for everyone, every time. + +After configuring your dev container, a great next step is to **prebuild your image**. + +In this guide, we'll explore what it means to prebuild an image and the benefits of doing so, such as speeding up your workflow, simplifying your environment, and pinning to specific versions of tools. + +We have a variety of tools designed to help you with prebuilds. In this guide, we'll explore two different repos as examples of how our team uses different combinations of these tools: +* The prebuilt image for the [Kubernetes repo](https://github.com/craiglpeters/kubernetes-devcontainer) developed by one of our spec maintainers [Craig](https://github.com/craiglpeters) +* The prebuilt images we host in the [devcontainers/images](https://github.com/devcontainers/images/tree/main/src) repo as part of the dev container spec + + +## What is prebuilding? + +We should first define: What is prebuilding? + +If you're already using dev containers, you're likely already familiar with the idea of building a container, where you package everything your app needs to run into a single unit. + +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. + +### Prebuilt Codespaces + +You may have heard (or will hear about) [GitHub Codespaces prebuilds](https://docs.github.com/en/codespaces/prebuilding-your-codespaces/about-github-codespaces-prebuilds). Codespaces prebuilds are similar to prebuilt container images, with some additional focus on the other code in your repo. + +GitHub Codespaces prebuilds help to speed up the creation of new codespaces for large or complex repositories. A prebuild assembles the main components of a codespace for a particular combination of repository, branch, and `devcontainer.json` file. + +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)). + +## 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): + + ```bash + npm install -g @devcontainers/cli + ``` + +* Build your image and push it to a container registry (like the [Azure Container Registry](https://learn.microsoft.com/azure/container-registry/container-registry-get-started-docker-cli?tabs=azure-cli), [GitHub Container Registry](https://docs.github.com/packages/working-with-a-github-packages-registry/working-with-the-container-registry#pushing-container-images), or [Docker Hub](https://docs.docker.com/engine/reference/commandline/push)): + + ```bash + devcontainer build --workspace-folder . --push true --image-name : + ``` + +* You can automate pre-building your image by scheduling the build using a DevOps or continuous integration (CI) service like GitHub Actions. We've created a [GitHub Action](https://github.com/marketplace/actions/devcontainers-ci) and [Azure DevOps task](https://marketplace.visualstudio.com/items?itemName=devcontainers.ci) to help with this. + +**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 + +### Prebuild Examples + +As mentioned above, let's walk through a couple examples of these steps, one using Craig's [Kubernetes repo](https://github.com/craiglpeters/kubernetes-devcontainer), and the other using our [devcontainers/images](https://github.com/devcontainers/images/tree/main/src) repo. + +**Kubernetes** +* It's a fork of the main [Kubernetes repo](https://github.com/kubernetes/kubernetes) and contributes a prebuilt dev container for use in the main Kubernetes repo or any other forks +* The dev container it's prebuilding is defined in the [.github/.devcontainer folder](https://github.com/craiglpeters/kubernetes-devcontainer/tree/master/.github/.devcontainer) +* Any time a change is made to the dev container, the repo currently uses the dev container [GitHub Action](https://github.com/craiglpeters/kubernetes-devcontainer/actions/workflows/devcontainer-build-and-push.yml) to build the image and push it to GHCR + * You can check out its latest prebuilt image in the [`Packages` tab](https://github.com/users/craiglpeters/packages/container/package/kubernetes-devcontainer) of its GitHub Repo. In this tab, you can see its GHCR URL is `ghcr.io/craiglpeters/kubernetes-devcontainer:latest` +* The main Kubernetes repo and any fork of it can now define a `.devcontainer` folder and [reference this prebuilt image](https://github.com/craiglpeters/kubernetes-devcontainer/blob/master/.devcontainer/devcontainer.json#L7) through: `"image": "ghcr.io/craiglpeters/kubernetes-devcontainer:latest"` + +**Dev container spec images** +* This repo prebuilds a variety of dev containers, each of which is defined in their individual folders in the [src folder](https://github.com/devcontainers/images/tree/main/src) + * As an example, the Python image is defined in the [src/python/.devcontainer](https://github.com/devcontainers/images/tree/main/src/python/.devcontainer) folder +* Any time a change is made to the dev container, the repo uses a [GitHub Action](https://github.com/devcontainers/images/actions/workflows/push.yml) to build the image and push it to MCR + * Using the Python image as an example again, its MCR URL is `mcr.microsoft.com/devcontainers/python` +* Any projects can now reference this prebuilt image through: `"image": "mcr.microsoft.com/devcontainers/python"` + +## Where do the dependencies come from? + +If your `devcontainer.json` is as simple as just an `image` property referencing a prebuilt image, you may wonder: How can I tell what dependencies will be installed for my project? And how can I modify them? + +Let's walk through the Kubernetes prebuild as an example of how you can determine which dependencies are installed and where: +* **Start at your end user dev container** + * We start at the [`.devcontainer/devcontainer.json`](https://github.com/craiglpeters/kubernetes-devcontainer/blob/master/.devcontainer/devcontainer.json) designed for end use in the Kubernetes repo and other forks of it + * It sets a few properties, such as `hostRequirements`, `onCreateCommand`, and `otherPortsAttributes` + * 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) +* **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 +* **Modify and rebuild as desired** + * If I'd like to add more content to my dev container, I can either modify my end user dev container (i.e. the one designed for the main Kubernetes repo), or modify the config defining the prebuilt image (i.e. the content in Craig's dev container) + * For universal changes that anyone using the prebuilt image should get, update the prebuilt image + * For more project or user specific changes (i.e. a language I need in my project but other forks won't necessarily need, or user settings I prefer for my editor environment), update the end user dev container + * Features are a great way to add dependencies in a clear, easily packaged way + +## Benefits + +There are a variety of benefits (some of which we've already explored) to creating and using prebuilt images: +* Faster container startup + * Pull an already built dev container config rather than having to build it freshly on any new machine +* Simpler configuration + * Your `devcontainer.json` can be as simple as just an `image` property +* Pin to a specific version of tools + * This can improve supply-chain security and avoid breaks + +## Tips and Tricks + +* 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 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 + * 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) + +## Feedback and Closing + +We hope this guide will help you optimize your dev container workflows! We can't wait to hear your tips, tricks, and feedback. How are you prebuilding your images? Would anything in the spec or tooling make the process easier for you? + +If you haven't already, we recommend joining our dev container [community Slack channel](https://aka.ms/dev-container-community) where you can connect with the dev container spec maintainers and community at large. If you have any feature requests or experience any issues as you use the above tools, please feel free to also open an issue in the corresponding repo in the [dev containers org](https://github.com/devcontainers) on GitHub. \ No newline at end of file From 6adf1416b156ffd001ab256aab54002af335ca1f Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Tue, 5 Sep 2023 09:58:46 -0700 Subject: [PATCH 142/312] Update 2023-08-22-prebuild.md (#284) --- _posts/2023-08-22-prebuild.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_posts/2023-08-22-prebuild.md b/_posts/2023-08-22-prebuild.md index ad7b5159..b944d163 100644 --- a/_posts/2023-08-22-prebuild.md +++ b/_posts/2023-08-22-prebuild.md @@ -62,7 +62,7 @@ We try to make prebuilding an image and using a prebuilt image as easy as possib devcontainer build --workspace-folder . --push true --image-name : ``` -* You can automate pre-building your image by scheduling the build using a DevOps or continuous integration (CI) service like GitHub Actions. We've created a [GitHub Action](https://github.com/marketplace/actions/devcontainers-ci) and [Azure DevOps task](https://marketplace.visualstudio.com/items?itemName=devcontainers.ci) to help with this. +* You can automate pre-building your image by scheduling the build using a DevOps or continuous integration (CI) service like GitHub Actions. We've created a [GitHub Action](https://github.com/marketplace/actions/dev-container-build-and-run-action) and [Azure DevOps task](https://marketplace.visualstudio.com/items?itemName=devcontainers.ci) to help with this. **Using a prebuilt image:** * Determine the published URL of the prebuilt image you want to use @@ -135,4 +135,4 @@ There are a variety of benefits (some of which we've already explored) to creati We hope this guide will help you optimize your dev container workflows! We can't wait to hear your tips, tricks, and feedback. How are you prebuilding your images? Would anything in the spec or tooling make the process easier for you? -If you haven't already, we recommend joining our dev container [community Slack channel](https://aka.ms/dev-container-community) where you can connect with the dev container spec maintainers and community at large. If you have any feature requests or experience any issues as you use the above tools, please feel free to also open an issue in the corresponding repo in the [dev containers org](https://github.com/devcontainers) on GitHub. \ No newline at end of file +If you haven't already, we recommend joining our dev container [community Slack channel](https://aka.ms/dev-container-community) where you can connect with the dev container spec maintainers and community at large. If you have any feature requests or experience any issues as you use the above tools, please feel free to also open an issue in the corresponding repo in the [dev containers org](https://github.com/devcontainers) on GitHub. From 415f312d951d9854be573590d2de58ec4cc186fb Mon Sep 17 00:00:00 2001 From: Jacob Hummer Date: Wed, 6 Sep 2023 10:52:55 -0500 Subject: [PATCH 143/312] Update collection-index.yml (#285) --- _data/collection-index.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index decd154f..0953333d 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -405,13 +405,13 @@ ociReference: ghcr.io/favalos/devcontainer-features - name: Community Templates maintainer: devcontainers-community - contact: https://github.com/devcontainers-community/templates/issues - repository: https://github.com/devcontainers-community/templates + contact: https://github.com/orgs/devcontainers-community/discussions + repository: https://github.com/devcontainers-community ociReference: ghcr.io/devcontainers-community/templates - name: Community Features maintainer: devcontainers-community - contact: https://github.com/devcontainers-community/features/issues - repository: https://github.com/devcontainers-community/features + contact: https://github.com/orgs/devcontainers-community/discussions + repository: https://github.com/devcontainers-community ociReference: ghcr.io/devcontainers-community/features - name: Community npm Features maintainer: devcontainers-community From a7ece858d5a0ebc1b4c6353b2a305fb1a70d075d Mon Sep 17 00:00:00 2001 From: Ronak Jain Date: Wed, 6 Sep 2023 21:57:46 +0530 Subject: [PATCH 144/312] [docs] Make merge logic table less confusing (#286) --- _implementors/spec.md | 52 +++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/_implementors/spec.md b/_implementors/spec.md index bacec8d6..9ed10ec1 100644 --- a/_implementors/spec.md +++ b/_implementors/spec.md @@ -65,32 +65,32 @@ To apply the metadata together with a user's devcontainer.json at runtime, the f | Property | Type/Format | Merge Logic | devcontainer.json | devcontainer-feature.json | | -------- | ----------- | ----------- | :---------------: | :--------------: | -| `id` | E.g., `ghcr.io/devcontainers/features/node:1` | Not merged. | | x | -| `init` | `boolean` | `true` if at least one is `true`, `false` otherwise. | x | x | -| `privileged` | `boolean` | `true` if at least one is `true`, `false` otherwise. | x | x | -| `capAdd` | `string[]` | Union of all `capAdd` arrays without duplicates. | x | x | -| `securityOpt` | `string[]` | Union of all `securityOpt` arrays without duplicates. | x | x | -| `entrypoint` | `string` | Collected list of all entrypoints. | | x | -| `mounts` | `(string \| { type, src, dst })[]` | Collected list of all mountpoints. Conflicts: Last source wins. | x | x | -| `onCreateCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all onCreateCommands. | x | x | -| `updateContentCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all updateContentCommands. | x | x | -| `postCreateCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all postCreateCommands. | x | x | -| `postStartCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all postStartCommands. | x | x | -| `postAttachCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all postAttachCommands. | x | x | -| `waitFor` | enum | Last value wins. | x | | -| `customizations` | Object of tool-specific customizations. | Merging is left to the tools. | x | x | -| `containerUser` | `string` | Last value wins. | x | | -| `remoteUser` | `string` | Last value wins. | x | | -| `userEnvProbe` | `string` (enum) | Last value wins. | x | | -| `remoteEnv` | Object of strings. | Per variable, last value wins. | x | | -| `containerEnv` | Object of strings. | Per variable, last value wins. | x | | -| `overrideCommand` | `boolean` | Last value wins. | x | | -| `portsAttributes` | Map of ports to attributes. | Per port (not per port attribute), last value wins. | x | | -| `otherPortsAttributes` | Port attributes. | Last value wins (not per port attribute). | x | | -| `forwardPorts` | `(number \| string)[]` | Union of all ports without duplicates. Last one wins (when mapping changes). | x | | -| `shutdownAction` | `string` (enum) | Last value wins. | x | | -| `updateRemoteUserUID` | `boolean` | Last value wins. | x | | -| `hostRequirements` | `cpus`, `memory`, `storage`, `gpu` | Max value wins. | x | | +| `id` | E.g., `ghcr.io/devcontainers/features/node:1` | Not merged. | | ✓ | +| `init` | `boolean` | `true` if at least one is `true`, `false` otherwise. | ✓ | ✓ | +| `privileged` | `boolean` | `true` if at least one is `true`, `false` otherwise. | ✓ | ✓ | +| `capAdd` | `string[]` | Union of all `capAdd` arrays without duplicates. | ✓ | ✓ | +| `securityOpt` | `string[]` | Union of all `securityOpt` arrays without duplicates. | ✓ | ✓ | +| `entrypoint` | `string` | Collected list of all entrypoints. | | ✓ | +| `mounts` | `(string \| { type, src, dst })[]` | Collected list of all mountpoints. Conflicts: Last source wins. | ✓ | ✓ | +| `onCreateCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all onCreateCommands. | ✓ | ✓ | +| `updateContentCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all updateContentCommands. | ✓ | ✓ | +| `postCreateCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all postCreateCommands. | ✓ | ✓ | +| `postStartCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all postStartCommands. | ✓ | ✓ | +| `postAttachCommand` | `string \| string[] \| {[key: string]: string \| string[]}` | Collected list of all postAttachCommands. | ✓ | ✓ | +| `waitFor` | enum | Last value wins. | ✓ | | +| `customizations` | Object of tool-specific customizations. | Merging is left to the tools. | ✓ | ✓ | +| `containerUser` | `string` | Last value wins. | ✓ | | +| `remoteUser` | `string` | Last value wins. | ✓ | | +| `userEnvProbe` | `string` (enum) | Last value wins. | ✓ | | +| `remoteEnv` | Object of strings. | Per variable, last value wins. | ✓ | | +| `containerEnv` | Object of strings. | Per variable, last value wins. | ✓ | | +| `overrideCommand` | `boolean` | Last value wins. | ✓ | | +| `portsAttributes` | Map of ports to attributes. | Per port (not per port attribute), last value wins. | ✓ | | +| `otherPortsAttributes` | Port attributes. | Last value wins (not per port attribute). | ✓ | | +| `forwardPorts` | `(number \| string)[]` | Union of all ports without duplicates. Last one wins (when mapping changes). | ✓ | | +| `shutdownAction` | `string` (enum) | Last value wins. | ✓ | | +| `updateRemoteUserUID` | `boolean` | Last value wins. | ✓ | | +| `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. From b7519816d8c679973399a79a7727871e646d88c6 Mon Sep 17 00:00:00 2001 From: liuq <1095672504@qq.com> Date: Mon, 11 Sep 2023 23:51:16 +0800 Subject: [PATCH 145/312] chore: add to Index (#287) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 0953333d..6e2f5fe5 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -548,3 +548,8 @@ contact: https://github.com/robbert229/devcontainer-features/issues repository: https://github.com/robbert229/devcontainer-features ociReference: ghcr.io/robbert229/devcontainer-features +- name: AliuQ Templates + maintainer: AliuQ + contact: https://github.com/aliuq/devcontainers/issues + repository: https://github.com/aliuq/devcontainers + ociReference: ghcr.io/aliuq/devcontainers From 5c24ada4ae641f7393f615b56b7951029c9b2541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filiph=20Siitam=20Sandstr=C3=B6m?= Date: Fri, 15 Sep 2023 18:38:50 +0200 Subject: [PATCH 146/312] Meta: Add `@NordcomInc`'s Dev Container Features. (#290) Currently we've only open-sourced the `android-sdk` feature, but it was something that a lot of people were looking for so might as well publish it now :^) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 6e2f5fe5..64ef7b81 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -553,3 +553,8 @@ contact: https://github.com/aliuq/devcontainers/issues repository: https://github.com/aliuq/devcontainers ociReference: ghcr.io/aliuq/devcontainers +- name: Nordcom Group Inc.'s Dev Container Features + maintainer: Filiph Siitam Sandström + contact: https://github.com/NordcomInc/devcontainer-features/issues + repository: https://github.com/NordcomInc/devcontainer-features + ociReference: ghcr.io/nordcominc/devcontainer-features From aeb95732e4c8ed39b4f0c18fb14f3a547127e903 Mon Sep 17 00:00:00 2001 From: Maxim Slipenko Date: Mon, 18 Sep 2023 18:29:49 +0300 Subject: [PATCH 147/312] Update collection-index.yml (#291) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 64ef7b81..bbb5af1b 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -558,3 +558,8 @@ contact: https://github.com/NordcomInc/devcontainer-features/issues repository: https://github.com/NordcomInc/devcontainer-features ociReference: ghcr.io/nordcominc/devcontainer-features +- name: Features by Maxim Slipenko + maintainer: Maxim Slipenko + contact: https://github.com/Maks1mS/devcontainers-features/issues + repository: https://github.com/Maks1mS/devcontainers-features + ociReference: ghcr.io/maks1ms/devcontainers-features From f92170a4655b2b4389c611eb0f88e7e99316fe26 Mon Sep 17 00:00:00 2001 From: Ty Schlichenmeyer Date: Thu, 21 Sep 2023 11:36:11 -0500 Subject: [PATCH 148/312] feat: container-structure-test (#293) * feat: container-structure-test * 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 bbb5af1b..c79ce34c 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -563,3 +563,8 @@ contact: https://github.com/Maks1mS/devcontainers-features/issues repository: https://github.com/Maks1mS/devcontainers-features ociReference: ghcr.io/maks1ms/devcontainers-features +- name: Container Structure Tests + maintainer: Ty Schlichenmeyer + contact: https://github.com/schlich/cst-devcontainer-feature/issues + repository: https://github.com/schlich/cst-devcontainer-feature + ociReference: ghcr.io/schlich/cst-devcontainer-feature From 7cbdc15c930767b799ed5a931ef7105276ff0646 Mon Sep 17 00:00:00 2001 From: raucha Date: Tue, 26 Sep 2023 00:49:23 +0900 Subject: [PATCH 149/312] Update collection-index.yml (#295) add index --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index c79ce34c..f2ceb4c4 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -568,3 +568,8 @@ 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: Features by raucha + maintainer: raucha + contact: https://github.com/raucha/devcontainer-features/issues + repository: https://github.com/raucha/devcontainer-features + ociReference: ghcr.io/raucha/devcontainer-features From c622acfb86eab7493e9acacfc0229bc2067f295d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Youen=20P=C3=A9ron?= Date: Mon, 25 Sep 2023 22:23:55 +0200 Subject: [PATCH 150/312] Adding LINO dev container based on linotoolbox (#296) * Adding LINO dev container based on linotoolbox * fix: bad ociReference url 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 f2ceb4c4..20d9a6c8 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -573,3 +573,8 @@ contact: https://github.com/raucha/devcontainer-features/issues repository: https://github.com/raucha/devcontainer-features ociReference: ghcr.io/raucha/devcontainer-features +- name: LINO PIMO SIGO Toolbox + maintainer: CGI France + contact: https://github.com/CGI-FR/lino-devcontainer/issues + repository: https://github.com/CGI-FR/lino-devcontainer/ + ociReference: ghcr.io/cgi-fr/lino-devcontainer From e939c70660705be21756f199ebcdac25e3d132d1 Mon Sep 17 00:00:00 2001 From: Nathan Weeks <1800812+nathanweeks@users.noreply.github.com> Date: Tue, 26 Sep 2023 12:28:32 -0400 Subject: [PATCH 151/312] Fix link to prebuild guide (#294) * Fix link to prebuild guide * Fix another link to the prebuilds guide --- _posts/2022-12-16-dockerfile.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_posts/2022-12-16-dockerfile.md b/_posts/2022-12-16-dockerfile.md index f6e8cc1d..c0b44d68 100644 --- a/_posts/2022-12-16-dockerfile.md +++ b/_posts/2022-12-16-dockerfile.md @@ -46,7 +46,7 @@ That's it! When you start up your Dev Container, the Dockerfile will be automati Better yet, you can can use a Dockerfile as a part of authoring an image you can share with others. You can even **add Dev Container settings and metadata right into the image itself**. This avoids having to duplicate config and settings in multiple devcontainer.json files and keeps them in sync with your images! -See the guide on **[pre-building](/_posts/2023-08-22-prebuild.md)** to learn more! +See the guide on **[pre-building]({% post_url 2023-08-22-prebuild %})** to learn more! ## Using Docker Compose @@ -142,4 +142,4 @@ volumes: Finally, as in the Dockerfile example, you can use this same setup to create a Dev Container image that you can share with others. You can also add Dev Container settings and metadata right into the image itself. -See the guide on **[pre-building](/_posts/2023-08-22-prebuild.md)** to learn more! +See the guide on **[pre-building]({% post_url 2023-08-22-prebuild %})** to learn more! From 231ff792dbd89a234b5cf7785ed1e668db12f760 Mon Sep 17 00:00:00 2001 From: Ciro Lo Sapio Date: Mon, 2 Oct 2023 22:18:49 +0200 Subject: [PATCH 152/312] add alpine devcontainer features (#297) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 20d9a6c8..7463ca41 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -578,3 +578,8 @@ contact: https://github.com/CGI-FR/lino-devcontainer/issues repository: https://github.com/CGI-FR/lino-devcontainer/ ociReference: ghcr.io/cgi-fr/lino-devcontainer +- name: Alpine DevContainer Features + maintainer: cirolosapio + contact: https://github.com/cirolosapio/devcontainers-features/issues + repository: https://github.com/cirolosapio/devcontainers-features + ociReference: ghcr.io/cirolosapio/devcontainers-features From f24c024da07741401490bbe601c96294ce9635f4 Mon Sep 17 00:00:00 2001 From: Jake Shorty Date: Thu, 12 Oct 2023 12:37:53 -0600 Subject: [PATCH 153/312] Extremely trivial typo fix (#299) --- _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 5ed1398a..b8e89709 100644 --- a/_implementors/json_reference.md +++ b/_implementors/json_reference.md @@ -76,7 +76,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** 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. | | `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. | From 8fe68d0a8c83ae14bebe5b3aaec7618cd3895bf3 Mon Sep 17 00:00:00 2001 From: Tanjim Hossain Date: Tue, 17 Oct 2023 01:13:02 +0600 Subject: [PATCH 154/312] add audacioustux features (#302) https://github.com/audacioustux/devcontainers argo bazel bun cilium common-utils-extras graalvm k9s kubebuilder kustomize operator-sdk pulumi scala-toolchain taskfile tilt vegeta wasm-toolchain --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 7463ca41..99a6504d 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -583,3 +583,8 @@ contact: https://github.com/cirolosapio/devcontainers-features/issues repository: https://github.com/cirolosapio/devcontainers-features ociReference: ghcr.io/cirolosapio/devcontainers-features +- name: Features by AudaciousTux + maintainer: audacioustux + contact: https://github.com/audacioustux/devcontainers/issues + repository: https://github.com/audacioustux/devcontainers + ociReference: ghcr.io/audacioustux/devcontainers From 0031c1ee87d17638f253afedf4147e50be863e38 Mon Sep 17 00:00:00 2001 From: Laith Yousif <86437+lnyousif@users.noreply.github.com> Date: Wed, 18 Oct 2023 14:26:55 -0400 Subject: [PATCH 155/312] Adding PlantUml DevContainer (#303) --- _data/collection-index.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_data/collection-index.yml b/_data/collection-index.yml index 99a6504d..6ab9bcaa 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -588,3 +588,8 @@ contact: https://github.com/audacioustux/devcontainers/issues repository: https://github.com/audacioustux/devcontainers ociReference: ghcr.io/audacioustux/devcontainers +- name: PlantUml DevContainer + maintainer: lnyousif + contact: https://github.com/lnyousif/plantuml-devcontainer/issues + repository: https://github.com/lnyousif/plantuml-devcontainer + ociReference: ghcr.io/lnyousif/plantuml-devcontainer \ No newline at end of file From 2ab33a5bc1b128bf9a1849a8b387b9d9f67e8360 Mon Sep 17 00:00:00 2001 From: Filipe Lima <45261568+filipelima18@users.noreply.github.com> Date: Thu, 19 Oct 2023 17:31:16 +0100 Subject: [PATCH 156/312] feat(Supporting): add section about CodeSandbox (#300) * Add CodeSandbox config and update Supporting page with CodeSandbox details * fix typos Co-authored-by: Samruddhi Khandale * fix capitalization of dev containers Co-authored-by: Samruddhi Khandale --------- Co-authored-by: Samruddhi Khandale --- .codesandbox/tasks.json | 25 +++++++++++++++++++++++++ supporting.md | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 .codesandbox/tasks.json diff --git a/.codesandbox/tasks.json b/.codesandbox/tasks.json new file mode 100644 index 00000000..070c279c --- /dev/null +++ b/.codesandbox/tasks.json @@ -0,0 +1,25 @@ +{ + // These tasks will run in order when initializing your CodeSandbox project. + "setupTasks": [ + { + "name": "Install dependencies", + "command": "bundle install" + } + ], + + // These tasks can be run from CodeSandbox. Running one will open a log in the app. + "tasks": { + "bundle exec jekyll serve": { + "name": "bundle exec jekyll serve", + "command": "bundle exec jekyll serve --host 0.0.0.0", + "runAtStart": true, + "preview": { + "port": 4000 + } + }, + "ruby:typecheck": { + "name": "Typecheck", + "command": "solargraph typecheck" + } + } +} diff --git a/supporting.md b/supporting.md index 8b417b59..3569f680 100644 --- a/supporting.md +++ b/supporting.md @@ -153,6 +153,47 @@ Some properties may apply differently to Codespaces. | `hostRequirements` | object | Codespaces reads this property from devcontainer.json, not image metadata. | {: .table .table-bordered .table-responsive} +### CodeSandbox + +[CodeSandbox](https://codesandbox.io/) provides cloud development environments running on a microVM architecture. VM specs start at 2 vCPUs + 2 GB RAM per environment (free tier) and can go up to 16 vCPUs + 32 GB RAM. + +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. + +#### Product specific properties +CodeSandbox has built-in support for any programming language and supports Debian and Ubuntu-based images. + +All properties specific to CodeSandbox are placed within a `.codesandbox` folder at root level. Typically, this will contain a `tasks.json` file, which defines the commands to be run at startup or with a click. + +More details about these can be found in the CodeSandbox [documentation](https://codesandbox.io/docs/learn/repositories/task). + +#### 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. | +{: .table .table-bordered .table-responsive} + ### 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. From 9e6bb60f4e01d268b0dea0d7f170eeed86914800 Mon Sep 17 00:00:00 2001 From: xfrancois Date: Fri, 20 Oct 2023 18:25:08 +0200 Subject: [PATCH 157/312] Update collection-index.yml (#306) add xfrancois devcontainer-features collection --- _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 6ab9bcaa..1dab1a95 100644 --- a/_data/collection-index.yml +++ b/_data/collection-index.yml @@ -592,4 +592,9 @@ maintainer: lnyousif contact: https://github.com/lnyousif/plantuml-devcontainer/issues repository: https://github.com/lnyousif/plantuml-devcontainer - ociReference: ghcr.io/lnyousif/plantuml-devcontainer \ No newline at end of file + ociReference: ghcr.io/lnyousif/plantuml-devcontainer +- name: Features by xfrancois + maintainer: xfrancois + contact: https://github.com/xfrancois/devcontainers-features/issues + repository: https://github.com/xfrancois/devcontainers-features + ociReference: ghcr.io/xfrancois/devcontainers-features From 5adf39c2af1ec8c79cf63d33e6670f32c99910d6 Mon Sep 17 00:00:00 2001 From: Brigit Murtaugh Date: Mon, 23 Oct 2023 15:20:54 -0700 Subject: [PATCH 158/312] 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 159/312] 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 160/312] 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 161/312] 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 162/312] 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 163/312] 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 164/312] 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 165/312] 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 166/312] 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 167/312] 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 168/312] 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 169/312] 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 170/312] 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 171/312] 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 172/312] 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 173/312] 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 174/312] 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 175/312] 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 176/312] 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 177/312] 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 178/312] 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 179/312] 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 180/312] 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 181/312] 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 182/312] 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 183/312] 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 184/312] 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 185/312] 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 186/312] 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 187/312] 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 188/312] 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 189/312] 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 190/312] 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 191/312] 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 192/312] 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 193/312] 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 194/312] 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 195/312] 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 196/312] 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 197/312] 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 198/312] 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 199/312] 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 200/312] 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 201/312] 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 202/312] 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 203/312] 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 204/312] 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 205/312] 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 206/312] 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 207/312] 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 208/312] 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 209/312] 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 210/312] 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 211/312] 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 212/312] 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 213/312] 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 214/312] 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 215/312] 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 216/312] 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 217/312] 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 218/312] 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 219/312] 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 220/312] 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 221/312] 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 222/312] 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 223/312] 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 224/312] 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 225/312] 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 226/312] 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 227/312] 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 228/312] 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 229/312] 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 230/312] 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 231/312] 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 232/312] 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 233/312] 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 234/312] 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 235/312] 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 236/312] 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 237/312] 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 238/312] 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 239/312] 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 240/312] 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 241/312] 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 242/312] 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 243/312] 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 244/312] 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 245/312] 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 246/312] 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 247/312] 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 248/312] 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 249/312] 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 250/312] 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 251/312] 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 252/312] 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 253/312] 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 254/312] 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 255/312] 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 256/312] 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 257/312] 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 258/312] 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 259/312] 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 (`//