Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/specs/devcontainer-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ To apply the metadata together with a user's `devcontainer.json` at runtime the
| `updateRemoteUserUID` | `boolean` | Last value wins. | ✓ | |
| `hostRequirements` | `cpus`, `memory`, `storage`, `gpu` | Max value wins. | ✓ | |

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. The same merge logic is used when a `devcontainer.json` file [extends](devcontainerjson-reference.md#configuration-inheritance) another configuration file in the same repository.

### Notes

Expand Down
39 changes: 39 additions & 0 deletions docs/specs/devcontainerjson-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ Metadata properties marked with a 🏷️ can be stored in the `devcontainer.met
| Property | Type | Description |
|----------|------|-------------|
| `name` | string | A name for the dev container displayed in the UI |
| `extends` | string | A relative path to a JSON or JSONC file in the same repository to use as a base configuration. The referenced file is merged with this file using the [image metadata merge logic](devcontainer-reference.md#merge-logic). See [Configuration inheritance](#configuration-inheritance). |
| `forwardPorts` 🏷️ | array | An array of port numbers or `"host:port"` values (e.g. `[3000, "db:5432"]`) that should always be forwarded from inside the primary container to the local machine (including on the web). The property is most useful for forwarding ports that cannot be auto-forwarded because the related process that starts before the `devcontainer.json` supporting service / tool connects or for forwarding a service not in the primary container in Docker Compose scenarios (e.g. `"db:5432"`). Defaults to `[]`. |
| `portsAttributes` 🏷️ | object | Object that maps a port number, `"host:port"` value, range, or regular expression to a set of default options. See [port attributes](#port-attributes) for available options. For example: <br />`"portsAttributes": {"3000": {"label": "Application port"}}` |
| `otherPortsAttributes` 🏷️ | object | Default options for ports, port ranges, and hosts that aren't configured using `portsAttributes`. See [port attributes](#port-attributes) for available options. For example: <br /> `"otherPortsAttributes": {"onAutoForward": "silent"}` |
Expand All @@ -29,6 +30,44 @@ Metadata properties marked with a 🏷️ can be stored in the `devcontainer.met
| `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: <br />`"overrideFeatureInstallОrder": [ "ghcr.io/devcontainers/features/common-utils", "ghcr.io/devcontainers/features/github-cli" ]` |
| `customizations` 🏷️| object | Product specific properties, defined in [supporting tools](supporting-tools.md) |

## Configuration inheritance

Multiple teams collaborating on a common codebase may need slightly different `devcontainer.json` settings. The `extends` property lets a configuration inherit from another JSON or JSONC file in the same repository:

```jsonc
// .devcontainer/defaults.json
{
"name": "example/project",
"forwardPorts": [80, 5432],
"hostRequirements": {
"storage": "64gb",
"memory": "16gb"
}
}

// .devcontainer/devcontainer.json
{
"extends": "./defaults.json",
"forwardPorts": [2222],
"hostRequirements": {
"memory": "32gb"
},
"onCreateCommand": ".devcontainer/on-create-command.sh"
}
```

`extends` is a path relative to the file that declares it (for example `"./defaults.json"`, `"../defaults.json"`, or `"./dev/defaults.json"`). Referenced files may themselves use `extends`. Absolute paths and URLs are not supported.

The referenced configuration is merged with the current file using the same [merge logic](devcontainer-reference.md#merge-logic) applied to image metadata, with the current file considered last:

- Array properties such as `forwardPorts`, `capAdd`, and `securityOpt` are the union of values without duplicates.
- `hostRequirements` takes the maximum of each field.
- Object maps such as `remoteEnv`, `containerEnv`, `features`, and `customizations` merge per key, with the current file winning on conflicts.
- Boolean `init` and `privileged` are `true` if at least one value is `true`.
- Scalar properties such as `name`, `image`, `remoteUser`, and lifecycle commands use last value wins.

The `extends` property itself is not present in the merged result.

## Scenario specific properties

The focus of `devcontainer.json` is to describe how to enrich a container for the purposes of development rather than acting as a multi-container orchestrator format. Instead, container orchestrator formats can be referenced when needed to manage multiple containers and their lifecycles. Today, `devcontainer.json` includes scenario specific properties for working without a container orchestrator (by directly referencing an image or Dockerfile) and for using Docker Compose as a simple multi-container orchestrator.
Expand Down
4 changes: 4 additions & 0 deletions schemas/devContainer.base.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
"type": "string",
"description": "A name for the dev container which can be displayed to the user."
},
"extends": {
"type": "string",
"description": "A relative path to a JSON or JSONC file in the same repository whose configuration is used as a base. The referenced file is merged with this file using the image metadata merge logic."
},
"features": {
"type": "object",
"description": "Features to add to the dev container.",
Expand Down