diff --git a/CHANGELOG.md b/CHANGELOG.md index 03c2392..e9651a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ All notable changes to the Docker Language Server will be documented in this file. +## [Unreleased] + +- Compose + - update schema to the latest version + ## [0.19.0] - 2025-09-16 ### Added diff --git a/internal/compose/completion_test.go b/internal/compose/completion_test.go index 529c8f2..6383370 100644 --- a/internal/compose/completion_test.go +++ b/internal/compose/completion_test.go @@ -1643,6 +1643,14 @@ services: InsertTextMode: types.CreateInsertTextModePointer(protocol.InsertTextModeAsIs), InsertTextFormat: types.CreateInsertTextFormatPointer(protocol.InsertTextFormatSnippet), }, + { + Label: "initial_sync", + Detail: types.CreateStringPointer("boolean"), + Documentation: "Ensure that an initial synchronization is done before starting watch mode for sync+x triggers", + TextEdit: textEdit("initial_sync: ${1|true,false|}", 5, 10, 0), + InsertTextMode: types.CreateInsertTextModePointer(protocol.InsertTextModeAsIs), + InsertTextFormat: types.CreateInsertTextFormatPointer(protocol.InsertTextFormatSnippet), + }, { Label: "path", Detail: types.CreateStringPointer("string"), @@ -4624,7 +4632,7 @@ func TestCompletion_NoResultExpected(t *testing.T) { } for _, entry := range fileStructure { if entry.isDir { - require.NoError(t, os.Mkdir(filepath.Join(dir, entry.name), 0755)) + require.NoError(t, os.Mkdir(filepath.Join(dir, entry.name), 0o755)) } else { f, err := os.Create(filepath.Join(dir, entry.name)) require.NoError(t, err) @@ -4758,7 +4766,7 @@ func TestCompletion_VolumeFolderListing(t *testing.T) { } for _, entry := range fileStructure { if entry.isDir { - require.NoError(t, os.Mkdir(filepath.Join(dir, entry.name), 0755)) + require.NoError(t, os.Mkdir(filepath.Join(dir, entry.name), 0o755)) } else { f, err := os.Create(filepath.Join(dir, entry.name)) require.NoError(t, err) @@ -5557,7 +5565,7 @@ func createFileStructure(t *testing.T) string { } for _, entry := range fileStructure { if entry.isDir { - require.NoError(t, os.Mkdir(filepath.Join(dir, entry.name), 0755)) + require.NoError(t, os.Mkdir(filepath.Join(dir, entry.name), 0o755)) } else { f, err := os.Create(filepath.Join(dir, entry.name)) require.NoError(t, err) diff --git a/internal/compose/compose-spec.json b/internal/compose/compose-spec.json index 5591f05..d52c381 100644 --- a/internal/compose/compose-spec.json +++ b/internal/compose/compose-spec.json @@ -4,16 +4,19 @@ "type": "object", "title": "Compose Specification", "description": "The Compose file is a YAML file defining a multi-containers based application.", + "properties": { "version": { "type": "string", "deprecated": true, "description": "declared for backward compatibility, ignored. Please remove it." }, + "name": { "type": "string", "description": "define the Compose project name, until user defines one explicitly." }, + "include": { "type": "array", "items": { @@ -21,6 +24,7 @@ }, "description": "compose sub-projects to be included." }, + "services": { "type": "object", "patternProperties": { @@ -31,6 +35,7 @@ "additionalProperties": false, "description": "The services that will be used by your application." }, + "models": { "type": "object", "patternProperties": { @@ -40,6 +45,8 @@ }, "description": "Language models that will be used by your application." }, + + "networks": { "type": "object", "patternProperties": { @@ -49,6 +56,7 @@ }, "description": "Networks that are shared among multiple services." }, + "volumes": { "type": "object", "patternProperties": { @@ -59,6 +67,7 @@ "additionalProperties": false, "description": "Named volumes that are shared among multiple services." }, + "secrets": { "type": "object", "patternProperties": { @@ -69,6 +78,7 @@ "additionalProperties": false, "description": "Secrets that are shared among multiple services." }, + "configs": { "type": "object", "patternProperties": { @@ -80,174 +90,54 @@ "description": "Configurations that are shared among multiple services." } }, - "patternProperties": { - "^x-": {} - }, + + "patternProperties": {"^x-": {}}, "additionalProperties": false, + "definitions": { + "service": { "type": "object", "description": "Configuration for a service.", "properties": { - "develop": { - "$ref": "#/definitions/development" - }, - "deploy": { - "$ref": "#/definitions/deployment" - }, - "annotations": { - "$ref": "#/definitions/list_or_dict" - }, - "attach": { - "type": [ - "boolean", - "string" - ] - }, + "develop": {"$ref": "#/definitions/development"}, + "deploy": {"$ref": "#/definitions/deployment"}, + "annotations": {"$ref": "#/definitions/list_or_dict"}, + "attach": {"type": ["boolean", "string"]}, "build": { "description": "Configuration options for building the service's image.", "oneOf": [ - { - "type": "string", - "description": "Path to the build context. Can be a relative path or a URL." - }, + {"type": "string", "description": "Path to the build context. Can be a relative path or a URL."}, { "type": "object", "properties": { - "context": { - "type": "string", - "description": "Path to the build context. Can be a relative path or a URL." - }, - "dockerfile": { - "type": "string", - "description": "Name of the Dockerfile to use for building the image." - }, - "dockerfile_inline": { - "type": "string", - "description": "Inline Dockerfile content to use instead of a Dockerfile from the build context." - }, - "entitlements": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of extra privileged entitlements to grant to the build process." - }, - "args": { - "$ref": "#/definitions/list_or_dict", - "description": "Build-time variables, specified as a map or a list of KEY=VAL pairs." - }, - "ssh": { - "$ref": "#/definitions/list_or_dict", - "description": "SSH agent socket or keys to expose to the build. Format is either a string or a list of 'default|[=|[,]]'." - }, - "labels": { - "$ref": "#/definitions/list_or_dict", - "description": "Labels to apply to the built image." - }, - "cache_from": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of sources the image builder should use for cache resolution" - }, - "cache_to": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Cache destinations for the build cache." - }, - "no_cache": { - "type": [ - "boolean", - "string" - ], - "description": "Do not use cache when building the image." - }, - "additional_contexts": { - "$ref": "#/definitions/list_or_dict", - "description": "Additional build contexts to use, specified as a map of name to context path or URL." - }, - "network": { - "type": "string", - "description": "Network mode to use for the build. Options include 'default', 'none', 'host', or a network name." - }, - "provenance": { - "type": [ - "string", - "boolean" - ], - "description": "Add a provenance attestation" - }, - "sbom": { - "type": [ - "string", - "boolean" - ], - "description": "Add a SBOM attestation" - }, - "pull": { - "type": [ - "boolean", - "string" - ], - "description": "Always attempt to pull a newer version of the image." - }, - "target": { - "type": "string", - "description": "Build stage to target in a multi-stage Dockerfile." - }, - "shm_size": { - "type": [ - "integer", - "string" - ], - "description": "Size of /dev/shm for the build container. A string value can use suffix like '2g' for 2 gigabytes." - }, - "extra_hosts": { - "$ref": "#/definitions/extra_hosts", - "description": "Add hostname mappings for the build container." - }, - "isolation": { - "type": "string", - "description": "Container isolation technology to use for the build process." - }, - "privileged": { - "type": [ - "boolean", - "string" - ], - "description": "Give extended privileges to the build container." - }, - "secrets": { - "$ref": "#/definitions/service_config_or_secret", - "description": "Secrets to expose to the build. These are accessible at build-time." - }, - "tags": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Additional tags to apply to the built image." - }, - "ulimits": { - "$ref": "#/definitions/ulimits", - "description": "Override the default ulimits for the build container." - }, - "platforms": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Platforms to build for, e.g., 'linux/amd64', 'linux/arm64', or 'windows/amd64'." - } + "context": {"type": "string", "description": "Path to the build context. Can be a relative path or a URL."}, + "dockerfile": {"type": "string", "description": "Name of the Dockerfile to use for building the image."}, + "dockerfile_inline": {"type": "string", "description": "Inline Dockerfile content to use instead of a Dockerfile from the build context."}, + "entitlements": {"type": "array", "items": {"type": "string"}, "description": "List of extra privileged entitlements to grant to the build process."}, + "args": {"$ref": "#/definitions/list_or_dict", "description": "Build-time variables, specified as a map or a list of KEY=VAL pairs."}, + "ssh": {"$ref": "#/definitions/list_or_dict", "description": "SSH agent socket or keys to expose to the build. Format is either a string or a list of 'default|[=|[,]]'."}, + "labels": {"$ref": "#/definitions/list_or_dict", "description": "Labels to apply to the built image."}, + "cache_from": {"type": "array", "items": {"type": "string"}, "description": "List of sources the image builder should use for cache resolution"}, + "cache_to": {"type": "array", "items": {"type": "string"}, "description": "Cache destinations for the build cache."}, + "no_cache": {"type": ["boolean", "string"], "description": "Do not use cache when building the image."}, + "additional_contexts": {"$ref": "#/definitions/list_or_dict", "description": "Additional build contexts to use, specified as a map of name to context path or URL."}, + "network": {"type": "string", "description": "Network mode to use for the build. Options include 'default', 'none', 'host', or a network name."}, + "provenance": {"type": ["string","boolean"], "description": "Add a provenance attestation"}, + "sbom": {"type": ["string","boolean"], "description": "Add a SBOM attestation"}, + "pull": {"type": ["boolean", "string"], "description": "Always attempt to pull a newer version of the image."}, + "target": {"type": "string", "description": "Build stage to target in a multi-stage Dockerfile."}, + "shm_size": {"type": ["integer", "string"], "description": "Size of /dev/shm for the build container. A string value can use suffix like '2g' for 2 gigabytes."}, + "extra_hosts": {"$ref": "#/definitions/extra_hosts", "description": "Add hostname mappings for the build container."}, + "isolation": {"type": "string", "description": "Container isolation technology to use for the build process."}, + "privileged": {"type": ["boolean", "string"], "description": "Give extended privileges to the build container."}, + "secrets": {"$ref": "#/definitions/service_config_or_secret", "description": "Secrets to expose to the build. These are accessible at build-time."}, + "tags": {"type": "array", "items": {"type": "string"}, "description": "Additional tags to apply to the built image."}, + "ulimits": {"$ref": "#/definitions/ulimits", "description": "Override the default ulimits for the build container."}, + "platforms": {"type": "array", "items": {"type": "string"}, "description": "Platforms to build for, e.g., 'linux/amd64', 'linux/arm64', or 'windows/amd64'."} }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } ] }, @@ -258,70 +148,50 @@ "device_read_bps": { "type": "array", "description": "Limit read rate (bytes per second) from a device.", - "items": { - "$ref": "#/definitions/blkio_limit" - } + "items": {"$ref": "#/definitions/blkio_limit"} }, "device_read_iops": { "type": "array", "description": "Limit read rate (IO per second) from a device.", - "items": { - "$ref": "#/definitions/blkio_limit" - } + "items": {"$ref": "#/definitions/blkio_limit"} }, "device_write_bps": { "type": "array", "description": "Limit write rate (bytes per second) to a device.", - "items": { - "$ref": "#/definitions/blkio_limit" - } + "items": {"$ref": "#/definitions/blkio_limit"} }, "device_write_iops": { "type": "array", "description": "Limit write rate (IO per second) to a device.", - "items": { - "$ref": "#/definitions/blkio_limit" - } + "items": {"$ref": "#/definitions/blkio_limit"} }, "weight": { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "Block IO weight (relative weight) for the service, between 10 and 1000." }, "weight_device": { "type": "array", "description": "Block IO weight (relative weight) for specific devices.", - "items": { - "$ref": "#/definitions/blkio_weight" - } + "items": {"$ref": "#/definitions/blkio_weight"} } }, "additionalProperties": false }, "cap_add": { "type": "array", - "items": { - "type": "string" - }, + "items": {"type": "string"}, "uniqueItems": true, "description": "Add Linux capabilities. For example, 'CAP_SYS_ADMIN', 'SYS_ADMIN', or 'NET_ADMIN'." }, "cap_drop": { "type": "array", - "items": { - "type": "string" - }, + "items": {"type": "string"}, "uniqueItems": true, "description": "Drop Linux capabilities. For example, 'CAP_SYS_ADMIN', 'SYS_ADMIN', or 'NET_ADMIN'." }, "cgroup": { "type": "string", - "enum": [ - "host", - "private" - ], + "enum": ["host", "private"], "description": "Specify the cgroup namespace to join. Use 'host' to use the host's cgroup namespace, or 'private' to use a private cgroup namespace." }, "cgroup_parent": { @@ -343,69 +213,40 @@ }, "cpu_count": { "oneOf": [ - { - "type": "string" - }, - { - "type": "integer", - "minimum": 0 - } + {"type": "string"}, + {"type": "integer", "minimum": 0} ], "description": "Number of usable CPUs." }, "cpu_percent": { "oneOf": [ - { - "type": "string" - }, - { - "type": "integer", - "minimum": 0, - "maximum": 100 - } + {"type": "string"}, + {"type": "integer", "minimum": 0, "maximum": 100} ], "description": "Percentage of CPU resources to use." }, "cpu_shares": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "CPU shares (relative weight) for the container." }, "cpu_quota": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Limit the CPU CFS (Completely Fair Scheduler) quota." }, "cpu_period": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Limit the CPU CFS (Completely Fair Scheduler) period." }, "cpu_rt_period": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Limit the CPU real-time period in microseconds or a duration." }, "cpu_rt_runtime": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Limit the CPU real-time runtime in microseconds or a duration." }, "cpus": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Number of CPUs to use. A floating-point value is supported to request partial CPUs." }, "cpuset": { @@ -430,15 +271,11 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "depends_on": { "oneOf": [ - { - "$ref": "#/definitions/list_of_strings" - }, + {"$ref": "#/definitions/list_of_strings"}, { "type": "object", "additionalProperties": false, @@ -446,35 +283,24 @@ "^[a-zA-Z0-9._-]+$": { "type": "object", "additionalProperties": false, - "patternProperties": { - "^x-": {} - }, + "patternProperties": {"^x-": {}}, "properties": { "restart": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Whether to restart dependent services when this service is restarted." }, "required": { - "type": "boolean", + "type": "boolean", "default": true, "description": "Whether the dependency is required for the dependent service to start." }, "condition": { "type": "string", - "enum": [ - "service_started", - "service_healthy", - "service_completed_successfully" - ], + "enum": ["service_started", "service_healthy", "service_completed_successfully"], "description": "Condition to wait for. 'service_started' waits until the service has started, 'service_healthy' waits until the service is healthy (as defined by its healthcheck), 'service_completed_successfully' waits until the service has completed successfully." } }, - "required": [ - "condition" - ] + "required": ["condition"] } } } @@ -490,14 +316,10 @@ "description": "List of device mappings for the container.", "items": { "oneOf": [ - { - "type": "string" - }, + {"type": "string"}, { "type": "object", - "required": [ - "source" - ], + "required": ["source"], "properties": { "source": { "type": "string", @@ -513,9 +335,7 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } ] } @@ -526,9 +346,7 @@ }, "dns_opt": { "type": "array", - "items": { - "type": "string" - }, + "items": {"type": "string"}, "uniqueItems": true, "description": "Custom DNS options to be passed to the container's DNS resolver." }, @@ -559,19 +377,14 @@ "expose": { "type": "array", "items": { - "type": [ - "string", - "number" - ] + "type": ["string", "number"] }, "uniqueItems": true, "description": "Expose ports without publishing them to the host machine - they'll only be accessible to linked services." }, "extends": { "oneOf": [ - { - "type": "string" - }, + {"type": "string"}, { "type": "object", "properties": { @@ -584,9 +397,7 @@ "description": "The file path where the service to extend is defined." } }, - "required": [ - "service" - ], + "required": ["service"], "additionalProperties": false } ], @@ -595,9 +406,7 @@ "provider": { "type": "object", "description": "Specify a service which will not be manage by Compose directly, and delegate its management to an external provider.", - "required": [ - "type" - ], + "required": ["type"], "properties": { "type": { "type": "string", @@ -607,40 +416,19 @@ "type": "object", "description": "Provider-specific options.", "patternProperties": { - "^.+$": { - "oneOf": [ - { - "type": [ - "string", - "number", - "boolean" - ] - }, - { - "type": "array", - "items": { - "type": [ - "string", - "number", - "boolean" - ] - } - } - ] - } + "^.+$": {"oneOf": [ + { "type": ["string", "number", "boolean"] }, + { "type": "array", "items": {"type": ["string", "number", "boolean"]}} + ]} } } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "external_links": { "type": "array", - "items": { - "type": "string" - }, + "items": {"type": "string"}, "uniqueItems": true, "description": "Link to services started outside this Compose application. Specify services as :." }, @@ -655,10 +443,7 @@ "group_add": { "type": "array", "items": { - "type": [ - "string", - "number" - ] + "type": ["string", "number"] }, "uniqueItems": true, "description": "Add additional groups which user inside the container should be member of." @@ -676,10 +461,7 @@ "description": "Specify the image to start the container from. Can be a repository/tag, a digest, or a local image ID." }, "init": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Run as an init process inside the container that forwards signals and reaps processes." }, "ipc": { @@ -696,9 +478,7 @@ }, "links": { "type": "array", - "items": { - "type": "string" - }, + "items": {"type": "string"}, "uniqueItems": true, "description": "Link to containers in another service. Either specify both the service name and a link alias (SERVICE:ALIAS), or just the service name." }, @@ -714,51 +494,31 @@ "type": "object", "description": "Options for the logging driver.", "patternProperties": { - "^.+$": { - "type": [ - "string", - "number", - "null" - ] - } + "^.+$": {"type": ["string", "number", "null"]} } } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "mac_address": { "type": "string", "description": "Container MAC address to set." }, "mem_limit": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Memory limit for the container. A string value can use suffix like '2g' for 2 gigabytes." }, "mem_reservation": { - "type": [ - "string", - "integer" - ], + "type": ["string", "integer"], "description": "Memory reservation for the container." }, "mem_swappiness": { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "Container memory swappiness as percentage (0 to 100)." }, "memswap_limit": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Amount of memory the container is allowed to swap to disk. Set to -1 to enable unlimited swap." }, "network_mode": { @@ -767,11 +527,8 @@ }, "models": { "oneOf": [ - { - "$ref": "#/definitions/list_of_strings" - }, - { - "type": "object", + {"$ref": "#/definitions/list_of_strings"}, + {"type": "object", "patternProperties": { "^[a-zA-Z0-9._-]+$": { "type": "object", @@ -786,9 +543,7 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } } } @@ -797,9 +552,7 @@ }, "networks": { "oneOf": [ - { - "$ref": "#/definitions/list_of_strings" - }, + {"$ref": "#/definitions/list_of_strings"}, { "type": "object", "patternProperties": { @@ -836,12 +589,7 @@ "type": "object", "description": "Driver options for this network.", "patternProperties": { - "^.+$": { - "type": [ - "string", - "number" - ] - } + "^.+$": {"type": ["string", "number"]} } }, "priority": { @@ -854,13 +602,9 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, - { - "type": "null" - } + {"type": "null"} ] } }, @@ -870,37 +614,22 @@ "description": "Networks to join, referencing entries under the top-level networks key. Can be a list of network names or a mapping of network name to network configuration." }, "oom_kill_disable": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Disable OOM Killer for the container." }, "oom_score_adj": { "oneOf": [ - { - "type": "string" - }, - { - "type": "integer", - "minimum": -1000, - "maximum": 1000 - } + {"type": "string"}, + {"type": "integer", "minimum": -1000, "maximum": 1000} ], "description": "Tune host's OOM preferences for the container (accepts -1000 to 1000)." }, "pid": { - "type": [ - "string", - "null" - ], + "type": ["string", "null"], "description": "PID mode for container." }, "pids_limit": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Tune a container's PIDs limit. Set to -1 for unlimited PIDs." }, "platform": { @@ -912,12 +641,8 @@ "description": "Expose container ports. Short format ([HOST:]CONTAINER[/PROTOCOL]).", "items": { "oneOf": [ - { - "type": "number" - }, - { - "type": "string" - }, + {"type": "number"}, + {"type": "string"}, { "type": "object", "properties": { @@ -934,17 +659,11 @@ "description": "The host IP to bind to." }, "target": { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "The port inside the container." }, "published": { - "type": [ - "string", - "integer" - ], + "type": ["string", "integer"], "description": "The publicly exposed port." }, "protocol": { @@ -957,9 +676,7 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } ] }, @@ -967,23 +684,16 @@ }, "post_start": { "type": "array", - "items": { - "$ref": "#/definitions/service_hook" - }, + "items": {"$ref": "#/definitions/service_hook"}, "description": "Commands to run after the container starts. If any command fails, the container stops." }, "pre_stop": { "type": "array", - "items": { - "$ref": "#/definitions/service_hook" - }, + "items": {"$ref": "#/definitions/service_hook"}, "description": "Commands to run before the container stops. If any command fails, the container stop is aborted." }, "privileged": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Give extended privileges to the service container." }, "profiles": { @@ -1000,10 +710,7 @@ "description": "Time after which to refresh the image. Used with pull_policy=refresh." }, "read_only": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Mount the container's filesystem as read only." }, "restart": { @@ -1015,25 +722,17 @@ "description": "Runtime to use for this container, e.g., 'runc'." }, "scale": { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "Number of containers to deploy for this service." }, "security_opt": { "type": "array", - "items": { - "type": "string" - }, + "items": {"type": "string"}, "uniqueItems": true, "description": "Override the default labeling scheme for each container." }, "shm_size": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Size of /dev/shm. A string value can use suffix like '2g' for 2 gigabytes." }, "secrets": { @@ -1045,10 +744,7 @@ "description": "Kernel parameters to set in the container. You can use either an array or a list." }, "stdin_open": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Keep STDIN open even if not attached." }, "stop_grace_period": { @@ -1068,10 +764,7 @@ "description": "Mount a temporary filesystem (tmpfs) into the container. Can be a single value or a list." }, "tty": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Allocate a pseudo-TTY to service container." }, "ulimits": { @@ -1099,25 +792,14 @@ "description": "Mount host paths or named volumes accessible to the container. Short syntax (VOLUME:CONTAINER_PATH[:MODE])", "items": { "oneOf": [ - { - "type": "string" - }, + {"type": "string"}, { "type": "object", - "required": [ - "type" - ], + "required": ["type"], "properties": { "type": { "type": "string", - "enum": [ - "bind", - "volume", - "tmpfs", - "cluster", - "npipe", - "image" - ], + "enum": ["bind", "volume", "tmpfs", "cluster", "npipe", "image"], "description": "The mount type: bind for mounting host directories, volume for named volumes, tmpfs for temporary filesystems, cluster for cluster volumes, npipe for named pipes, or image for mounting from an image." }, "source": { @@ -1129,10 +811,7 @@ "description": "The path in the container where the volume is mounted." }, "read_only": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Flag to set the volume as read-only." }, "consistency": { @@ -1148,35 +827,22 @@ "description": "The propagation mode for the bind mount: 'shared', 'slave', 'private', 'rshared', 'rslave', or 'rprivate'." }, "create_host_path": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Create the host path if it doesn't exist." }, "recursive": { "type": "string", - "enum": [ - "enabled", - "disabled", - "writable", - "readonly" - ], + "enum": ["enabled", "disabled", "writable", "readonly"], "description": "Recursively mount the source directory." }, "selinux": { "type": "string", - "enum": [ - "z", - "Z" - ], + "enum": ["z", "Z"], "description": "SELinux relabeling options: 'z' for shared content, 'Z' for private unshared content." } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "volume": { "type": "object", @@ -1187,10 +853,7 @@ "description": "Labels to apply to the volume." }, "nocopy": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Flag to disable copying of data from a container when a volume is created." }, "subpath": { @@ -1199,9 +862,7 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "tmpfs": { "type": "object", @@ -1209,28 +870,18 @@ "properties": { "size": { "oneOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "string" - } + {"type": "integer", "minimum": 0}, + {"type": "string"} ], "description": "Size of the tmpfs mount in bytes." }, "mode": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "File mode of the tmpfs in octal." } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "image": { "type": "object", @@ -1242,15 +893,11 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } ] }, @@ -1258,9 +905,7 @@ }, "volumes_from": { "type": "array", - "items": { - "type": "string" - }, + "items": {"type": "string"}, "uniqueItems": true, "description": "Mount volumes from another service or container. Optionally specify read-only access (ro) or read-write (rw)." }, @@ -1269,20 +914,16 @@ "description": "The working directory in which the entrypoint or command will be run" } }, - "patternProperties": { - "^x-": {} - }, + "patternProperties": {"^x-": {}}, "additionalProperties": false }, + "healthcheck": { "type": "object", "description": "Configuration options to determine whether the container is healthy.", "properties": { "disable": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Disable any container-specified healthcheck. Set to true to disable." }, "interval": { @@ -1290,23 +931,13 @@ "description": "Time between running the check (e.g., '1s', '1m30s'). Default: 30s." }, "retries": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Number of consecutive failures needed to consider the container as unhealthy. Default: 3." }, "test": { "oneOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } + {"type": "string"}, + {"type": "array", "items": {"type": "string"}} ], "description": "The test to perform to check container health. Can be a string or a list. The first item is either NONE, CMD, or CMD-SHELL. If it's CMD, the rest of the command is exec'd. If it's CMD-SHELL, the rest is run in the shell." }, @@ -1324,15 +955,10 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "development": { - "type": [ - "object", - "null" - ], + "type": ["object", "null"], "description": "Development configuration for the service, used for development workflows.", "properties": { "watch": { @@ -1340,10 +966,7 @@ "description": "Configure watch mode for the service, which monitors file changes and performs actions in response.", "items": { "type": "object", - "required": [ - "path", - "action" - ], + "required": ["path", "action"], "properties": { "ignore": { "$ref": "#/definitions/string_or_list", @@ -1359,13 +982,7 @@ }, "action": { "type": "string", - "enum": [ - "rebuild", - "sync", - "restart", - "sync+restart", - "sync+exec" - ], + "enum": ["rebuild", "sync", "restart", "sync+restart", "sync+exec"], "description": "Action to take when a change is detected: rebuild the container, sync files, restart the container, sync and restart, or sync and execute a command." }, "target": { @@ -1375,25 +992,22 @@ "exec": { "$ref": "#/definitions/service_hook", "description": "Command to execute when a change is detected and action is sync+exec." + }, + "initial_sync": { + "type": "boolean", + "description": "Ensure that an initial synchronization is done before starting watch mode for sync+x triggers" } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "deployment": { - "type": [ - "object", - "null" - ], + "type": ["object", "null"], "description": "Deployment configuration for the service.", "properties": { "mode": { @@ -1405,10 +1019,7 @@ "description": "Endpoint mode for the service: 'vip' (default) or 'dnsrr'." }, "replicas": { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "Number of replicas of the service container to run." }, "labels": { @@ -1420,10 +1031,7 @@ "description": "Configuration for rolling back a service update.", "properties": { "parallelism": { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "The number of containers to rollback at a time. If set to 0, all containers rollback simultaneously." }, "delay": { @@ -1439,35 +1047,24 @@ "description": "Duration to monitor each task for failures after it is created (e.g., '1s', '1m30s')." }, "max_failure_ratio": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Failure rate to tolerate during a rollback." }, "order": { "type": "string", - "enum": [ - "start-first", - "stop-first" - ], + "enum": ["start-first", "stop-first"], "description": "Order of operations during rollbacks: 'stop-first' (default) or 'start-first'." } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "update_config": { "type": "object", "description": "Configuration for updating a service.", "properties": { "parallelism": { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "The number of containers to update at a time." }, "delay": { @@ -1483,25 +1080,17 @@ "description": "Duration to monitor each updated task for failures after it is created (e.g., '1s', '1m30s')." }, "max_failure_ratio": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Failure rate to tolerate during an update (0 to 1)." }, "order": { "type": "string", - "enum": [ - "start-first", - "stop-first" - ], + "enum": ["start-first", "stop-first"], "description": "Order of operations during updates: 'stop-first' (default) or 'start-first'." } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "resources": { "type": "object", @@ -1512,10 +1101,7 @@ "description": "Resource limits for the service containers.", "properties": { "cpus": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Limit for how much of the available CPU resources, as number of cores, a container can use." }, "memory": { @@ -1523,27 +1109,19 @@ "description": "Limit on the amount of memory a container can allocate (e.g., '1g', '1024m')." }, "pids": { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "Maximum number of PIDs available to the container." } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "reservations": { "type": "object", "description": "Resource reservations for the service containers.", "properties": { "cpus": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Reservation for how much of the available CPU resources, as number of cores, a container can use." }, "memory": { @@ -1560,15 +1138,11 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "restart_policy": { "type": "object", @@ -1583,10 +1157,7 @@ "description": "Delay between restart attempts (e.g., '1s', '1m30s')." }, "max_attempts": { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "Maximum number of restart attempts before giving up." }, "window": { @@ -1595,9 +1166,7 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "placement": { "type": "object", @@ -1605,9 +1174,7 @@ "properties": { "constraints": { "type": "array", - "items": { - "type": "string" - }, + "items": {"type": "string"}, "description": "Placement constraints for the service (e.g., 'node.role==manager')." }, "preferences": { @@ -1622,30 +1189,22 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } }, "max_replicas_per_node": { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "Maximum number of replicas of the service." } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, + "generic_resources": { "type": "array", "description": "User-defined resources for services, allowing services to reserve specialized hardware resources.", @@ -1661,25 +1220,19 @@ "description": "Type of resource (e.g., 'GPU', 'FPGA', 'SSD')." }, "value": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "Number of resources of this kind to reserve." } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } }, + "devices": { "type": "array", "description": "Device reservations for containers, allowing services to access specific hardware devices.", @@ -1691,10 +1244,7 @@ "description": "List of capabilities the device needs to have (e.g., 'gpu', 'compute', 'utility')." }, "count": { - "type": [ - "string", - "integer" - ], + "type": ["string", "integer"], "description": "Number of devices of this type to reserve." }, "device_ids": { @@ -1711,21 +1261,18 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - }, + "patternProperties": {"^x-": {}}, "required": [ "capabilities" ] } }, + "gpus": { "oneOf": [ { "type": "string", - "enum": [ - "all" - ], + "enum": ["all"], "description": "Use all available GPUs." }, { @@ -1739,10 +1286,7 @@ "description": "List of capabilities the GPU needs to have (e.g., 'compute', 'utility')." }, "count": { - "type": [ - "string", - "integer" - ], + "type": ["string", "integer"], "description": "Number of GPUs to use." }, "device_ids": { @@ -1760,18 +1304,15 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } ] }, + "include": { "description": "Compose application or sub-projects to be included.", "oneOf": [ - { - "type": "string" - }, + {"type": "string"}, { "type": "object", "properties": { @@ -1792,11 +1333,9 @@ } ] }, + "network": { - "type": [ - "object", - "null" - ], + "type": ["object", "null"], "description": "Network configuration for the Compose application.", "properties": { "name": { @@ -1811,12 +1350,7 @@ "type": "object", "description": "Specify driver-specific options defined as key/value pairs.", "patternProperties": { - "^.+$": { - "type": [ - "string", - "number" - ] - } + "^.+$": {"type": ["string", "number"]} } }, "ipam": { @@ -1849,41 +1383,25 @@ "type": "object", "description": "Auxiliary IPv4 or IPv6 addresses used by Network driver.", "additionalProperties": false, - "patternProperties": { - "^.+$": { - "type": "string" - } - } + "patternProperties": {"^.+$": {"type": "string"}} } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } }, "options": { "type": "object", "description": "Driver-specific options for the IPAM driver.", "additionalProperties": false, - "patternProperties": { - "^.+$": { - "type": "string" - } - } + "patternProperties": {"^.+$": {"type": "string"}} } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "external": { - "type": [ - "boolean", - "string", - "object" - ], + "type": ["boolean", "string", "object"], "description": "Specifies that this network already exists and was created outside of Compose.", "properties": { "name": { @@ -1893,36 +1411,22 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "internal": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Create an externally isolated network." }, "enable_ipv4": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Enable IPv4 networking." }, "enable_ipv6": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Enable IPv6 networking." }, "attachable": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "If true, standalone containers can attach to this network." }, "labels": { @@ -1931,15 +1435,11 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, + "volume": { - "type": [ - "object", - "null" - ], + "type": ["object", "null"], "description": "Volume configuration for the Compose application.", "properties": { "name": { @@ -1954,20 +1454,11 @@ "type": "object", "description": "Specify driver-specific options.", "patternProperties": { - "^.+$": { - "type": [ - "string", - "number" - ] - } + "^.+$": {"type": ["string", "number"]} } }, "external": { - "type": [ - "boolean", - "string", - "object" - ], + "type": ["boolean", "string", "object"], "description": "Specifies that this volume already exists and was created outside of Compose.", "properties": { "name": { @@ -1977,9 +1468,7 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, "labels": { "$ref": "#/definitions/list_or_dict", @@ -1987,10 +1476,9 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, + "secret": { "type": "object", "description": "Secret configuration for the Compose application.", @@ -2008,11 +1496,7 @@ "description": "Path to a file containing the secret value." }, "external": { - "type": [ - "boolean", - "string", - "object" - ], + "type": ["boolean", "string", "object"], "description": "Specifies that this secret already exists and was created outside of Compose.", "properties": { "name": { @@ -2033,12 +1517,7 @@ "type": "object", "description": "Specify driver-specific options.", "patternProperties": { - "^.+$": { - "type": [ - "string", - "number" - ] - } + "^.+$": {"type": ["string", "number"]} } }, "template_driver": { @@ -2047,10 +1526,9 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, + "config": { "type": "object", "description": "Config configuration for the Compose application.", @@ -2072,11 +1550,7 @@ "description": "Path to a file containing the config value." }, "external": { - "type": [ - "boolean", - "string", - "object" - ], + "type": ["boolean", "string", "object"], "description": "Specifies that this config already exists and was created outside of Compose.", "properties": { "name": { @@ -2096,10 +1570,9 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, + "model": { "type": "object", "description": "Language Model for the Compose application.", @@ -2117,20 +1590,15 @@ }, "runtime_flags": { "type": "array", - "items": { - "type": "string" - }, + "items": {"type": "string"}, "description": "Raw runtime flags to pass to the inference engine." } }, - "required": [ - "model" - ], + "required": ["model"], "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} }, + "command": { "oneOf": [ { @@ -2152,6 +1620,7 @@ ], "description": "Command to run in the container, which can be specified as a string (shell form) or array (exec form)." }, + "service_hook": { "type": "object", "description": "Configuration for service lifecycle hooks, which are commands executed at specific points in a container's lifecycle.", @@ -2165,10 +1634,7 @@ "description": "User to run the command as." }, "privileged": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "description": "Whether to run the command with extended privileges." }, "working_dir": { @@ -2181,13 +1647,10 @@ } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - }, - "required": [ - "command" - ] + "patternProperties": {"^x-": {}}, + "required": ["command"] }, + "env_file": { "oneOf": [ { @@ -2217,10 +1680,7 @@ "description": "Format attribute lets you to use an alternative file formats for env_file. When not set, env_file is parsed according to Compose rules." }, "required": { - "type": [ - "boolean", - "string" - ], + "type": ["boolean", "string"], "default": true, "description": "Whether the file is required. If true and the file doesn't exist, an error will be raised." } @@ -2234,6 +1694,7 @@ } ] }, + "label_file": { "oneOf": [ { @@ -2250,6 +1711,7 @@ } ] }, + "string_or_list": { "oneOf": [ { @@ -2263,6 +1725,7 @@ ], "description": "Either a single string or a list of strings." }, + "list_of_strings": { "type": "array", "description": "A list of unique string values.", @@ -2272,6 +1735,7 @@ }, "uniqueItems": true }, + "list_or_dict": { "oneOf": [ { @@ -2279,12 +1743,7 @@ "description": "A dictionary mapping keys to values.", "patternProperties": { ".+": { - "type": [ - "string", - "number", - "boolean", - "null" - ], + "type": ["string", "number", "boolean", "null"], "description": "Value for the key, which can be a string, number, boolean, or null." } }, @@ -2302,6 +1761,7 @@ ], "description": "Either a dictionary mapping keys to values, or a list of strings." }, + "extra_hosts": { "oneOf": [ { @@ -2340,6 +1800,7 @@ ], "description": "Additional hostnames to be defined in the container's /etc/hosts file." }, + "blkio_limit": { "type": "object", "description": "Block IO limit for a specific device.", @@ -2349,10 +1810,7 @@ "description": "Path to the device (e.g., '/dev/sda')." }, "rate": { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "Rate limit in bytes per second or IO operations per second." } }, @@ -2367,10 +1825,7 @@ "description": "Path to the device (e.g., '/dev/sda')." }, "weight": { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "Relative weight for the device, between 10 and 1000." } }, @@ -2406,17 +1861,12 @@ "description": "GID of the file in the container. Default is 0 (root)." }, "mode": { - "type": [ - "number", - "string" - ], + "type": ["number", "string"], "description": "File permission mode inside the container, in octal. Default is 0444 for configs and 0400 for secrets." } }, "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } ] } @@ -2428,10 +1878,7 @@ "^[a-z]+$": { "oneOf": [ { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "Single value for both soft and hard limits." }, { @@ -2439,28 +1886,17 @@ "description": "Separate soft and hard limits.", "properties": { "hard": { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "Hard limit for the ulimit type. This is the maximum allowed value." }, "soft": { - "type": [ - "integer", - "string" - ], + "type": ["integer", "string"], "description": "Soft limit for the ulimit type. This is the value that's actually enforced." } }, - "required": [ - "soft", - "hard" - ], + "required": ["soft", "hard"], "additionalProperties": false, - "patternProperties": { - "^x-": {} - } + "patternProperties": {"^x-": {}} } ] }