{ "$schema": "https://json-schema.org/draft-07/schema", "$id": "compose_spec.json", "type": "object", "title": "Compose Specification", "description": "The Compose file is a YAML file defining a multi-containers based application.", "properties": { "version": { "type": "string", "description": "declared for backward compatibility, ignored." }, "name": { "type": "string", "description": "define the Compose project name, until user defines one explicitly." }, "include": { "type": "array", "items": { "$ref": "#/definitions/include" }, "description": "compose sub-projects to be included." }, "services": { "type": "object", "patternProperties": { "^[a-zA-Z0-9._-]+$": { "$ref": "#/definitions/service" } }, "additionalProperties": false }, "networks": { "type": "object", "patternProperties": { "^[a-zA-Z0-9._-]+$": { "$ref": "#/definitions/network" } } }, "volumes": { "type": "object", "patternProperties": { "^[a-zA-Z0-9._-]+$": { "$ref": "#/definitions/volume" } }, "additionalProperties": false }, "secrets": { "type": "object", "patternProperties": { "^[a-zA-Z0-9._-]+$": { "$ref": "#/definitions/secret" } }, "additionalProperties": false }, "configs": { "type": "object", "patternProperties": { "^[a-zA-Z0-9._-]+$": { "$ref": "#/definitions/config" } }, "additionalProperties": false } }, "patternProperties": {"^x-": {}}, "additionalProperties": false, "definitions": { "service": { "type": "object", "properties": { "develop": {"$ref": "#/definitions/development"}, "deploy": {"$ref": "#/definitions/deployment"}, "annotations": {"$ref": "#/definitions/list_or_dict"}, "attach": {"type": ["boolean", "string"]}, "build": { "oneOf": [ {"type": "string"}, { "type": "object", "properties": { "context": {"type": "string"}, "dockerfile": {"type": "string"}, "dockerfile_inline": {"type": "string"}, "entitlements": {"type": "array", "items": {"type": "string"}}, "args": {"$ref": "#/definitions/list_or_dict"}, "ssh": {"$ref": "#/definitions/list_or_dict"}, "labels": {"$ref": "#/definitions/list_or_dict"}, "cache_from": {"type": "array", "items": {"type": "string"}}, "cache_to": {"type": "array", "items": {"type": "string"}}, "no_cache": {"type": ["boolean", "string"]}, "additional_contexts": {"$ref": "#/definitions/list_or_dict"}, "network": {"type": "string"}, "pull": {"type": ["boolean", "string"]}, "target": {"type": "string"}, "shm_size": {"type": ["integer", "string"]}, "extra_hosts": {"$ref": "#/definitions/extra_hosts"}, "isolation": {"type": "string"}, "privileged": {"type": ["boolean", "string"]}, "secrets": {"$ref": "#/definitions/service_config_or_secret"}, "tags": {"type": "array", "items": {"type": "string"}}, "ulimits": {"$ref": "#/definitions/ulimits"}, "platforms": {"type": "array", "items": {"type": "string"}} }, "additionalProperties": false, "patternProperties": {"^x-": {}} } ] }, "blkio_config": { "type": "object", "properties": { "device_read_bps": { "type": "array", "items": {"$ref": "#/definitions/blkio_limit"} }, "device_read_iops": { "type": "array", "items": {"$ref": "#/definitions/blkio_limit"} }, "device_write_bps": { "type": "array", "items": {"$ref": "#/definitions/blkio_limit"} }, "device_write_iops": { "type": "array", "items": {"$ref": "#/definitions/blkio_limit"} }, "weight": {"type": ["integer", "string"]}, "weight_device": { "type": "array", "items": {"$ref": "#/definitions/blkio_weight"} } }, "additionalProperties": false }, "cap_add": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "cap_drop": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "cgroup": {"type": "string", "enum": ["host", "private"]}, "cgroup_parent": {"type": "string"}, "command": {"$ref": "#/definitions/command"}, "configs": {"$ref": "#/definitions/service_config_or_secret"}, "container_name": {"type": "string"}, "cpu_count": {"oneOf": [ {"type": "string"}, {"type": "integer", "minimum": 0} ]}, "cpu_percent": {"oneOf": [ {"type": "string"}, {"type": "integer", "minimum": 0, "maximum": 100} ]}, "cpu_shares": {"type": ["number", "string"]}, "cpu_quota": {"type": ["number", "string"]}, "cpu_period": {"type": ["number", "string"]}, "cpu_rt_period": {"type": ["number", "string"]}, "cpu_rt_runtime": {"type": ["number", "string"]}, "cpus": {"type": ["number", "string"]}, "cpuset": {"type": "string"}, "credential_spec": { "type": "object", "properties": { "config": {"type": "string"}, "file": {"type": "string"}, "registry": {"type": "string"} }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "depends_on": { "oneOf": [ {"$ref": "#/definitions/list_of_strings"}, { "type": "object", "additionalProperties": false, "patternProperties": { "^[a-zA-Z0-9._-]+$": { "type": "object", "additionalProperties": false, "patternProperties": {"^x-": {}}, "properties": { "restart": {"type": ["boolean", "string"]}, "required": { "type": "boolean", "default": true }, "condition": { "type": "string", "enum": ["service_started", "service_healthy", "service_completed_successfully"] } }, "required": ["condition"] } } } ] }, "device_cgroup_rules": {"$ref": "#/definitions/list_of_strings"}, "devices": { "type": "array", "items": { "oneOf": [ {"type": "string"}, { "type": "object", "required": ["source"], "properties": { "source": {"type": "string"}, "target": {"type": "string"}, "permissions": {"type": "string"} }, "additionalProperties": false, "patternProperties": {"^x-": {}} } ] } }, "dns": {"$ref": "#/definitions/string_or_list"}, "dns_opt": {"type": "array","items": {"type": "string"}, "uniqueItems": true}, "dns_search": {"$ref": "#/definitions/string_or_list"}, "domainname": {"type": "string"}, "entrypoint": {"$ref": "#/definitions/command"}, "env_file": {"$ref": "#/definitions/env_file"}, "label_file": {"$ref": "#/definitions/label_file"}, "environment": {"$ref": "#/definitions/list_or_dict"}, "expose": { "type": "array", "items": { "type": ["string", "number"] }, "uniqueItems": true }, "extends": { "oneOf": [ {"type": "string"}, { "type": "object", "properties": { "service": {"type": "string"}, "file": {"type": "string"} }, "required": ["service"], "additionalProperties": false } ] }, "external_links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "extra_hosts": {"$ref": "#/definitions/extra_hosts"}, "gpus": {"$ref": "#/definitions/gpus"}, "group_add": { "type": "array", "items": { "type": ["string", "number"] }, "uniqueItems": true }, "healthcheck": {"$ref": "#/definitions/healthcheck"}, "hostname": {"type": "string"}, "image": {"type": "string"}, "init": {"type": ["boolean", "string"]}, "ipc": {"type": "string"}, "isolation": {"type": "string"}, "labels": {"$ref": "#/definitions/list_or_dict"}, "links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "logging": { "type": "object", "properties": { "driver": {"type": "string"}, "options": { "type": "object", "patternProperties": { "^.+$": {"type": ["string", "number", "null"]} } } }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "mac_address": {"type": "string"}, "mem_limit": {"type": ["number", "string"]}, "mem_reservation": {"type": ["string", "integer"]}, "mem_swappiness": {"type": ["integer", "string"]}, "memswap_limit": {"type": ["number", "string"]}, "network_mode": {"type": "string"}, "networks": { "oneOf": [ {"$ref": "#/definitions/list_of_strings"}, { "type": "object", "patternProperties": { "^[a-zA-Z0-9._-]+$": { "oneOf": [ { "type": "object", "properties": { "aliases": {"$ref": "#/definitions/list_of_strings"}, "ipv4_address": {"type": "string"}, "ipv6_address": {"type": "string"}, "link_local_ips": {"$ref": "#/definitions/list_of_strings"}, "mac_address": {"type": "string"}, "driver_opts": { "type": "object", "patternProperties": { "^.+$": {"type": ["string", "number"]} } }, "priority": {"type": "number"}, "gw_priority": {"type": "number"} }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, {"type": "null"} ] } }, "additionalProperties": false } ] }, "oom_kill_disable": {"type": ["boolean", "string"]}, "oom_score_adj": {"oneOf": [ {"type": "string"}, {"type": "integer", "minimum": -1000, "maximum": 1000} ]}, "pid": {"type": ["string", "null"]}, "pids_limit": {"type": ["number", "string"]}, "platform": {"type": "string"}, "ports": { "type": "array", "items": { "oneOf": [ {"type": "number"}, {"type": "string"}, { "type": "object", "properties": { "name": {"type": "string"}, "mode": {"type": "string"}, "host_ip": {"type": "string"}, "target": {"type": ["integer", "string"]}, "published": {"type": ["string", "integer"]}, "protocol": {"type": "string"}, "app_protocol": {"type": "string"} }, "additionalProperties": false, "patternProperties": {"^x-": {}} } ] }, "uniqueItems": true }, "post_start": {"type": "array", "items": {"$ref": "#/definitions/service_hook"}}, "pre_stop": {"type": "array", "items": {"$ref": "#/definitions/service_hook"}}, "privileged": {"type": ["boolean", "string"]}, "profiles": {"$ref": "#/definitions/list_of_strings"}, "pull_policy": {"type": "string", "pattern": "always|never|build|if_not_present|missing|refresh|daily|weekly|every_([0-9]+[wdhms])+" }, "pull_refresh_after": {"type": "string"}, "read_only": {"type": ["boolean", "string"]}, "restart": {"type": "string"}, "runtime": { "type": "string" }, "scale": { "type": ["integer", "string"] }, "security_opt": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "shm_size": {"type": ["number", "string"]}, "secrets": {"$ref": "#/definitions/service_config_or_secret"}, "sysctls": {"$ref": "#/definitions/list_or_dict"}, "stdin_open": {"type": ["boolean", "string"]}, "stop_grace_period": {"type": "string"}, "stop_signal": {"type": "string"}, "storage_opt": {"type": "object"}, "tmpfs": {"$ref": "#/definitions/string_or_list"}, "tty": {"type": ["boolean", "string"]}, "ulimits": {"$ref": "#/definitions/ulimits"}, "user": {"type": "string"}, "uts": {"type": "string"}, "userns_mode": {"type": "string"}, "volumes": { "type": "array", "items": { "oneOf": [ {"type": "string"}, { "type": "object", "required": ["type"], "properties": { "type": {"type": "string"}, "source": {"type": "string"}, "target": {"type": "string"}, "read_only": {"type": ["boolean", "string"]}, "consistency": {"type": "string"}, "bind": { "type": "object", "properties": { "propagation": {"type": "string"}, "create_host_path": {"type": ["boolean", "string"]}, "recursive": {"type": "string", "enum": ["enabled", "disabled", "writable", "readonly"]}, "selinux": {"type": "string", "enum": ["z", "Z"]} }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "volume": { "type": "object", "properties": { "nocopy": {"type": ["boolean", "string"]}, "subpath": {"type": "string"} }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "tmpfs": { "type": "object", "properties": { "size": { "oneOf": [ {"type": "integer", "minimum": 0}, {"type": "string"} ] }, "mode": {"type": ["number", "string"]} }, "additionalProperties": false, "patternProperties": {"^x-": {}} } }, "additionalProperties": false, "patternProperties": {"^x-": {}} } ] }, "uniqueItems": true }, "volumes_from": { "type": "array", "items": {"type": "string"}, "uniqueItems": true }, "working_dir": {"type": "string"} }, "patternProperties": {"^x-": {}}, "additionalProperties": false }, "healthcheck": { "type": "object", "properties": { "disable": {"type": ["boolean", "string"]}, "interval": {"type": "string"}, "retries": {"type": ["number", "string"]}, "test": { "oneOf": [ {"type": "string"}, {"type": "array", "items": {"type": "string"}} ] }, "timeout": {"type": "string"}, "start_period": {"type": "string"}, "start_interval": {"type": "string"} }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "development": { "type": ["object", "null"], "properties": { "watch": { "type": "array", "items": { "type": "object", "required": ["path", "action"], "properties": { "ignore": {"$ref": "#/definitions/string_or_list"}, "include": {"$ref": "#/definitions/string_or_list"}, "path": {"type": "string"}, "action": {"type": "string", "enum": ["rebuild", "sync", "restart", "sync+restart", "sync+exec"]}, "target": {"type": "string"}, "exec": {"$ref": "#/definitions/service_hook"} }, "additionalProperties": false, "patternProperties": {"^x-": {}} } } }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "deployment": { "type": ["object", "null"], "properties": { "mode": {"type": "string"}, "endpoint_mode": {"type": "string"}, "replicas": {"type": ["integer", "string"]}, "labels": {"$ref": "#/definitions/list_or_dict"}, "rollback_config": { "type": "object", "properties": { "parallelism": {"type": ["integer", "string"]}, "delay": {"type": "string"}, "failure_action": {"type": "string"}, "monitor": {"type": "string"}, "max_failure_ratio": {"type": ["number", "string"]}, "order": {"type": "string", "enum": [ "start-first", "stop-first" ]} }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "update_config": { "type": "object", "properties": { "parallelism": {"type": ["integer", "string"]}, "delay": {"type": "string"}, "failure_action": {"type": "string"}, "monitor": {"type": "string"}, "max_failure_ratio": {"type": ["number", "string"]}, "order": {"type": "string", "enum": [ "start-first", "stop-first" ]} }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "resources": { "type": "object", "properties": { "limits": { "type": "object", "properties": { "cpus": {"type": ["number", "string"]}, "memory": {"type": "string"}, "pids": {"type": ["integer", "string"]} }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "reservations": { "type": "object", "properties": { "cpus": {"type": ["number", "string"]}, "memory": {"type": "string"}, "generic_resources": {"$ref": "#/definitions/generic_resources"}, "devices": {"$ref": "#/definitions/devices"} }, "additionalProperties": false, "patternProperties": {"^x-": {}} } }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "restart_policy": { "type": "object", "properties": { "condition": {"type": "string"}, "delay": {"type": "string"}, "max_attempts": {"type": ["integer", "string"]}, "window": {"type": "string"} }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "placement": { "type": "object", "properties": { "constraints": {"type": "array", "items": {"type": "string"}}, "preferences": { "type": "array", "items": { "type": "object", "properties": { "spread": {"type": "string"} }, "additionalProperties": false, "patternProperties": {"^x-": {}} } }, "max_replicas_per_node": {"type": ["integer", "string"]} }, "additionalProperties": false, "patternProperties": {"^x-": {}} } }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "generic_resources": { "type": "array", "items": { "type": "object", "properties": { "discrete_resource_spec": { "type": "object", "properties": { "kind": {"type": "string"}, "value": {"type": ["number", "string"]} }, "additionalProperties": false, "patternProperties": {"^x-": {}} } }, "additionalProperties": false, "patternProperties": {"^x-": {}} } }, "devices": { "type": "array", "items": { "type": "object", "properties": { "capabilities": {"$ref": "#/definitions/list_of_strings"}, "count": {"type": ["string", "integer"]}, "device_ids": {"$ref": "#/definitions/list_of_strings"}, "driver":{"type": "string"}, "options":{"$ref": "#/definitions/list_or_dict"} }, "additionalProperties": false, "patternProperties": {"^x-": {}}, "required": [ "capabilities" ] } }, "gpus": { "oneOf": [ {"type": "string", "enum": ["all"]}, {"type": "array", "items": { "type": "object", "properties": { "capabilities": {"$ref": "#/definitions/list_of_strings"}, "count": {"type": ["string", "integer"]}, "device_ids": {"$ref": "#/definitions/list_of_strings"}, "driver":{"type": "string"}, "options":{"$ref": "#/definitions/list_or_dict"} } }, "additionalProperties": false, "patternProperties": {"^x-": {}} } ] }, "include": { "oneOf": [ {"type": "string"}, { "type": "object", "properties": { "path": {"$ref": "#/definitions/string_or_list"}, "env_file": {"$ref": "#/definitions/string_or_list"}, "project_directory": {"type": "string"} }, "additionalProperties": false } ] }, "network": { "type": ["object", "null"], "properties": { "name": {"type": "string"}, "driver": {"type": "string"}, "driver_opts": { "type": "object", "patternProperties": { "^.+$": {"type": ["string", "number"]} } }, "ipam": { "type": "object", "properties": { "driver": {"type": "string"}, "config": { "type": "array", "items": { "type": "object", "properties": { "subnet": {"type": "string"}, "ip_range": {"type": "string"}, "gateway": {"type": "string"}, "aux_addresses": { "type": "object", "additionalProperties": false, "patternProperties": {"^.+$": {"type": "string"}} } }, "additionalProperties": false, "patternProperties": {"^x-": {}} } }, "options": { "type": "object", "additionalProperties": false, "patternProperties": {"^.+$": {"type": "string"}} } }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "external": { "type": ["boolean", "string", "object"], "properties": { "name": { "deprecated": true, "type": "string" } }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "internal": {"type": ["boolean", "string"]}, "enable_ipv4": {"type": ["boolean", "string"]}, "enable_ipv6": {"type": ["boolean", "string"]}, "attachable": {"type": ["boolean", "string"]}, "labels": {"$ref": "#/definitions/list_or_dict"} }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "volume": { "type": ["object", "null"], "properties": { "name": {"type": "string"}, "driver": {"type": "string"}, "driver_opts": { "type": "object", "patternProperties": { "^.+$": {"type": ["string", "number"]} } }, "external": { "type": ["boolean", "string", "object"], "properties": { "name": { "deprecated": true, "type": "string" } }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "labels": {"$ref": "#/definitions/list_or_dict"} }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "secret": { "type": "object", "properties": { "name": {"type": "string"}, "environment": {"type": "string"}, "file": {"type": "string"}, "external": { "type": ["boolean", "string", "object"], "properties": { "name": {"type": "string"} } }, "labels": {"$ref": "#/definitions/list_or_dict"}, "driver": {"type": "string"}, "driver_opts": { "type": "object", "patternProperties": { "^.+$": {"type": ["string", "number"]} } }, "template_driver": {"type": "string"} }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "config": { "type": "object", "properties": { "name": {"type": "string"}, "content": {"type": "string"}, "environment": {"type": "string"}, "file": {"type": "string"}, "external": { "type": ["boolean", "string", "object"], "properties": { "name": { "deprecated": true, "type": "string" } } }, "labels": {"$ref": "#/definitions/list_or_dict"}, "template_driver": {"type": "string"} }, "additionalProperties": false, "patternProperties": {"^x-": {}} }, "command": { "oneOf": [ {"type": "null"}, {"type": "string"}, {"type": "array","items": {"type": "string"}} ] }, "service_hook": { "type": "object", "properties": { "command": {"$ref": "#/definitions/command"}, "user": {"type": "string"}, "privileged": {"type": ["boolean", "string"]}, "working_dir": {"type": "string"}, "environment": {"$ref": "#/definitions/list_or_dict"} }, "additionalProperties": false, "patternProperties": {"^x-": {}}, "required": ["command"] }, "env_file": { "oneOf": [ {"type": "string"}, { "type": "array", "items": { "oneOf": [ {"type": "string"}, { "type": "object", "additionalProperties": false, "properties": { "path": { "type": "string" }, "format": { "type": "string" }, "required": { "type": ["boolean", "string"], "default": true } }, "required": [ "path" ] } ] } } ] }, "label_file": { "oneOf": [ {"type": "string"}, { "type": "array", "items": {"type": "string"} } ] }, "string_or_list": { "oneOf": [ {"type": "string"}, {"$ref": "#/definitions/list_of_strings"} ] }, "list_of_strings": { "type": "array", "items": {"type": "string"}, "uniqueItems": true }, "list_or_dict": { "oneOf": [ { "type": "object", "patternProperties": { ".+": { "type": ["string", "number", "boolean", "null"] } }, "additionalProperties": false }, {"type": "array", "items": {"type": "string"}, "uniqueItems": true} ] }, "extra_hosts": { "oneOf": [ { "type": "object", "patternProperties": { ".+": { "oneOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" }, "uniqueItems": false } ] } }, "additionalProperties": false }, {"type": "array", "items": {"type": "string"}, "uniqueItems": true} ] }, "blkio_limit": { "type": "object", "properties": { "path": {"type": "string"}, "rate": {"type": ["integer", "string"]} }, "additionalProperties": false }, "blkio_weight": { "type": "object", "properties": { "path": {"type": "string"}, "weight": {"type": ["integer", "string"]} }, "additionalProperties": false }, "service_config_or_secret": { "type": "array", "items": { "oneOf": [ {"type": "string"}, { "type": "object", "properties": { "source": {"type": "string"}, "target": {"type": "string"}, "uid": {"type": "string"}, "gid": {"type": "string"}, "mode": {"type": ["number", "string"]} }, "additionalProperties": false, "patternProperties": {"^x-": {}} } ] } }, "ulimits": { "type": "object", "patternProperties": { "^[a-z]+$": { "oneOf": [ {"type": ["integer", "string"]}, { "type": "object", "properties": { "hard": {"type": ["integer", "string"]}, "soft": {"type": ["integer", "string"]} }, "required": ["soft", "hard"], "additionalProperties": false, "patternProperties": {"^x-": {}} } ] } } } } }