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/_data/collection-index.yml b/_data/collection-index.yml
index 1dab1a95..3bd7f749 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
@@ -568,6 +553,11 @@
contact: https://github.com/schlich/cst-devcontainer-feature/issues
repository: https://github.com/schlich/cst-devcontainer-feature
ociReference: ghcr.io/schlich/cst-devcontainer-feature
+- name: Rye
+ maintainer: Ty Schlichenmeyer
+ contact: https://github.com/schlich/devcontainer-features/issues
+ repository: https://github.com/schlich/devcontainer-features
+ ociReference: ghcr.io/schlich/devcontainer-features
- name: Features by raucha
maintainer: raucha
contact: https://github.com/raucha/devcontainer-features/issues
@@ -588,7 +578,7 @@
contact: https://github.com/audacioustux/devcontainers/issues
repository: https://github.com/audacioustux/devcontainers
ociReference: ghcr.io/audacioustux/devcontainers
-- name: PlantUml DevContainer
+- name: PlantUml DevContainer
maintainer: lnyousif
contact: https://github.com/lnyousif/plantuml-devcontainer/issues
repository: https://github.com/lnyousif/plantuml-devcontainer
@@ -598,3 +588,497 @@
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: 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: 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
+ maintainer: Ryan Luu
+ contact: https://github.com/RyanLua/features/issues
+ repository: https://github.com/RyanLua/features
+ ociReference: ghcr.io/ryanlua/features/rojo
+- name: Roblox
+ maintainer: Ryan Luu
+ contact: https://github.com/RyanLua/templates/issues
+ repository: https://github.com/RyanLua/templates
+ ociReference: ghcr.io/ryanlua/templates/roblox
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 e7d7d353..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).
@@ -151,7 +180,7 @@ Additional constraints exists when including local Features in a project:
* The project must have a `.devcontainer/` folder at the root of the [**project workspace folder**](/implementors/spec/#project-workspace-folder).
-* A local Feature's source code **must** be contained within a sub-folder of the `.devcontainer/ folder`.
+* A local Feature's source code **must** be contained within a sub-folder of the `.devcontainer/` folder.
* The sub-folder name **must** match the Feature's `id` field.
diff --git a/_implementors/features.md b/_implementors/features.md
index e7b62174..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/#mount). The Pre-defined [devcontainerId](/implementors/json_reference#variables-in-devcontainerjson) variable may be referenced in the value. For example: `"mounts": [{ "source": "dind-var-lib-docker", "target": "/var/lib/docker", "type": "volume" }]` |
-{: .table .table-bordered .table-responsive}
+{: .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 b8e89709..05dcf95b 100644
--- a/_implementors/json_reference.md
+++ b/_implementors/json_reference.md
@@ -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/#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
@@ -48,23 +48,24 @@ The focus of `devcontainer.json` is to describe how to enrich a container for th
| `build.dockerfile` | string |**Required** when using a Dockerfile. The location of a [Dockerfile](https://docs.docker.com/engine/reference/builder/) that defines the contents of the container. The path is relative to the `devcontainer.json` file. |
| `build.context` | string | Path that the Docker build should be run from relative to `devcontainer.json`. For example, a value of `".."` would allow you to reference content in sibling directories. Defaults to `"."`. |
| `build.args` | Object | A set of name-value pairs containing [Docker image build arguments](https://docs.docker.com/engine/reference/commandline/build/#build-arg) that should be passed when building a Dockerfile. Environment and [pre-defined variables](#variables-in-devcontainerjson) may be referenced in the values. Defaults to not set. For example: `"build": { "args": { "MYARG": "MYVALUE", "MYARGFROMENVVAR": "${localEnv:VARIABLE_NAME}" } }` |
+| `build.options` | array | An array of [Docker image build options](https://docs.docker.com/engine/reference/commandline/build/#options) that should be passed to the build command when building a Dockerfile. Defaults to `[]`. For example: `"build": { "options": [ "--add-host=host.docker.internal:host-gateway" ] }` |
| `build.target` | string | A string that specifies a [Docker image build target](https://docs.docker.com/engine/reference/commandline/build/#target) that should be passed when building a Dockerfile. Defaults to not set. For example: `"build": { "target": "development" }` |
| `build.cacheFrom` | string, array | A string or array of strings that specify one or more images to use as caches when building the image. Cached image identifiers are passed to the `docker build` command with `--cache-from`. |
-| `appPort` | integer, string, array | In most cases, we recommend using the new [forwardPorts property](#general-properties). This property accepts a port or array of ports that should be published locally when the container is running.Unlike `forwardPorts`, your application may need to listen on all interfaces (`0.0.0.0`) not just `localhost` for it to be available externally. Defaults to `[]`. Learn more about publishing vs forwarding ports [here](#publishing-vs-forwarding-ports). Note that the array syntax will execute the command without a shell. You can [learn more](#formatting-string-vs-array-properties) about formatting string vs array properties. |
+| `appPort` | integer, string, array | In most cases, we recommend using the new [forwardPorts property](#general-properties). This property accepts a port or array of ports that should be published locally when the container is running. Unlike `forwardPorts`, your application may need to listen on all interfaces (`0.0.0.0`) not just `localhost` for it to be available externally. Defaults to `[]`. Learn more about publishing vs forwarding ports [here](#publishing-vs-forwarding-ports). Note that the array syntax will execute the command without a shell. You can [learn more](#formatting-string-vs-array-properties) about formatting string vs array properties. |
| `workspaceMount` | string | Requires `workspaceFolder` be set as well. Overrides the default local mount point for the workspace when the container is created. Supports the same values as the [Docker CLI `--mount` flag](https://docs.docker.com/engine/reference/commandline/run/#mount). Environment and [pre-defined variables](#variables-in-devcontainerjson) may be referenced in the value. For example: `"workspaceMount": "source=${localWorkspaceFolder}/sub-folder,target=/workspace,type=bind,consistency=cached", "workspaceFolder": "/workspace"` |
| `workspaceFolder` | string | Requires `workspaceMount` be set. Sets the default path that `devcontainer.json` supporting services / tools should open when connecting to the container. Defaults to the automatic source code mount location. |
| `runArgs` | array | An array of [Docker CLI arguments](https://docs.docker.com/engine/reference/commandline/run/) that should be used when running the container. Defaults to `[]`. For example, this allows ptrace based debuggers like C++ to work in the container: `"runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ]` . |
-{: .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`.
@@ -91,16 +92,15 @@ If one of the lifecycle scripts fails, any subsequent scripts will not be execut
## Minimum host requirements
-While `devcontainer.json` does not focus on hardware or VM provisioning, it can be useful to know your container's minimum RAM, CPU, storage, and GPU requirements. This is what the `hostRequirements` properties allow you to do. Cloud services can use these properties to automatically default to the best compute option available, while in other cases, you will be presented with a warning if the requirements are not met.
+While `devcontainer.json` does not focus on hardware or VM provisioning, it can be useful to know your container's minimum RAM, CPU, and storage requirements. This is what the `hostRequirements` properties allow you to do. Cloud services can use these properties to automatically default to the best compute option available, while in other cases, you will be presented with a warning if the requirements are not met.
| Property | Type | Description |
|:------------------|:------------|:------------|
| `hostRequirements.cpus` 🏷️ | integer | Indicates the minimum required number of CPUs / virtual CPUs / cores. For example: `"hostRequirements": {"cpus": 2}` |
| `hostRequirements.memory` 🏷️ | string | A string indicating minimum memory requirements with a `tb`, `gb`, `mb`, or `kb` suffix. For example, `"hostRequirements": {"memory": "4gb"}` |
| `hostRequirements.storage` 🏷️ | string | A string indicating minimum storage requirements with a `tb`, `gb`, `mb`, or `kb` suffix. For example, `"hostRequirements": {"storage": "32gb"}` |
-| `hostRequirements.gpu` 🏷️ | boolean, string or object | Indicates whether a GPU is required. The string \"optional\" indicates that a GPU is optional. An object value can be used to configure more detailed requirements. For example: `"hostRequirements": {"gpu": true}` |
-
-{: .table .table-bordered .table-responsive}
+| `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
@@ -110,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
@@ -163,16 +163,16 @@ 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" }`
A default value for when the environment variable is not set can be given with `${containerEnv:VARIABLE_NAME:default_value}`. |
| `${localWorkspaceFolder}` | Any | Path of the local folder that was opened in the `devcontainer.json` supporting service / tool (that contains `.devcontainer/devcontainer.json`). |
| `${containerWorkspaceFolder}` | Any | The path that the workspaces files can be found in the container. |
| `${localWorkspaceFolderBasename}` | Any | Name of the local folder that was opened in the `devcontainer.json` supporting service / tool (that contains `.devcontainer/devcontainer.json`). |
| `${containerWorkspaceFolderBasename}` | Any | Name of the folder where the workspace files can be found in the container. |
-| `${devcontainerId}` | Any | Identifier derived from a set of container labels that uniquely identify the dev container on a Docker host. It allows Features to refer to an identifier that is unique to the dev container they are installed into and that is stable across rebuilds. The properties supporting it in devcontainer.json are: `name`, `runArgs`, `initializeCommand`, `onCreateCommand`, `updateContentCommand`, `postCreateCommand`, `postStartCommand`, `postAttachCommand`, `workspaceFolder`, `workspaceMount`, `mounts`, `containerEnv`, `remoteEnv`, `containerUser`, `remoteUser`, and `customizations`. |
-{: .table .table-bordered .table-responsive}
+| `${devcontainerId}` | Any | Allow Features to refer to an identifier that is unique to the dev container they are installed into and that is stable across rebuilds. The properties supporting it in devcontainer.json are: `name`, `runArgs`, `initializeCommand`, `onCreateCommand`, `updateContentCommand`, `postCreateCommand`, `postStartCommand`, `postAttachCommand`, `workspaceFolder`, `workspaceMount`, `mounts`, `containerEnv`, `remoteEnv`, `containerUser`, `remoteUser`, and `customizations`. |
+{: .table .table-bordered}
## Schema
diff --git a/_implementors/json_schema.md b/_implementors/json_schema.md
index 1b2d5ff8..6f733bfc 100644
--- a/_implementors/json_schema.md
+++ b/_implementors/json_schema.md
@@ -205,7 +205,8 @@ You may review the current devcontainer.json schemas in the spec repo, which inc
"string",
"array"
],
- "description": "A command to run locally before anything else. This command is run before \"onCreateCommand\". If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "description": "A command string or list of command arguments to run on the host machine during initialization, including during container creation and on subsequent starts. The command may run more than once during a given session. This command is run before \"onCreateCommand\". If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+
"items": {
"type": "string"
}
diff --git a/_implementors/reference.md b/_implementors/reference.md
index 3c43c914..6d75dd56 100644
--- a/_implementors/reference.md
+++ b/_implementors/reference.md
@@ -6,18 +6,18 @@ author: Microsoft
index: 2
---
-The reference implementation for the specification is available through a [development container CLI](https://github.com/devcontainers/cli). This CLI can take a devcontainer.json and create and configure a dev container from it.
+The reference implementation for the specification is available through a [development container CLI](https://github.com/devcontainers/cli). This CLI can take a `devcontainer.json` and create and configure a dev container from it.
-## What is the dev container CLI?
-When tools like VS Code and Codespaces detect a devcontainer.json file in a user's project, they use a CLI to configure a dev container. We've now opened up this CLI as a reference implementation so that individual users and other tools can read in devcontainer.json metadata and create dev containers from it.
+## What is the Dev Container CLI?
+When tools like VS Code and Codespaces detect a `devcontainer.json` file in a user's project, they use a CLI to configure a dev container. We've now opened up this CLI as a reference implementation so that individual users and other tools can read in `devcontainer.json` metadata and create dev containers from it.
This CLI can either be used directly or integrated into product experiences, similar to how it's integrated with Dev Containers and Codespaces today. It currently supports both a simple single container option and integrates with [Docker Compose](https://docs.docker.com/compose/) for multi-container scenarios.
-The CLI is available for review in a new [devcontainers/cli](https://github.com/devcontainers/cli) repository, and you can read more about its development in [this issue](https://github.com/devcontainers/spec/issues/9) in the spec repo.
+The CLI is available in the [devcontainers/cli](https://github.com/devcontainers/cli) repository.
## How can I try it?
-We'd love for you to try out the dev container CLI and let us know what you think. You can quickly try it out in just a few simple steps, either by installing its npm package or building the CLI repo from sources.
+We'd love for you to try out the Dev Container CLI and let us know what you think. You can quickly try it out in just a few simple steps, either by installing its npm package or building the CLI repo from sources.
You may learn more about building from sources in the [CLI repo's README](https://github.com/devcontainers/cli#try-it-out). On this page, we'll focus on using the npm package.
@@ -97,7 +97,7 @@ Hello, VS Code Remote - Containers!
{"outcome":"success"}
```
-Congrats, you've just run the dev container CLI and seen it in action!
+Congrats, you've just run the Dev Container CLI and seen it in action!
These steps are also provided in the CLI repo's [README](https://github.com/devcontainers/cli/blob/main/README.md). You may also review frequently asked questions [here](https://github.com/devcontainers/spec/issues/31).
@@ -110,13 +110,15 @@ We recommend using the [Dev Container CLI](#npm-install) (or other spec supporti
devcontainer build --workspace-folder . --push true --image-name :
```
+You can also check out our [in-depth guide on prebuilds](/_posts/2023-08-22-prebuild.md).
+
#### Metadata in image labels
You can include Dev Container configuration and Feature metadata in prebuilt images via [image labels](https://docs.docker.com/config/labels-custom-metadata/). This makes the image self-contained since these settings are automatically picked up when the image is referenced - whether directly, in a `FROM` in a referenced Dockerfile, or in a Docker Compose file. This helps prevent your Dev Container config and image contents from getting out of sync, and allows you to push updates of the same configuration to multiple repositories through a simple image reference.
-This metadata label is **automatically added** when you pre-build using the [Dev Container CLI](#npm-install) (or other spec supporting utilities like the [GitHub Action](https://github.com/marketplace/actions/devcontainers-ci) or [Azure DevOps task](https://marketplace.visualstudio.com/items?itemName=devcontainers.ci)) and includes settings from devcontainer.json and any referenced Dev Container Features.
+This metadata label is **automatically added** when you pre-build using the [Dev Container CLI](#npm-install) (or other spec supporting utilities like the [GitHub Action](https://github.com/marketplace/actions/devcontainers-ci) or [Azure DevOps task](https://marketplace.visualstudio.com/items?itemName=devcontainers.ci)) and includes settings from `devcontainer.json` and any referenced Dev Container Features.
-This allows you to have a separate **more complex** devcontainer.json you use to pre-build your image, and then a dramatically **simplified one** in one or more repositories. The contents of the image will be merged with this simplified devcontainer.json content at the time you create the container (see the [the spec](/implementors/spec/#merge-logic) for info on merge logic). But at its simplest, you can just reference the image directly in devcontainer.json for the settings to take effect:
+This allows you to have a separate **more complex** `devcontainer.json` you use to pre-build your image, and then a dramatically **simplified one** in one or more repositories. The contents of the image will be merged with this simplified devcontainer.json content at the time you create the container (see the [the spec](/implementors/spec/#merge-logic) for info on merge logic). But at its simplest, you can just reference the image directly in `devcontainer.json` for the settings to take effect:
```json
{
@@ -138,7 +140,7 @@ See the [Dev Container metadata reference](../json_reference) for information on
### Domain Names
-If you are behind a firewall that needs to allow specific domains used by the dev container CLI, here's the list of hostnames you should allow communication to go through:
+If you are behind a firewall that needs to allow specific domains used by the Dev Container CLI, here's the list of hostnames you should allow communication to go through:
* `containers.dev` - The [homepage](https://containers.dev/) for everything about dev containers. It includes all official and community-supported [Features](https://containers.dev/features) and [Templates](https://containers.dev/templates).
-* `ghcr.io`, `*.azurecr.io`, `mcr.microsoft.com` - [OCI registries](https://containers.dev/implementors/features-distribution/#oci-registry) like [GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry), [Azure Container Registry](azure.microsoft.com/en-us/products/container-registry), and [Microsoft Container Registry](https://mcr.microsoft.com/en-us/catalog?search=dev%20container) serves as the primary distribution mechanism for dev container resources.
\ No newline at end of file
+* `ghcr.io`, `*.azurecr.io`, `mcr.microsoft.com` - [OCI registries](https://containers.dev/implementors/features-distribution/#oci-registry) like [GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry), [Azure Container Registry](https://azure.microsoft.com/en-us/products/container-registry), and [Microsoft Container Registry](https://mcr.microsoft.com/en-us/catalog?search=dev%20container) serves as the primary distribution mechanism for dev container resources.
\ No newline at end of file
diff --git a/_implementors/spec.md b/_implementors/spec.md
index 9ed10ec1..ecd0600b 100644
--- a/_implementors/spec.md
+++ b/_implementors/spec.md
@@ -6,19 +6,19 @@ author: Microsoft
index: 1
---
-The purpose of the **development container** specification is to provide a way to enrich containers with the content and metadata necessary to enable development inside them. These container **environments** should be easy to use, create, and recreate.
+The purpose of the **Development Container Specification** is to provide a way to enrich containers with the content and metadata necessary to enable development inside them. These container **environments** should be easy to use, create, and recreate.
-A **development container** is a container in which a user can develop an application. Tools that want to implement this specification should provide a set of features/commands that give more flexibility to users and allow **development containers** to scale to large development groups.
+A **development container** is a container in which a user can develop an application. Tools that want to implement this specification should provide a set of features/commands that give more flexibility to users and allow **development containers** to scale to large development groups.
An **environment** is defined as a logical instance of one or more **development containers**, along with any needed side-car containers. An environment is based on one set of metadata that can be managed as a single unit. Users can create multiple **environments** from the same configuration metadata for different purposes.
# Metadata
-**Development containers** allow one to define a repeatable development environment for a user or team of developers that includes the execution environment the application needs. A development container defines an environment in which you develop your application before you are ready to deploy. While deployment and development containers may resemble one another, you may not want to include tools in a deployment image that you use during development and you may need to use different secrets or other settings.
+The Development Container Spec allows one to define a repeatable development environment for a user or team of developers that includes the execution environment the application needs. A development container defines an environment in which you develop your application before you are ready to deploy. While deployment and development containers may resemble one another, you may not want to include tools in a deployment image that you use during development and you may need to use different secrets or other settings.
Furthermore, working inside a development container can require additional **metadata** to drive tooling or service experiences than you would normally need with a production container. Providing a structured and consistent form for this metadata is a core part of this specification.
-A **development container** is composed of a definition (e.g. contained in a `devcontainer.json` file) that deterministically creates containers under the control of the user.
+A development container is composed of a definition (e.g. contained in a `devcontainer.json` file) that deterministically creates containers under the control of the user.
## `devcontainer.json`
@@ -34,7 +34,7 @@ It is valid that these files may exist in more than one location, so consider pr
Certain dev container metadata properties can be stored in an image label as an array of metadata snippets. This allows them to be stored in prebuilt images, such that, the image and its related configuration are self-contained. These contents should then be merged with any local devcontainer.json file contents at the time the container is created. An array is used so subsequent image builds can simply append changes to the array rather than attempting to merge at that point - which improves compatibility with arbitrary image build systems.
-Metadata should be representative of with the following structure, using one entry per [Dev Container Feature](../features) and devcontainer.json (see table below for the full list):
+Metadata should be representative of with the following structure, using one entry per [Dev Container Feature](../features) and `devcontainer.json` (see table below for the full list):
```json
[
@@ -61,7 +61,7 @@ The metadata is added to the image as a `devcontainer.metadata` label with a JSO
### Merge Logic
-To apply the metadata together with a user's devcontainer.json at runtime, the following merge logic by property is used. The table also notes which properties are currently supported coming from the devcontainer.json and from the Feature metadata- this will change over time as we add more properties.
+To apply the metadata together with a user's `devcontainer.json` at runtime, the following merge logic by property is used. The table also notes which properties are currently supported coming from the `devcontainer.json` and from the Feature metadata- this will change over time as we add more properties.
| Property | Type/Format | Merge Logic | devcontainer.json | devcontainer-feature.json |
| -------- | ----------- | ----------- | :---------------: | :--------------: |
@@ -91,15 +91,15 @@ To apply the metadata together with a user's devcontainer.json at runtime, the f
| `shutdownAction` | `string` (enum) | Last value wins. | âś“ | |
| `updateRemoteUserUID` | `boolean` | Last value wins. | âś“ | |
| `hostRequirements` | `cpus`, `memory`, `storage`, `gpu` | Max value wins. | âś“ | |
-{: .table .table-bordered .table-responsive}
+{: .table .table-bordered}
-Variables in string values will be substituted at the time the value is applied. When the order matters, the devcontainer.json is considered last.
+Variables in string values will be substituted at the time the value is applied. When the order matters, the `devcontainer.json` is considered last.
### Notes
- Passing the label as a `LABEL` instruction in the Dockerfile:
- The size limit on Dockerfiles is around 1.3MB. The line length is limited to 65k characters.
- - Using one line per feature should allow for making full use of these limits.
+ - Using one line per Feature should allow for making full use of these limits.
- Passing the label as a command line argument:
- There is no size limit documented for labels, but the daemon returns an error when the request header is >500kb.
- The 500kb limit is shared, so we cannot use a second label in the same build to avoid it.
@@ -117,7 +117,7 @@ Image based configurations only reference an image that should be reachable and
## Dockerfile based
-These configurations are defined as using a `Dockerfile` to define the starting point of the **development containers**. As with image based configurations, it is assumed that any base images are already reachable by **Docker** when performing a `docker build` command. The only required parameter in this case is the relative reference to the `Dockerfile` in `build.dockerfile`. The details are [here](../json_reference#image-specific).
+These configurations are defined as using a Dockerfile to define the starting point of the development containers. As with image based configurations, it is assumed that any base images are already reachable by Docker when performing a `docker build` command. The only required parameter in this case is the relative reference to the Dockerfile in `build.dockerfile`. The details are [here](../json_reference#image-specific).
There are multiple properties that allow users to control how `docker build` works:
@@ -134,11 +134,11 @@ Docker Compose configurations use `docker-compose` (which may be Docker Compose
- `service`: declares the **main** container that will be used for all other operations. Tools are assumed to also use this parameter to connect to the **development container**, although they can provide facilities to connect to the other containers as required by the user.
- `runServices`: an optional property that indicates the set of services in the `docker-compose` configuration that should be started or stopped with the environment.
-It is important to note that **image** and **dockerfile** properties are not needed since Docker Compose supports them natively in the format.
+It is important to note that the `image` and `dockerfile` properties are not needed since Docker Compose supports them natively in the format.
# Other options
-In addition to the configuration options explained above, there are other settings that apply when creating **development containers** to facilitate their use by developers.
+In addition to the configuration options explained above, there are other settings that apply when creating development containers to facilitate their use by developers.
A complete list of available metadata properties and their purposes can be found in the [`devcontainer.json` reference](https://aka.ms/devcontainer.json). However, we will describe the critical ones below in more detail.
@@ -146,28 +146,28 @@ A complete list of available metadata properties and their purposes can be found
Development container "Features" are self-contained, shareable units of installation code and development container configuration. The name comes from the idea that referencing one of them allows you to quickly and easily add more tooling, runtime, or library "features" into your development container for you or your collaborators to use.
-They are applied to container images as a secondary build step and can affect a number of dev container configuration settings. See the [features documentation](../features) for more details.
+They are applied to container images as a secondary build step and can affect a number of dev container configuration settings. See the [Features documentation](../features) for more details.
## Environment variables
-Environment variables can be set at different points in the dev container lifecycle. With this in mind, **development containers** support two classes of environment variables:
+Environment variables can be set at different points in the dev container lifecycle. With this in mind, development containers support two classes of environment variables:
* **Container**: These variables are part of the container when it is created and are available at all points in its lifecycle. This concept is native to containers and can be set in the container image itself, using `containerEnv` for **image** and **Dockerfile** scenarios or using orchestrator specific properties like `env` in **Docker Compose** files.
-* **Remote**: These variables should be set by a **development container** supporting tool as part of configuring its runtime environment. Users can set these using the `remoteEnv` property and implementing tools or services may add their own for specific scenarios (e.g., secrets). These variables can change during the lifetime of the container, and are added after the container's `ENTRYPOINT` has fired.
+* **Remote**: These variables should be set by a development container supporting tool as part of configuring its runtime environment. Users can set these using the `remoteEnv` property and implementing tools or services may add their own for specific scenarios (e.g., secrets). These variables can change during the lifetime of the container, and are added after the container's `ENTRYPOINT` has fired.
The reason for this separation is it allows for the use of information not available at image build time and simplifies updating the environment for project/repository specific needs without modifying an image. With this in in mind, it's important to note that implementing tools should also support the [dynamic variable syntax](../json_reference/#variables-in-devcontainerjson) described in the metadata reference document.
-Another notable and important environment variable related property is **`userEnvProbe`**. Implementing tools should use this property to "probe" for expected environment variables using the specified type of shell. However, it does not specify that this type of shell needs to be used for all sub-processes (given the performance impact). Instead, "probed" environment variables should be merged with Remote environment variables for any processes the implementer injects after the container is created. This allows implementors to emulate developer expected behaviors around values added to their profile and rc files.
+Another notable and important environment variable related property is **`userEnvProbe`**. Implementing tools should use this property to "probe" for expected environment variables using the specified type of shell. However, it does not specify that this type of shell needs to be used for all sub-processes (given the performance impact). Instead, "probed" environment variables should be merged with remote environment variables for any processes the implementer injects after the container is created. allows implementors to emulate developer expected behaviors around values added to their profile and rc files.
## Mounts
-Mounts allow containers to have access to the underlying machine, share data between containers and to persist information between **development containers**.
+Mounts allow containers to have access to the underlying machine, share data between containers and to persist information between development containers.
A default mount should be included so that the source code is accessible from inside the container. Source code is stored outside of the container so that a developer's in-flight edits can be extracted, or a new container created in the event a container no longer starts.
## workspaceFolder and workspaceMount
-The default mount point for the source code can be set with the `workspaceMount` property for **image** and **dockerfile** scenarios or using the built in `mounts` property in **Docker Compose** files. This folder should point to the root of a repository (where the `.git` folder is found) so that source control operations work correctly inside the container.
+The default mount point for the source code can be set with the `workspaceMount` property for image and Dockerfile scenarios or using the built in `mounts` property in Docker Compose files. This folder should point to the root of a repository (where the `.git` folder is found) so that source control operations work correctly inside the container.
The `workspaceFolder` can then be set to the default folder inside the container that should used in the container. Typically this is either the mount point in the container, or a sub-folder under it. Allowing a sub-folder to be used is particularly important for monorepos given you need the `.git` folder to interact with source control but developers are typically are interacting with a specific sub-project within the overall repository.
@@ -193,7 +193,7 @@ A development environment goes through different lifecycle events during its use
## Configuration Validation
-The exact steps required to validate configuration can vary based on exactly where the **development container** metadata is persisted. However, when considering a `devcontainer.json` file, the following validation should occur:
+The exact steps required to validate configuration can vary based on exactly where the development container metadata is persisted. However, when considering a `devcontainer.json` file, the following validation should occur:
1. Validate that a workspace source folder has been provided. It is up to the implementing tool to determine what to do if no source folder is provided.
2. Search for a `devcontainer.json` file in one of the locations [above](#devcontainerjson) in the workspace source folder.
@@ -212,7 +212,7 @@ During this step, the following is executed:
### Image Creation
-The first part of environment creation is generating the final image(s) that the **development containers** are going to use. This step is orchestrator dependent and can consist of just pulling a Docker image, running Docker build, or docker-compose build. Additionally, this step is useful on its own since it permits the creation of intermediate images that can be uploaded and used by other users, thus cutting down on creation time. It is encouraged that tools implementing this specification give access to a command that just executes this step.
+The first part of environment creation is generating the final image(s) that the development containers are going to use. This step is orchestrator dependent and can consist of just pulling a Docker image, running Docker build, or `docker-compose` build. Additionally, this step is useful on its own since it permits the creation of intermediate images that can be uploaded and used by other users, thus cutting down on creation time. It is encouraged that tools implementing this specification give access to a command that just executes this step.
This step executes the following tasks:
@@ -260,7 +260,7 @@ The intention of this step is to ensure all containers are stopped correctly bas
## Environment Resume
-While it is not a strict requirement to keep a **development container** after it has been stopped, this is the most common scenario.
+While it is not a strict requirement to keep a development container after it has been stopped, this is the most common scenario.
To resume the environment from a stopped state:
1. Restart all related containers.
diff --git a/_implementors/templates-distribution.md b/_implementors/templates-distribution.md
index ab2d7ae9..3e96eb5a 100644
--- a/_implementors/templates-distribution.md
+++ b/_implementors/templates-distribution.md
@@ -19,7 +19,7 @@ Goals include:
A Template's source code is stored in a git repository.
-For ease of authorship and maintenance, [1..n] Templates can share a single git repository. This set of Templates is referred to as a "collection," and will share the same [`devcontainer-collection.json`](#devcontainer-collection.json) file and "namespace" (eg. `/`).
+For ease of authorship and maintenance, [1..n] Templates can share a single git repository. This set of Templates is referred to as a "collection," and will share the same [`devcontainer-collection.json`](#devcontainer-collection) file and "namespace" (eg. `/`).
> **Note:** Templates and [Features](/implementors/features) should be placed in different git repositories.
@@ -68,7 +68,7 @@ Templates are distributed as tarballs. The tarball contains the entire contents
The tarball is named `devcontainer-template-.tgz`, where `` is the Templates's `id` field.
-A reference implementation for packaging and distributing Templates is provided as a GitHub Action (https://github.com/devcontainers/action).
+A reference implementation for packaging and distributing Templates is provided as a [GitHub Action](https://github.com/devcontainers/action).
### devcontainer-collection.json
@@ -78,7 +78,7 @@ The `devcontainer-collection.json` is an auto-generated metadata file.
| :--- | :--- | :--- |
| `sourceInformation` | object | Metadata from the implementing packaging tool. |
| `templates` | array | The list of Templates that are contained in this collection.|
-{: .table .table-bordered .table-responsive}
+{: .table .table-bordered}
Each Template's `devcontainer-template.json` metadata file is appended into the `templates` top-level array.
@@ -113,7 +113,7 @@ ARTIFACT_PATH=devcontainer-template-go.tgz
for VERSION in 1 1.2 1.2.3 latest
do
oras push ${REGISTRY}/${NAMESPACE}/${TEMPLATE}:${VERSION} \
- --manifest-config /dev/null:application/vnd.devcontainers \
+ --config /dev/null:application/vnd.devcontainers \
./${ARTIFACT_PATH}:application/vnd.devcontainers.layer.v1+tar
done
@@ -129,13 +129,13 @@ REGISTRY=ghcr.io
NAMESPACE=devcontainers/templates
oras push ${REGISTRY}/${NAMESPACE}:latest \
- --manifest-config /dev/null:application/vnd.devcontainers \
+ --config /dev/null:application/vnd.devcontainers \
./devcontainer-collection.json:application/vnd.devcontainers.collection.layer.v1+json
```
## Guide to publishing Templates
-The dev container CLI can be used to publish [Dev Container Template](https://containers.dev/implementors/templates/) artifacts to an OCI registry (that supports the [artifacts specification](https://oras.land/implementors/)).
+The Dev Container CLI can be used to publish [Template](https://containers.dev/implementors/templates/) artifacts to an OCI registry (that supports the [artifacts specification](https://oras.land/implementors/)).
To see all the available options, run `devcontainers templates publish --help`.
diff --git a/_implementors/templates.md b/_implementors/templates.md
index d559a5cb..8a0a519e 100644
--- a/_implementors/templates.md
+++ b/_implementors/templates.md
@@ -6,7 +6,7 @@ author: Microsoft
index: 7
---
-Development container "Templates" are source files packaged together that encode configuration for a complete development environment. A Template can be used in a new or existing project, and a [supporting tool](/supporting) will use the configuration from the Template to build a development container.
+**Development Container Templates** are source files packaged together that encode configuration for a complete development environment. A Template can be used in a new or existing project, and a [supporting tool](/supporting) will use the configuration from the Template to build a development container.
The configuration is placed in a [`.devcontainer.json`](/implementors/json_reference#devcontainerjson) which can also reference other files within the Template. Alternatively, `.devcontainer/devcontainer.json` can also be used if the container needs to reference other files, such as a `Dockerfile` or `docker-compose.yml`. A Template can also provide additional source files (eg: boilerplate code or a [lifecycle script](/implementors/json_reference/#lifecycle-scripts)).
@@ -37,11 +37,12 @@ The properties of the file are as follows:
| `description` | string | Description of the Template. |
| `documentationURL` | string | Url that points to the documentation of the Template. |
| `licenseURL` | string | Url that points to the license of the Template. |
-| `options` | object | A map of options that the supporting tools should use to populate different configuration options for the Template. |
+| [`options`](#options) | object | A map of options that the supporting tools should use to populate different configuration options for the Template. |
| `platforms` | array | Languages and platforms supported by the Template. |
| `publisher` | string | Name of the publisher/maintainer of the Template. |
| `keywords` | array | List of strings relevant to a user that would search for this Template. |
-{: .table .table-bordered .table-responsive}
+| [`optionalPaths`](#optionalPaths) | array | An array of files or directories that tooling may consider "optional" when applying a Template. Directories are indicated with a trailing `/*`, (eg: `.github/*`).
+{: .table .table-bordered}
### The `options` property
The `options` property contains a map of option IDs and their related configuration settings. These `options` are used by the supporting tools to prompt the user to choose from different Template configuration options. The tools would replace the option ID with the selected value in all the files (within the sub-directory of the Template). This replacement would happen before dropping the `.devcontainer.json` (or `.devcontainer/devcontainer.json`) and other files (within the sub-directory of the Template) required to containerize your project. See [option resolution](#option-resolution) for more details. For example:
@@ -67,10 +68,34 @@ The `options` property contains a map of option IDs and their related configurat
| `optionId.proposals` | array | A list of suggested string values. Free-form values **are** allowed. Omit when using `optionId.enum`. |
| `optionId.enum` | array | A strict list of allowed string values. Free-form values are **not** allowed. Omit when using `optionId.proposals`. |
| `optionId.default` | string | Default value for the option. |
-{: .table .table-bordered .table-responsive}
+{: .table .table-bordered}
> `Note`: The `options` must be unique for every `devcontainer-template.json`
+### The `optionalPaths` property
+
+Before applying a Template, tooling must inspect the `optionalPaths` property of a Template and prompt the user on whether each file or folder should be included in the resulting output workspace folder. A path is relative to the root of the Template source directory.
+
+- For a single file, provide the full relative path (without any leading or trailing path delimiters).
+- For a directory, provide the full relative path with a trailing slash and asterisk (`/*`) appended to the path. The directory and its children will be recursively ignored.
+
+Examples are shown below:
+
+```jsonc
+{
+ "id": "cpp",
+ "version": "3.0.0",
+ "name": "C++",
+ "description": "Develop C++ applications",
+ "optionalPaths": [
+ "GETTING-STARTED.md", // Single file
+ "example-project-1/MyProject.csproj", // Single file in nested directory
+ ".github/*" // Entire recursive contents of directory
+ ]
+}
+```
+
+
### Referencing a Template
The `id` format (`//[:]`) dictates how a [supporting tool](/supporting) will locate and download a given Template from an OCI registry. For example:
diff --git a/_posts/2023-08-22-prebuild.md b/_posts/2023-08-22-prebuild.md
index b944d163..684e854c 100644
--- a/_posts/2023-08-22-prebuild.md
+++ b/_posts/2023-08-22-prebuild.md
@@ -33,7 +33,7 @@ If you're already using dev containers, you're likely already familiar with the
You need to build your container once it has all the dependencies it needs, and rebuild anytime you add new dependencies. Since you may not need to rebuild often, it might be alright if it takes a while for that initial build. But if you or your teammates need to use that container on another machine, you'll need to wait for it to build again in those new environments.
-> **Note:** The [dev container CLI doc](/_implementors/reference.md#prebuilding) is another great resource on prebuilding.
+> **Note:** The [dev container CLI doc](/implementors/reference#prebuilding) is another great resource on prebuilding.
### Prebuilt Codespaces
@@ -43,14 +43,14 @@ GitHub Codespaces prebuilds help to speed up the creation of new codespaces for
By default, whenever you push changes to your repository, GitHub Codespaces uses GitHub Actions to automatically update your prebuilds.
-You can learn more about codespaces prebuilds and how to manage them in the [codespaces docs]((https://docs.github.com/en/codespaces/prebuilding-your-codespaces/about-github-codespaces-prebuilds)).
+You can learn more about codespaces prebuilds and how to manage them in the [codespaces docs](https://docs.github.com/en/codespaces/prebuilding-your-codespaces/about-github-codespaces-prebuilds).
## How do I prebuild my image?
We try to make prebuilding an image and using a prebuilt image as easy as possible. Let's walk through the couple of steps to get started.
**Prebuilding an image:**
-* Install the [Dev Container CLI](/_implementors/reference.md):
+* Install the [Dev Container CLI](/implementors/reference):
```bash
npm install -g @devcontainers/cli
@@ -67,7 +67,7 @@ We try to make prebuilding an image and using a prebuilt image as easy as possib
**Using a prebuilt image:**
* Determine the published URL of the prebuilt image you want to use
* Reference it in your `devcontainer.json`, Dockerfile, or Docker Compose file
- * In our previous guide on ["Using Images, Dockerfiles, and Docker Compose,"](/_posts/2022-12-16-dockerfile.md) we also showed how you can use prebuilt images, Dockerfiles, or Docker Compose files for your configurations
+ * In our previous guide on ["Using Images, Dockerfiles, and Docker Compose,"](/guide/dockerfile) we also showed how you can use prebuilt images, Dockerfiles, or Docker Compose files for your configurations
### Prebuild Examples
@@ -98,7 +98,7 @@ Let's walk through the Kubernetes prebuild as an example of how you can determin
* We see it references a prebuilt image, which will include dependencies that don't need to be explicitly mentioned in this end user dev container. Let's next go explore the dev container defining this prebuilt image
* **Explore the dev container defining your prebuilt image**
* We next open the config that defines the prebuilt image. This is contained in the [`.github/.devcontainer` folder](https://github.com/craiglpeters/kubernetes-devcontainer/tree/master/.github/.devcontainer)
- * We see there's a [`devcontainer.json`](https://github.com/craiglpeters/kubernetes-devcontainer/blob/master/.github/.devcontainer/devcontainer.json). It's much more detailed than the end user dev container we explored above and includes a variety of [Features](/_implementors/features.md)
+ * We see there's a [`devcontainer.json`](https://github.com/craiglpeters/kubernetes-devcontainer/blob/master/.github/.devcontainer/devcontainer.json). It's much more detailed than the end user dev container we explored above and includes a variety of [Features](/implementors/features)
* **Explore content in the prebuilt dev container's config**
* Each Feature defines additional functionality
* We can explore what each of them installs in their associated repo. Most appear to be defined in the [devcontainers/features repo](https://github.com/devcontainers/features/tree/main/src) as part of the dev container spec
@@ -123,11 +123,11 @@ There are a variety of benefits (some of which we've already explored) to creati
* We explored the prebuilt images we host as part of the spec in [devcontainers/images](https://github.com/devcontainers/images/tree/main/src). These can form a great base for other dev containers you'd like to create for more complex scenarios
* The spec has a concept of Development container "Templates" which are source files packaged together that encode configuration for a complete development environment
* A Template may be as simple as a `devcontainer.json` referencing a prebuilt image, and a `devcontainer-template.json`
- * You can learn more about Templates in our [Templates documentation](../_implementors/templates.md)
- * You can adopt and iterate on [existing Templates](../templates.html) from the spec and community, or you can [create and share your own](../_implementors/templates-distribution.md)
-* You can include Dev Container configuration and Feature metadata in prebuilt images via [image labels](https://docs.docker.com/config/labels-custom-metadata/). This makes the image self-contained since these settings are automatically picked up when the image is referenced - whether directly, in a `FROM` in a referenced Dockerfile, or in a Docker Compose file. You can learn more in our [reference docs](/_implementors/reference.md#metadata-in-image-labels)
+ * You can learn more about Templates in our [Templates documentation](../implementors/templates)
+ * You can adopt and iterate on [existing Templates](../templates.html) from the spec and community, or you can [create and share your own](../implementors/templates-distribution)
+* You can include Dev Container configuration and Feature metadata in prebuilt images via [image labels](https://docs.docker.com/config/labels-custom-metadata/). This makes the image self-contained since these settings are automatically picked up when the image is referenced - whether directly, in a `FROM` in a referenced Dockerfile, or in a Docker Compose file. You can learn more in our [reference docs](/implementors/reference#labels)
* You can use multi-stage Dockerfiles to create a prod container from your dev container
- * You'd typically stat with your prod image, then add to it
+ * You'd typically start with your prod image, then add to it
* Features provide a quick way to add development and CI specific layers that you wouldn't use in production
* For more information and an example, check out our [discussion on multi-stage builds](https://github.com/orgs/devcontainers/discussions/4#discussioncomment-4152158)
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..9e87fe4f 100644
--- a/features.html
+++ b/features.html
@@ -7,34 +7,69 @@
- 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 ba5eaa3f..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, in a variety of supporting tools and editors.
+
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 3569f680..e1e37d1a 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,19 +29,19 @@ 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.
+IntelliJ IDEA has early support dev containers that can be run remotely via an SSH connection or locally using Docker.
You may learn more in the [announcement blog post](https://blog.jetbrains.com/idea/2023/06/intellij-idea-2023-2-eap-6/#SupportforDevContainers).
@@ -49,25 +49,25 @@ You may learn more in the [announcement blog post](https://blog.jetbrains.com/id
### Dev Container CLI
-The dev container command line interface (CLI) is a reference implementation for the Dev Container spec. It is in development in the [devcontainers/cli](https://github.com/devcontainers/cli) repo. It is intended both for use directly and by tools or services that want to support the spec.
+The Dev Container Command Line Interface (CLI) is a reference implementation for the Dev Container Spec. It is in development in the [devcontainers/cli](https://github.com/devcontainers/cli) repo. It is intended both for use directly and by tools or services that want to support the spec.
-The CLI can take a `devcontainer.json` and create and configure a dev container from it. It allows for prebuilding dev container definitions using a CI or DevOps product like GitHub Actions. It can detect and include dev container features and apply them at container runtime, and run [lifecycle scripts](implementors/json_reference/#lifecycle-scripts) like `postCreateCommand`, providing more power than a plain `docker build` and `docker run`.
+The CLI can take a `devcontainer.json` and create and configure a dev container from it. It allows for prebuilding dev container configurations using a CI or DevOps product like GitHub Actions. It can detect and include dev container features and apply them at container runtime, and run [lifecycle scripts](implementors/json_reference/#lifecycle-scripts) like `postCreateCommand`, providing more power than a plain `docker build` and `docker run`.
#### VS Code extension CLI
-The [VS Code Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) includes a variation of the devcontainer CLI that adds the ability use the command line to open a dev container in VS Code. It is also automatically updated when the extension updates.
+The [VS Code Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) includes a variation of the Dev Container CLI that adds the ability use the command line to open a dev container in VS Code. It is also automatically updated when the extension updates.
Press cmd/ctrl+shift+p or F1 and select the **Dev Containers: Install devcontainer CLI** command to install it.
### Cachix devenv
-Cachix's **[devenv](https://devenv.sh/)** now supports automatically generating a `.devcontainer.json` file. This gives you a more convenient and consistent way to use [Nix](https://nixos.org/) with any Dev Container spec supporting tool or service!
+Cachix's **[devenv](https://devenv.sh/)** now supports automatically generating a `.devcontainer.json` file. This gives you a more convenient and consistent way to use [Nix](https://nixos.org/) with any Dev Container Spec supporting tool or service!
See [devenv documentation](https://devenv.sh/integrations/codespaces-devcontainer/) for detais.
-### Jetpack.io Devbox
+### 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!
@@ -91,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
@@ -136,11 +136,11 @@ You can customize which files are initially opened when the codespace is created
The paths are relative to the root of the repository. They will be opened in order, with the first file activated.
-Note that currently Codespaces reads these properties from devcontainer.json, not image metadata.
+> **Note** that currently Codespaces reads these properties from `devcontainer.json`, not image metadata.
#### Product specific limitations
-Some properties may apply differently to Codespaces.
+Some properties may apply differently to codespaces.
| Property or variable | Type | Description |
|----------|---------|----------------------|
@@ -151,7 +151,7 @@ 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
@@ -159,7 +159,6 @@ Some properties may apply differently to Codespaces.
When you import a GitHub repository into CodeSandbox, it will automatically provision a dedicated environment for every branch. Thanks to memory snapshotting, CodeSandbox then resumes and branches an environment in under two seconds.
-
CodeSandbox offers support for multiple editors, so you can code using the CodeSandbox web editor, VS Code, or the CodeSandbox iOS app.
**Tip:** After importing a repository into CodeSandbox, you can use the built-in UI to configure the environment using dev containers.
@@ -171,32 +170,38 @@ All properties specific to CodeSandbox are placed within a `.codesandbox` folder
More details about these can be found in the CodeSandbox [documentation](https://codesandbox.io/docs/learn/repositories/task).
-#### Product specific limitations
+#### Product specific limitations
CodeSandbox runs dev containers using rootless Podman instead of Docker. CodeSandbox also uses [devcontainers/cli](https://github.com/devcontainers/cli) to manage dev containers. So any limitations of rootless Podman and Dev Container CLI should apply to CodeSandbox.
-
The following properties apply differently to CodeSandbox.
| Property or variable | Type | Description |
|----------|---------|----------------------|
| `forwardPorts` | array | CodeSandbox does not need this property. All ports opened in dev containers will be mapped to a public URL automatically. |
-
| `portsAttributes` | object | CodeSandbox does not yet support this property. Ports are attached to tasks configured in `.codesandbox/tasks.json` and are attributed to the tasks.|
| `otherPortsAttributes` | object | CodeSandbox does not yet support this property. |
| `remoteUser` | string | CodeSandbox currently ignores this property and overrides this as `root`. CodeSandbox uses rootless Podman to run containers. Running with a non-root remote user is the same as running as a root remote user in rootless Podman, from a security perspective. CodeSandbox plans on supporting this in the future. |
| `shutdownAction` | string | Does not apply to CodeSandbox. |
-
| `capAdd` | array | CodeSandbox does not support adding docker capabilities. As the containers are run as a non-root user, capabilities that need root access will not work. |
-
| `features` | object | CodeSandbox automatically adds docker-cli to the container and connects to the host socket. Features like `docker-in-docker` and `docker-outside-of-docker` will work a bit differently. As the docker-cli and socket from host are accessible in the container, most use cases should work as expected. |
| `${localEnv:VARIABLE_NAME}` | Any | For CodeSandbox, the host is in the cloud rather than in your local machine.|
| `hostRequirements` | object | CodeSandbox does not yet support this property. |
-{: .table .table-bordered .table-responsive}
+{: .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.
+[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.
+
+### Gitpod
+
+[**Gitpod Flex**](https://www.gitpod.io/) is a platform for automating and standardizing development environments. Available as a self-hosted solution in your cloud or for local development through Gitpod Desktop, Gitpod Flex scales to support environments with up to 896 vCPUs and 12TB of RAM, including GPU support and compatibility with multiple editors like VS Code, JetBrains, Cursor, and Zed.
+
+Gitpod Flex fully adheres to the Dev Container Specification, enabling developers to create portable and reproducible environments through `devcontainer.json`. To apply changes, simply run `gitpod environment devcontainer rebuild` from within any development environment.
+
+
+For more details on constraints, customizations, and automation options, please refer to the [blog announcement](https://www.gitpod.io/blog/gitpod-supports-development-container).
+
### Schema
diff --git a/templates.html b/templates.html
index 089fe51c..a33d1702 100644
--- a/templates.html
+++ b/templates.html
@@ -17,18 +17,54 @@
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 %}