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/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 74ca7760..55618006 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -3,7 +3,7 @@
{
"name": "Jekyll",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
- "image": "mcr.microsoft.com/devcontainers/jekyll:1-bullseye",
+ "image": "mcr.microsoft.com/devcontainers/jekyll:2",
// Features to add to the dev container. More info: https://containers.dev/features.
"features": {
diff --git a/.devcontainer/fetch-index.sh b/.devcontainer/fetch-index.sh
deleted file mode 100755
index a5a2aba6..00000000
--- a/.devcontainer/fetch-index.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash
-
-pushd /tmp
- curl -LO https://github.com/oras-project/oras/releases/download/v0.13.0/oras_0.13.0_linux_amd64.tar.gz
- mkdir -p oras-install/
- tar -zxf oras_0.13.0_*.tar.gz -C oras-install/
- mv oras-install/oras /usr/local/bin/
- rm -rf oras_0.13.0_*.tar.gz oras-install/
-popd
-
-cd /workspaces/devcontainers.github.io/_data
-oras pull ghcr.io/devcontainers/index:latest
-cp devcontainer-index.json ../static/
\ No newline at end of file
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 00000000..f33a02cd
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,12 @@
+# 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 more information:
+# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+# https://containers.dev/guide/dependabot
+
+version: 2
+updates:
+ - package-ecosystem: "devcontainers"
+ directory: "/"
+ schedule:
+ interval: weekly
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 00000000..d15e0353
--- /dev/null
+++ b/.github/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/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 5fe63fd7..858414d1 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -58,7 +58,7 @@ jobs:
destination: ./_site
- name: Upload artifact
- uses: actions/upload-pages-artifact@v1
+ uses: actions/upload-pages-artifact@v3
# Deployment job
deploy:
@@ -70,4 +70,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
- uses: actions/deploy-pages@v1
+ uses: actions/deploy-pages@v4
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:
diff --git a/_data/collection-index.yml b/_data/collection-index.yml
index f256b3ff..61fd55ae 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
@@ -28,26 +33,11 @@
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
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
@@ -273,6 +263,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
@@ -283,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
@@ -308,16 +298,16 @@
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: Kvokka Dev Container Features
+ maintainer: kvokka
+ contact: https://github.com/kvokka/features/issues
+ repository: https://github.com/kvokka/features
+ ociReference: ghcr.io/kvokka/features
- 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
-- 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
@@ -353,11 +343,6 @@
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
- name: Dapr devcontainer features
maintainer: Dapr maintainers
contact: https://github.com/dapr/cli/issues
@@ -405,9 +390,19 @@
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/orgs/devcontainers-community/discussions
+ repository: https://github.com/devcontainers-community
+ ociReference: ghcr.io/devcontainers-community/features
+- name: Community npm Features
+ maintainer: devcontainers-community
+ contact: https://github.com/devcontainers-community/npm-features/issues
+ repository: https://github.com/devcontainers-community/npm-features
+ ociReference: ghcr.io/devcontainers-community/npm-features
- name: Rusty Features
maintainer: Lee-Orr
contact: https://github.com/lee-orr/rusty-dev-containers/issues
@@ -418,3 +413,728 @@
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
+- 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
+- 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
+- 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
+- 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
+- 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
+ 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
+- 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
+- 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
+- name: Azure Developer CLI Dev Container Feature
+ maintainer: Azure Developer CLI Team
+ contact: https://github.com/Azure/azure-dev/issues
+ repository: https://github.com/Azure/azure-dev
+ ociReference: ghcr.io/azure/azure-dev
+- name: Skyramp Dev Container Feature
+ maintainer: Skyramp, Inc.
+ contact: https://github.com/letsramp/devcontainer-features/issues
+ repository: https://github.com/letsramp/devcontainer-features
+ ociReference: ghcr.io/letsramp/devcontainer-features
+- name: Earthly Dev Container Features
+ maintainer: Earthly Technologies
+ contact: https://github.com/earthly/devcontainer-features/issues
+ repository: https://github.com/earthly/devcontainer-features
+ ociReference: ghcr.io/earthly/devcontainer-features
+- name: Runme Container Features
+ maintainer: Stateful, Inc.
+ contact: https://github.com/stateful/devcontainer-features/issues
+ repository: https://github.com/stateful/devcontainer-features
+ ociReference: ghcr.io/stateful/devcontainer-features
+- name: Wpdevenv Templates
+ maintainer: Wpdevenv
+ contact: https://github.com/wpdevenv/dev_container_templates/issues
+ repository: https://github.com/wpdevenv/dev_container_templates
+ ociReference: ghcr.io/wpdevenv/dev_container_templates
+- name: Native Dev Container Features
+ maintainer: John Chlark Sumatra
+ contact: https://github.com/itsmechlark/features/issues
+ repository: https://github.com/itsmechlark/features
+ ociReference: ghcr.io/itsmechlark/features
+- name: Assorted Features
+ maintainer: Marco Zaccaro
+ contact: https://github.com/marcozac/devcontainer-features/issues
+ repository: https://github.com/marcozac/devcontainer-features
+ ociReference: ghcr.io/marcozac/devcontainer-features
+- name: Features by Elan Hasson
+ maintainer: ElanHasson
+ contact: https://github.com/ElanHasson/devcontainer-features/issues
+ repository: https://github.com/ElanHasson/devcontainer-features
+ ociReference: ghcr.io/elanhasson/devcontainer-features
+- name: Python+MSSQL+Azure SQL Templates
+ maintainer: Azure Developer CLI Team
+ contact: https://github.com/Azure-Samples/python-ms-sql-devcontainer/issues
+ repository: https://github.com/Azure-Samples/python-ms-sql-devcontainer
+ ociReference: ghcr.io/azure-samples/python-ms-sql-devcontainer
+- name: Features by Tiwaloluwa Ojo
+ maintainer: Tiwaloluwa Ojo
+ contact: https://github.com/tiwaojo/features/issues
+ repository: https://github.com/tiwaojo/features
+ ociReference: ghcr.io/tiwaojo/features
+- name: Julia Language Features
+ maintainer: Julia Language Community
+ contact: https://github.com/JuliaLang/devcontainer-features/issues
+ repository: https://github.com/JuliaLang/devcontainer-features
+ ociReference: ghcr.io/julialang/devcontainer-features
+- name: Julia Language Templates
+ maintainer: Julia Language Community
+ contact: https://github.com/JuliaLang/devcontainer-templates/issues
+ repository: https://github.com/JuliaLang/devcontainer-templates
+ ociReference: ghcr.io/julialang/devcontainer-templates
+- name: Features by John Rowley
+ maintainer: John Rowley
+ 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
+- 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
+- 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
+- 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
+- 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
+ 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
+- 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
+- name: Features by AudaciousTux
+ maintainer: audacioustux
+ 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
+- 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
+- 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
+- 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
+- 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
+- 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
+ 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
+- name: Additional Dev Container Features by 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
+ 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
+- name: Radius Features (https://radapp.io/)
+ maintainer: radius-project
+ contact: https://github.com/radius-project/radius/issues
+ repository: https://github.com/radius-project/radius
+ ociReference: ghcr.io/radius-project/devcontainer-features
+- 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
+- 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
+- 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
+- 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
+- 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
+ 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
+- 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
+- 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
+- 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
+- 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
+- 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
+- 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
+- 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
+- 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
+- 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
+- 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
+- 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
+- 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
+- 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
+- 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
+ 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
+- 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
+- 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
+- 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
+ 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
+ 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
+- 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
+ repository: https://github.com/tonynajjar/ros2_devcontainer_template/
+ 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
+- 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
+- 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
+- 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
+ 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
+ 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
+ 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
+- 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
+- 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
+- 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
+- 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: Julian Pawlowski
+ 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
+- 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
+- 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
+- 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
+- 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
+- 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
+- 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
+ 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
+ repository: https://github.com/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
+- 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
+- name: devcontainer features by Bas Steins
+ maintainer: Bas Steins
+ contact: https://bas.codes
+ repository: https://github.com/bascodes/devcontainer-features
+ ociReference: ghcr.io/bascodes/devcontainer-features
+- name: devcontainer features by rhiroe
+ maintainer: rhiroe
+ contact: https://github.com/rhiroe/features/issues
+ repository: https://github.com/rhiroe/features
+ ociReference: ghcr.io/rhiroe/features
+- name: Development Container Features by aqua
+ maintainer: Shunsuke Suzuki
+ contact: https://github.com/aquaproj/devcontainer-features/issues
+ repository: https://github.com/aquaproj/devcontainer-features
+ ociReference: ghcr.io/aquaproj/devcontainer-features
+- name: devcontainer features by martinaskestad
+ maintainer: martinaskestad
+ contact: https://github.com/martinaskestad/features/issues
+ repository: https://github.com/martinaskestad/features
+ ociReference: ghcr.io/martinaskestad/features
+- name: devcontainer features for wolfi base docker image
+ maintainer: David Zucker
+ contact: https://github.com/davzucky/devcontainers-features-wolfi/issues
+ repository: https://github.com/davzucky/devcontainers-features-wolfi
+ ociReference: ghcr.io/davzucky/devcontainers-features-wolfi
+- name: Dev Container Features by ForWarD Software
+ maintainer: ForWarD Software
+ contact: https://github.com/forwardsoftware/devcontainer-features/issues
+ repository: https://github.com/forwardsoftware/devcontainer-features
+ ociReference: ghcr.io/forwardsoftware/devcontainer-features
+- name: devcontainer feature to install apt dependencies defined in an `Aptfile.dev` file.
+ maintainer: Viktor Schmidt
+ contact: https://github.com/viktorianer/devcontainer-features/issues
+ repository: https://github.com/viktorianer/devcontainer-features/tree/main/src/apt
+ ociReference: ghcr.io/viktorianer/devcontainer-features/apt
+- name: devcontainer features by ChaosWars
+ maintainer: ChaosWars
+ contact: https://github.com/ChaosWars/vscode-features/issues
+ repository: https://github.com/ChaosWars/vscode-features
+ ociReference: ghcr.io/chaoswars/vscode-features
+- name: Community features by devcontainer.community
+ maintainer: devcontainer.community
+ contact: https://devcontainer.community
+ repository: https://github.com/devcontainer-community/devcontainer-features
+ ociReference: ghcr.io/devcontainer-community/devcontainer-features
+- name: Additional Dev Container Features by braun-daniel
+ maintainer: Daniel Braun
+ contact: https://github.com/braun-daniel/devcontainer-features/issues
+ repository: https://github.com/braun-daniel/devcontainer-features
+ ociReference: ghcr.io/braun-daniel/devcontainer-features
+- name: Dev Container Features by Ivan Szkiba
+ maintainer: Ivan Szkiba
+ contact: https://github.com/szkiba/devcontainer-features/issues
+ repository: https://github.com/szkiba/devcontainer-features
+ ociReference: ghcr.io/szkiba/devcontainer-features
+- name: devcontainer features by TheDiveO
+ maintainer: TheDiveO
+ contact: https://github.com/thediveo/devcontainer-features/issues
+ repository: https://github.com/thediveo/devcontainer-features
+ ociReference: ghcr.io/thediveo/devcontainer-features
+- name: devcontainer features by .NET Aspire
+ maintainer: danmoseley
+ contact: https://github.com/dotnet/aspire-devcontainer-feature/issues
+ repository: https://github.com/dotnet/aspire-devcontainer-feature
+ ociReference: ghcr.io/dotnet/aspire-devcontainer-feature
+- name: devcontainer features by RouL
+ maintainer: Markus Zhang
+ contact: https://github.com/RouL/devcontainer-features/issues
+ repository: https://github.com/RouL/devcontainer-features
+ ociReference: ghcr.io/roul/devcontainer-features
+- name: devcontainer templates by techiro
+ maintainer: techiro
+ contact: https://github.com/techiro/devcontainer-template/issues
+ repository: https://github.com/techiro/devcontainer-template
+ ociReference: ghcr.io/techiro/devcontainer-template
+- name: Claude Code Feature
+ maintainer: Anthropic
+ contact: https://github.com/anthropics/devcontainer-features/issues
+ repository: https://github.com/anthropics/devcontainer-features
+ ociReference: ghcr.io/anthropics/devcontainer-features/claude-code
+- name: devcontainer templates by blooop
+ maintainer: Austin Gregg-Smith
+ contact: https://github.com/blooop/devcontainer-templates/issues
+ repository: https://github.com/blooop/devcontainer-templates
+ ociReference: ghcr.io/blooop/devcontainer-templates
+- name: devcontainer features by prplecake
+ maintainer: Matthew Jorgensen (prplecake)
+ contact: https://github.com/prplecake/devcontainer-features/issues
+ repository: https://github.com/prplecake/devcontainer-features
+ ociReference: ghcr.io/prplecake/devcontainer-features
+- name: Ziglang devcontainer Template
+ maintainer: fardragon
+ contact: https://github.com/fardragon/devcontainers-zig-template/issues
+ repository: https://github.com/fardragon/devcontainers-zig-template
+ ociReference: ghcr.io/fardragon/devcontainers-zig-template
+- name: TTCN-3-Devcontainer
+ maintainer: Muhammad Umair Khan
+ contact: https://github.com/m-umair-khan-dev/devcontainers/issues
+ repository: https://github.com/m-umair-khan-dev/devcontainers
+ ociReference: ghcr.io/m-umair-khan-dev/devcontainers/ttcn-3-devcontainer
+- name: Dev Container Features by Grafana Labs
+ maintainer: Grafana Labs
+ contact: https://github.com/grafana/devcontainer-features/issues
+ repository: https://github.com/grafana/devcontainer-features
+ ociReference: ghcr.io/grafana/devcontainer-features
+- name: Dev Container Features by httpdss
+ maintainer: httpdss
+ contact: https://github.com/httpdss/devcontainers-features/issues
+ repository: https://github.com/httpdss/devcontainers-features
+ ociReference: ghcr.io/httpdss/devcontainers-features
+- name: Axon Ivy devcontainer template
+ maintainer: axonivy
+ contact: https://github.com/axonivy/devcontainer-templates/issues
+ repository: https://github.com/axonivy/devcontainer-templates
+ ociReference: ghcr.io/axonivy/devcontainer-templates
+- name: Dev Container Features by Coder
+ maintainer: Coder
+ contact: https://github.com/coder/devcontainer-features/issues
+ repository: https://github.com/coder/devcontainer-features
+ ociReference: ghcr.io/coder/devcontainer-features
+- name: Dev Container Features by atty303
+ maintainer: atty303
+ contact: https://github.com/atty303/devcontainer-features/issues
+ repository: https://github.com/atty303/devcontainer-features
+ ociReference: ghcr.io/atty303/devcontainer-features
+- name: devcontainer features by MuhmdRaouf
+ maintainer: Mohammed Abdel Raouf (MuhmdRaouf)
+ contact: https://github.com/muhmdraouf/devcontainers-features/issues
+ repository: https://github.com/muhmdraouf/devcontainers-features
+ ociReference: ghcr.io/muhmdraouf/devcontainers-features
+- name: Dev Container Features by John Ajera
+ maintainer: John Ajera
+ contact: https://github.com/jajera/features/issues
+ repository: https://github.com/jajera/features
+ ociReference: ghcr.io/jajera/features
+- name: MrSimonEmms Dev Container Features
+ maintainer: MrSimonEmms
+ contact: https://github.com/mrsimonemms/devcontainers/issues
+ repository: https://github.com/mrsimonemms/devcontainers
+ ociReference: ghcr.io/mrsimonemms/devcontainers
+- name: HTTPie Feature
+ maintainer: Ferdinand Keller
+ contact: https://github.com/ferdinandkeller/features/issues
+ repository: https://github.com/ferdinandkeller/features
+ ociReference: ghcr.io/ferdinandkeller/features/httpie
+- name: Rojo Feature
+ maintainer: Ryan Luu
+ contact: https://github.com/RyanLua/features/issues
+ repository: https://github.com/RyanLua/features
+ ociReference: ghcr.io/ryanlua/features
+- name: Roblox Template
+ maintainer: Ryan Luu
+ contact: https://github.com/RyanLua/templates/issues
+ repository: https://github.com/RyanLua/templates
+ ociReference: ghcr.io/ryanlua/templates
+- name: Dev Container Features by Joe Bowbeer
+ maintainer: Joe Bowbeer
+ contact: https://github.com/joebowbeer/devcontainers-features/issues
+ repository: https://github.com/joebowbeer/devcontainers-features
+ ociReference: ghcr.io/joebowbeer/devcontainers-features
+- name: FEniCS
+ maintainer: schnellerhase
+ contact: https://github.com/schnellerhase/devcontainer-fenics/issues
+ repository: https://github.com/schnellerhase/devcontainer-fenics
+ ociReference: ghcr.io/schnellerhase/devcontainer-fenics/fenics
+ ociReference: ghcr.io/ryanlua/templates/roblox
+- name: W&B Catnip
+ maintainer: Weights and Biases
+ contact: https://github.com/wandb/catnip/issues
+ repository: https://github.com/wandb/catnip
+ ociReference: ghcr.io/wandb/catnip/feature
+- name: AcademicDocker template (R, Stata, LaTeX)
+ maintainer: Romain Ferrali
+ contact: https://github.com/rferrali/devcontainer-templates/issues
+ repository: https://github.com/rferrali/devcontainer-templates
+ ociReference: ghcr.io/rferrali/devcontainer-templates
+- name: Devcontainers templates by jhoareaumarion
+ maintainer: jhoareaumarion
+ contact: https://github.com/jhoareaumarion/devcontainers/issues
+ repository: https://github.com/jhoareaumarion/devcontainers
+ ociReference: ghcr.io/jhoareaumarion/devcontainers
+- name: devcontainer features by TakahashiNguyen
+ maintainer: ANh Nguyá»…n (TakahashiNguyen)
+ contact: https://github.com/TakahashiNguyen/devcontainer-features/issues
+ repository: https://github.com/TakahashiNguyen/devcontainer-features
+ ociReference: ghcr.io/takahashinguyen/devcontainer-features
+- name: olivierlemasle
+ maintainer: Olivier Lemasle
+ contact: https://github.com/olivierlemasle/devcontainers-features/issues
+ repository: https://github.com/olivierlemasle/devcontainers-features
+ ociReference: ghcr.io/olivierlemasle/devcontainers-features
+- name: BTP Dev Container Features
+ maintainer: Navin Krishnan
+ contact: https://github.com/navinkrishnan/devcontainer-features-btp/issues
+ repository: https://github.com/navinkrishnan/devcontainer-features-btp
+ ociReference: ghcr.io/navinkrishnan/devcontainer-features-btp
+- name: BTP CAP (Cloud Application Programming) Model Dev Templates
+ maintainer: Navin Krishnan
+ contact: https://github.com/navinkrishnan/devcontainer-templates-btp/issues
+ repository: https://github.com/navinkrishnan/devcontainer-templates-btp
+ ociReference: ghcr.io/navinkrishnan/devcontainer-templates-btp
diff --git a/_implementors/contributing.md b/_implementors/contributing.md
index af94fa40..8fc2edb4 100644
--- a/_implementors/contributing.md
+++ b/_implementors/contributing.md
@@ -6,19 +6,20 @@ 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
+## 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 |
|:------------------|:------------|:------------|
| `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 VS Code and other `devcontainer.json` supporting services / tools should use to create the dev container. |
-{: .table .table-bordered .table-responsive}
+{: .table .table-bordered}
- 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.
@@ -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/_implementors/features-distribution.md b/_implementors/features-distribution.md
index fa1b5aa0..b01ac4c5 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:
@@ -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:
@@ -81,7 +81,7 @@ The `devcontainer-collection.json` is an auto-generated metadata file.
| :--- | :--- | :--- |
| `sourceInformation` | object | Metadata from the implementing packaging tool. |
| `features` | array | The list of features that are contained in this collection.|
-{: .table .table-bordered .table-responsive}
+{: .table .table-bordered}
Each Features's `devcontainer-feature.json` metadata file is appended into the `features` top-level array.
@@ -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
@@ -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.
@@ -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,10 +131,39 @@ 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
```
+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).
@@ -149,9 +178,9 @@ A local Feature is referenced in the devcontainer's `feature` object **relative
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**](/docs/specs/devcontainer-reference.md#project-workspace-folder).
+* 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 05ff374b..8c4ce517 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
@@ -52,11 +52,14 @@ 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/#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}
+| `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}
+
+(**) 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
@@ -70,9 +73,9 @@ The following lifecycle hooks may be declared as properties of `devcontainer-fea
| `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}
+{: .table .table-bordered}
-#### 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 +83,41 @@ 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).
+
+#### 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
@@ -107,7 +144,7 @@ The options property contains a map of option IDs and their related configuratio
| `optionId.enum` | array | A strict list of allowed string values. Free-form values are **not** allowed. Omit when using `optionId.proposals`. |
| `optionId.default` | string or boolean | Default value for the option. |
| `optionId.description` | string | Description for the option. |
-{: .table .table-bordered .table-responsive}
+{: .table .table-bordered}
### User environment variables
@@ -117,11 +154,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 +255,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:
@@ -227,7 +264,7 @@ The `id` format specified dicates how a supporting tool will locate and download
| `//[:]` | Reference to feature in OCI registry(*) | `ghcr.io/user/repo/go` `ghcr.io/user/repo/go:1` `ghcr.io/user/repo/go:latest`|
| `https://` | Direct HTTPS URI to a tarball. | `https://github.com/user/repo/releases/devcontainer-feature-go.tgz` |
| `./`| A relative directory(**) to folder containing a devcontainer-feature.json. | `./myGoFeature` |
-{: .table .table-bordered .table-responsive}
+{: .table .table-bordered}
(*) 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/).
@@ -251,7 +288,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
@@ -269,55 +306,170 @@ 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.
-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`.
+* 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
+#### dependsOn
-This property is declared by the user in their `devcontainer.json` file.
+The optional `dependsOn` property indicates a set of required, "hard" dependencies for a given Feature.
-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.
+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).
-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 `:`).
+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.
-Example:
+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.
+
+```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
-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
@@ -361,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
}
diff --git a/_implementors/json_reference.md b/_implementors/json_reference.md
index ad888891..24320635 100644
--- a/_implementors/json_reference.md
+++ b/_implementors/json_reference.md
@@ -6,7 +6,7 @@ author: Microsoft
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**.
+The `devcontainer.json` file contains any needed metadata and settings required to configure 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](/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.
@@ -27,14 +27,14 @@ 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/#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) |
-{: .table .table-bordered .table-responsive}
+| `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}
## Scenario specific properties
@@ -47,24 +47,25 @@ 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.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. |
-| `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"` |
+| `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" ]` . |
-{: .table .table-bordered .table-responsive}
+{: .table .table-bordered}
### Docker Compose specific properties
| 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}
+{: .table .table-bordered}
## Tool-specific properties
@@ -76,14 +77,14 @@ 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. |
| `postStartCommand` 🏷️ | string, array, object | A command to run each time the container is successfully started.
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. |
| `postAttachCommand` 🏷️ | string, array, object | A command to run each time a tool has successfully attached to the container.
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. |
| `waitFor` 🏷️ | enum | An enum that specifies the command any tool should wait for before connecting. Defaults to `updateContentCommand`. This allows you to use `onCreateCommand` or `updateContentCommand` for steps that must happen before `devcontainer.json` supporting tools connect while still using `postCreateCommand` for steps that can happen behind the scenes afterwards. |
-{: .table .table-bordered .table-responsive}
+{: .table .table-bordered}
For each command property, if the value is a single string, it will be run in `/bin/sh`. Use `&&` in a string to execute multiple commands. For example, `"yarn install"` or `"apt-get update && apt-get install -y curl"`. The array syntax `["yarn", "install"]` will invoke the command (in this case `yarn`) directly without using a shell. Each fires after your source code has been mounted, so you can also run shell scripts from your source tree. For example: `bash scripts/install-dev-tools.sh`.
@@ -98,7 +99,8 @@ 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"}` |
-{: .table .table-bordered .table-responsive}
+| `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}
## Port attributes
@@ -108,10 +110,10 @@ 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}
+{: .table .table-bordered}
## Formatting string vs. array properties
@@ -161,20 +163,20 @@ 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. |
+| `${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" }`
{{ 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 ed9f3a7d..ab7a0139 100644
--- a/_posts/2022-11-01-author-a-feature.md
+++ b/_posts/2022-11-01-author-a-feature.md
@@ -1,15 +1,17 @@
---
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.
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.
-> Note: While this walkthrough will illustrate the use of GitHub and the GitHub Container Registry, you can use your own source control system and publish to any [OCI Artifact supporting](https://oras.land/implementors/#registries-supporting-oci-artifacts) container registry instead.
+> Note: While this walkthrough will illustrate the use of GitHub and the GitHub Container Registry, you can use your own source control system and publish to any [OCI Artifact supporting](https://oras.land/docs/compatible_oci_registries#registries-supporting-oci-artifacts) container registry instead.
## Create a repo
diff --git a/_posts/2022-12-16-dockerfile.md b/_posts/2022-12-16-dockerfile.md
index 687f13d5..c0b44d68 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.
@@ -32,7 +34,7 @@ Next, remove the `image` property from `devcontainer.json` (if it exists) and ad
```json
{
"build": {
- // Path is relataive to the devcontainer.json file.
+ // Path is relative to the devcontainer.json file.
"dockerfile": "Dockerfile"
}
}
@@ -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]({% post_url 2023-08-22-prebuild %})** to learn more!
## Using Docker Compose
@@ -138,6 +140,6 @@ 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.
+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]({% post_url 2023-08-22-prebuild %})** 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
new file mode 100644
index 00000000..adca4d49
--- /dev/null
+++ b/_posts/2023-06-14-feature-authoring-best-practices.md
@@ -0,0 +1,162 @@
+---
+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
diff --git a/_posts/2023-08-22-prebuild.md b/_posts/2023-08-22-prebuild.md
new file mode 100644
index 00000000..684e854c
--- /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#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):
+
+ ```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/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
+* Reference it in your `devcontainer.json`, Dockerfile, or Docker Compose file
+ * 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
+
+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)
+* **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)
+ * 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
+ * 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.
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:
+
+
+
+
+
+
+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/collections.html b/collections.html
index 205688e5..2dc28bf0 100644
--- a/collections.html
+++ b/collections.html
@@ -6,24 +6,60 @@
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.
+
+
\ No newline at end of file
diff --git a/contributing.md b/contributing.md
index 90d7ccba..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
@@ -37,14 +37,32 @@ 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
-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.
[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/features.html b/features.html
index 88d3d855..edf3c062 100644
--- a/features.html
+++ b/features.html
@@ -7,34 +7,88 @@
- 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.
+ To add your own collection to this list, please create a PR editing this
+ yaml file.
-
-
Feature Name
-
Maintainer
-
Reference
-
Latest Version
-
-
-{% for c in site.data.devcontainer-index.collections %}
+
+
+
+
+
+
+
+
Feature Name
+
Maintainer
+
Reference
+
Latest Version
+
+
+ {% for c in site.data.devcontainer-index.collections %}
{% for f in c.features %}
- {% if f.deprecated != true %}
-
+
+
\ No newline at end of file
diff --git a/img/dependabot-pr.png b/img/dependabot-pr.png
new file mode 100644
index 00000000..b642e61a
Binary files /dev/null and b/img/dependabot-pr.png differ
diff --git a/index.html b/index.html
index 5c901c91..89ed4deb 100644
--- a/index.html
+++ b/index.html
@@ -16,7 +16,8 @@
A Development Container (or Dev Container for short) allows you to use a container as a full-featured development environment. It can be used to run an application, to separate tools, libraries, or runtimes needed for working with a codebase, and to aid in continuous integration and testing. Dev containers can be run locally or remotely, in a private or public cloud.
+
A development container (or dev container for short) allows you to use a container as a full-featured
+ development environment. It can be used to run an application, to separate tools, libraries, or runtimes
+ needed for working with a codebase, and to aid in continuous integration and testing. Dev containers can
+ be run locally or remotely, in a private or public cloud, in a variety of supporting tools and editors.
-
The Development Containers Specification seeks to find ways to enrich existing formats with common development specific settings, tools, and configuration while still providing a simplified, un-orchestrated single container option – so that they can be used as coding environments or for continuous integration and testing. Beyond the specification's core metadata, the spec also enables developers to quickly share and reuse container setup steps through Dev Container Features and Templates.
+
The Development Container Specification seeks to find ways to enrich existing formats with common
+ development specific settings, tools, and configuration while still providing a simplified,
+ un-orchestrated single container option – so that they can be used as coding environments or for
+ continuous integration and testing. Beyond the specification's core metadata, the spec also enables
+ developers to quickly share and reuse container setup steps through Features and Templates.
-
-
Use or create dev container definitions for a multitude of tech stacks and tools.
+
+
Use or create dev container definitions for a multitude of tech stacks and
+ 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.
diff --git a/supporting.md b/supporting.md
index 6d0ac8dd..30a7d129 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.
@@ -29,39 +29,45 @@ Visual Studio Code specific properties go under `vscode` inside `customizations`
|:------------------|:------------|:------------|
| `extensions` | array | An array of extension IDs that specify the extensions that should be installed inside the container when it is created. Defaults to `[]`. |
| `settings` | object | Adds default `settings.json` values into a container/machine specific settings file. Defaults to `{}`. |
-{: .table .table-bordered .table-responsive}
+{: .table .table-bordered}
Please note that the [Dev Containers](#dev-containers) extension and [GitHub Codespaces](#github-codespaces) support these VS Code properties.
### 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.
+
+You may learn more in the [announcement blog post](https://blog.jetbrains.com/idea/2023/06/intellij-idea-2023-2-eap-6/#SupportforDevContainers).
+
## Tools
### 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
+### 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!
@@ -85,7 +91,7 @@ Some properties may also have certain limitations in the Dev Containers extensio
| `workspaceFolder` | string | Not yet supported when using Clone Repository in Container Volume. |
| `${localWorkspaceFolder}` | Any | Not yet supported when using Clone Repository in Container Volume. |
| `${localWorkspaceFolderBasename}` | Any | Not yet supported when using Clone Repository in Container Volume. |
-{: .table .table-bordered .table-responsive}
+{: .table .table-bordered}
## Services
@@ -130,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 |
|----------|---------|----------------------|
@@ -145,8 +151,59 @@ Some properties may apply differently to Codespaces.
| `${localEnv:VARIABLE_NAME}` | Any | For Codespaces, the host is in the cloud rather than your local machine.|
| `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}
+{: .table .table-bordered}
+
+### 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}
+
+### 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.
+
+### Ona (formerly Gitpod)
+
+[Ona](https://ona.com/) (formerly Gitpod) is the mission control for software projects and software engineering agents. It provides secure, ephemeral development environments that run in our cloud or your VPC, enabling humans and agents to collaborate seamlessly.
+
+Ona fully adheres to the Dev Container Specification, so you can define portable and reproducible environments with `devcontainer.json`. Whether you’re onboarding a new developer, running background agents, or delegating long-running migrations, Ona Environments ensure every task runs in a clean, policy-enforced environment.
+
+For details on constraints, customization, and automation options, see the [Ona Dev Container docs](https://ona.com/docs/ona/configuration/devcontainer/overview).
+
### Schema
You can explore the [VS Code implementation](implementors/json_schema) of the dev container schema.
+
+
diff --git a/templates.html b/templates.html
index 089fe51c..14573146 100644
--- a/templates.html
+++ b/templates.html
@@ -17,18 +17,73 @@
Available Dev Container Templa
+ To add your own collection to this list, please create a PR editing this
+ yaml file.
-
-
Template Name
-
Maintainer
-
-{% for c in site.data.devcontainer-index.collections %}
+
+
+
+
+
+
+
Template Name
+
Maintainer
+
Reference
+
Latest Version
+
+
+ {% for c in site.data.devcontainer-index.collections %}
{% for f in c.templates %}