// ***************************************************************************** // Copyright (C) 2024 Typefox and others. // // This program and the accompanying materials are made available under the // terms of the Eclipse Public License v. 2.0 which is available at // http://www.eclipse.org/legal/epl-2.0. // // This Source Code may also be made available under the following Secondary // Licenses when the conditions for such availability set forth in the Eclipse // Public License v. 2.0 are satisfied: GNU General Public License, version 2 // with the GNU Classpath Exception which is available at // https://www.gnu.org/software/classpath/license.html. // // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** /** * Defines a dev container * type generated from https://containers.dev/implementors/json_schema/ and modified */ export type DevContainerConfiguration = (((DockerfileContainer | ImageContainer) & (NonComposeContainerBase)) | ComposeContainer) & DevContainerCommon & { location?: string }; export type DockerfileContainer = { /** * Docker build-related options. */ build: { /** * The location of the Dockerfile that defines the contents of the container. The path is relative to the folder containing the `devcontainer.json` file. */ dockerfile: string /** * The location of the context folder for building the Docker image. The path is relative to the folder containing the `devcontainer.json` file. */ context?: string } & BuildOptions [k: string]: unknown } | { /** * The location of the Dockerfile that defines the contents of the container. The path is relative to the folder containing the `devcontainer.json` file. */ dockerFile: string /** * The location of the context folder for building the Docker image. The path is relative to the folder containing the `devcontainer.json` file. */ context?: string /** * Docker build-related options. */ build?: { /** * Target stage in a multi-stage build. */ target?: string /** * Build arguments. */ args?: { [k: string]: string } /** * The image to consider as a cache. Use an array to specify multiple images. */ cacheFrom?: string | string[] [k: string]: unknown } [k: string]: unknown }; export interface BuildOptions { /** * Target stage in a multi-stage build. */ target?: string /** * Build arguments. */ args?: { [k: string]: string } /** * The image to consider as a cache. Use an array to specify multiple images. */ cacheFrom?: string | string[] [k: string]: unknown } export interface ImageContainer { /** * The docker image that will be used to create the container. */ image: string [k: string]: unknown } export interface NonComposeContainerBase { /** * Application ports that are exposed by the container. This can be a single port or an array of ports. Each port can be a number or a string. A number is mapped to * the same port on the host. A string is passed to Docker unchanged and can be used to map ports differently, e.g. '8000:8010'. */ appPort?: number | string | (number | string)[] /** * Container environment variables. */ containerEnv?: { [k: string]: string } /** * The user the container will be started with. The default is the user on the Docker image. */ containerUser?: string /** * Mount points to set up when creating the container. See Docker's documentation for the --mount option for the supported syntax. */ mounts?: (string | MountConfig)[] /** * The arguments required when starting in the container. */ runArgs?: string[] /** * Action to take when the user disconnects from the container in their editor. The default is to stop the container. */ shutdownAction?: 'none' | 'stopContainer' /** * Whether to overwrite the command specified in the image. The default is true. */ overrideCommand?: boolean /** * The path of the workspace folder inside the container. */ workspaceFolder?: string /** * The --mount parameter for docker run. The default is to mount the project folder at /workspaces/$project. */ workspaceMount?: string [k: string]: unknown } export interface ComposeContainer { /** * The name of the docker-compose file(s) used to start the services. */ dockerComposeFile: string | string[] /** * The service you want to work on. This is considered the primary container for your dev environment which your editor will connect to. */ service: string /** * An array of services that should be started and stopped. */ runServices?: string[] /** * The path of the workspace folder inside the container. This is typically the target path of a volume mount in the docker-compose.yml. */ workspaceFolder: string /** * Action to take when the user disconnects from the primary container in their editor. The default is to stop all of the compose containers. */ shutdownAction?: 'none' | 'stopCompose' /** * Whether to overwrite the command specified in the image. The default is false. */ overrideCommand?: boolean /** * Allows passing additional arguments to the 'docker compose up' command. */ composeUpArgs?: string[] [k: string]: unknown } export interface DevContainerCommon { /** * A name for the dev container which can be displayed to the user. */ name?: string /** * Features to add to the dev container. */ features?: { [k: string]: unknown } /** * Array consisting of the Feature id (without the semantic version) of Features in the order the user wants them to be installed. */ overrideFeatureInstallOrder?: string[] /** * Ports that are forwarded from the container to the local machine. Can be an integer port number, or a string of the format 'host:port_number'. */ forwardPorts?: (number | string)[] portsAttributes?: { /** * A port, range of ports (ex. '40000-55000'), or regular expression (ex. '.+\\/server.js'). * For a port number or range, the attributes will apply to that port number or range of port numbers. * Attributes which use a regular expression will apply to ports whose associated process command line matches the expression. * * This interface was referenced by `undefined`'s JSON-Schema definition * via the `patternProperty` '(^\d+(-\d+)?$)|(.+)'. */ [k: string]: { /** * Defines the action that occurs when the port is discovered for automatic forwarding */ onAutoForward?: | 'notify' | 'openBrowser' | 'openBrowserOnce' | 'openPreview' | 'silent' | 'ignore' /** * Automatically prompt for elevation (if needed) when this port is forwarded. Elevate is required if the local port is a privileged port. */ elevateIfNeeded?: boolean /** * Label that will be shown in the UI for this port. */ label?: string requireLocalPort?: boolean /** * The protocol to use when forwarding this port. */ protocol?: 'http' | 'https' [k: string]: unknown } } otherPortsAttributes?: { /** * Defines the action that occurs when the port is discovered for automatic forwarding */ onAutoForward?: | 'notify' | 'openBrowser' | 'openPreview' | 'silent' | 'ignore' /** * Automatically prompt for elevation (if needed) when this port is forwarded. Elevate is required if the local port is a privileged port. */ elevateIfNeeded?: boolean /** * Label that will be shown in the UI for this port. */ label?: string requireLocalPort?: boolean /** * The protocol to use when forwarding this port. */ protocol?: 'http' | 'https' } /** * Controls whether on Linux the container's user should be updated with the local user's UID and GID. On by default when opening from a local folder. */ updateRemoteUserUID?: boolean /** * Remote environment variables to set for processes spawned in the container including lifecycle scripts and any remote editor/IDE server process. */ remoteEnv?: { [k: string]: string | null } /** * The username to use for spawning processes in the container including lifecycle scripts and any remote editor/IDE server process. * The default is the same user as the container. */ remoteUser?: string /** * extensions to install in the container at launch. The expeceted format is publisher.name[@version]. * The default is no extensions being installed. */ extensions?: string[] /** * settings to set in the container at launch in the settings.json. The expected format is key=value. * The default is no preferences being set. */ settings?: { [k: string]: unknown } /** * 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. */ initializeCommand?: string | string[] /** * A command to run when creating the container. This command is run after 'initializeCommand' and before 'updateContentCommand'. * 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. */ onCreateCommand?: | string | string[] | { [k: string]: string | string[] } /** * A command to run when creating the container and rerun when the workspace content was updated while creating the container. * This command is run after 'onCreateCommand' and before 'postCreateCommand'. 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. */ updateContentCommand?: | string | string[] | { [k: string]: string | string[] } /** * A command to run after creating the container. This command is run after 'updateContentCommand' and before 'postStartCommand'. * 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. */ postCreateCommand?: | string | string[] | { [k: string]: string | string[] } /** * A command to run after starting the container. This command is run after 'postCreateCommand' and before 'postAttachCommand'. * 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. */ postStartCommand?: | string | string[] | { [k: string]: string | string[] } /** * A command to run when attaching to the container. This command is run after 'postStartCommand'. 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. */ postAttachCommand?: | string | string[] | { [k: string]: string | string[] } /** * The user command to wait for before continuing execution in the background while the UI is starting up. The default is 'updateContentCommand'. */ waitFor?: | 'initializeCommand' | 'onCreateCommand' | 'updateContentCommand' | 'postCreateCommand' | 'postStartCommand' /** * User environment probe to run. The default is 'loginInteractiveShell'. */ userEnvProbe?: | 'none' | 'loginShell' | 'loginInteractiveShell' | 'interactiveShell' /** * Host hardware requirements. */ hostRequirements?: { /** * Number of required CPUs. */ cpus?: number /** * Amount of required RAM in bytes. Supports units tb, gb, mb and kb. */ memory?: string /** * Amount of required disk space in bytes. Supports units tb, gb, mb and kb. */ storage?: string gpu?: | (true | false | 'optional') | { /** * Number of required cores. */ cores?: number /** * Amount of required RAM in bytes. Supports units tb, gb, mb and kb. */ memory?: string } [k: string]: unknown } /** * Tool-specific configuration. Each tool should use a JSON object subproperty with a unique name to group its customizations. */ customizations?: { [k: string]: unknown, vscode?: { /** * extensions to install in the container at launch. The expeceted format is publisher.name[@version]. * The default is no extensions being installed. */ extensions?: string[], /** * settings to set in the container at launch in the settings.json. The expected format is key=value. * The default is no preferences being set. */ settings?: { [k: string]: unknown } [k: string]: unknown } } additionalProperties?: { [k: string]: unknown } [k: string]: unknown } export interface MountConfig { source: string, target: string, type: 'volume' | 'bind', }