{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "schemaVersion": { "const": 2 }, "services": { "type": "array", "message": "CUSTOM_APP_ERROR_SERVICES_MIN_LENGTH", "minItems": 1, "items": { "type": "object", "properties": { "image": { "type": "string", "message": "CUSTOM_APP_ERROR_IMAGE_REQUIRED" }, "name": { "type": "string", "message": "CUSTOM_APP_ERROR_NAME_REQUIRED" }, "addPorts": { "type": "array", "items": { "type": "object", "properties": { "containerPort": { "anyOf": [ { "type": "string", "message": "CUSTOM_APP_ERROR_CONTAINER_PORT_INVALID" }, { "type": "integer", "message": "CUSTOM_APP_ERROR_CONTAINER_PORT_INVALID", "exclusiveMaximum": 65536, "exclusiveMinimum": 0 } ], "message": "CUSTOM_APP_ERROR_CONTAINER_PORT_INVALID" }, "hostPort": { "anyOf": [ { "type": "string", "message": "CUSTOM_APP_ERROR_HOST_PORT_INVALID" }, { "type": "integer", "message": "CUSTOM_APP_ERROR_HOST_PORT_INVALID", "exclusiveMaximum": 65536, "exclusiveMinimum": 0 } ], "message": "CUSTOM_APP_ERROR_HOST_PORT_INVALID" }, "interface": { "type": "string" }, "tcp": { "type": "boolean" }, "udp": { "type": "boolean" } }, "required": [ "containerPort", "hostPort" ] } }, "addToMainNetwork": { "type": "boolean" }, "capAdd": { "type": "array", "message": "CUSTOM_APP_ERROR_CAP_ADD_INVALID", "items": { "type": "string" } }, "capDrop": { "type": "array", "message": "CUSTOM_APP_ERROR_CAP_DROP_INVALID", "items": { "type": "string" } }, "command": { "anyOf": [ { "type": "string", "message": "CUSTOM_APP_ERROR_COMMAND_INVALID" }, { "type": "array", "message": "CUSTOM_APP_ERROR_COMMAND_INVALID", "items": { "type": "string" } } ], "message": "CUSTOM_APP_ERROR_COMMAND_INVALID" }, "dependsOn": { "anyOf": [ { "type": "object", "additionalProperties": { "type": "object", "properties": { "condition": { "anyOf": [ { "const": "service_completed_successfully", "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" }, { "const": "service_healthy", "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" }, { "const": "service_started", "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" } ], "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" } }, "required": [ "condition" ] } }, { "type": "array", "message": "CUSTOM_APP_ERROR_DEPENDS_ON_SERVICE_INVALID", "items": { "type": "string" } } ] }, "deploy": { "type": "object", "properties": { "resources": { "type": "object", "properties": { "limits": { "type": "object", "properties": { "cpus": { "type": "string" }, "memory": { "type": "string" }, "pids": { "type": "number", "message": "CUSTOM_APP_ERROR_DEPLOY_PIDS_INVALID" } } }, "reservations": { "type": "object", "properties": { "devices": { "type": "array", "items": { "type": "object", "properties": { "capabilities": { "type": "array", "message": "CUSTOM_APP_ERROR_DEVICE_CAPABILITY_INVALID", "items": { "type": "string" } }, "count": { "anyOf": [ { "type": "number", "message": "CUSTOM_APP_ERROR_DEVICE_COUNT_INVALID" }, { "const": "all", "message": "CUSTOM_APP_ERROR_DEVICE_COUNT_INVALID" } ], "message": "CUSTOM_APP_ERROR_DEVICE_COUNT_INVALID" }, "deviceIds": { "type": "array", "message": "CUSTOM_APP_ERROR_DEVICE_ID_INVALID", "items": { "type": "string" } }, "driver": { "type": "string" } }, "required": [ "capabilities" ] } }, "cpus": { "type": "string" }, "memory": { "type": "string" } }, "required": [ "devices" ] } } } }, "required": [ "resources" ] }, "devices": { "type": "array", "message": "CUSTOM_APP_ERROR_DEVICE_INVALID", "items": { "type": "string" } }, "dns": { "anyOf": [ { "type": "string", "message": "CUSTOM_APP_ERROR_DNS_INVALID" }, { "type": "array", "message": "CUSTOM_APP_ERROR_DNS_INVALID", "items": { "type": "string" } } ], "message": "CUSTOM_APP_ERROR_DNS_INVALID" }, "entrypoint": { "anyOf": [ { "type": "string", "message": "CUSTOM_APP_ERROR_ENTRYPOINT_INVALID" }, { "type": "array", "message": "CUSTOM_APP_ERROR_ENTRYPOINT_INVALID", "items": { "type": "string" } } ], "message": "CUSTOM_APP_ERROR_ENTRYPOINT_INVALID" }, "environment": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "message": "CUSTOM_APP_ERROR_ENV_KEY_REQUIRED", "minLength": 1 }, "value": { "anyOf": [ { "type": "number", "message": "CUSTOM_APP_ERROR_ENV_VALUE_REQUIRED" }, { "type": "string", "message": "CUSTOM_APP_ERROR_ENV_VALUE_REQUIRED", "minLength": 1 }, { "type": "boolean" } ], "message": "CUSTOM_APP_ERROR_ENV_VALUE_REQUIRED" } }, "required": [ "key", "value" ] } }, "extraHosts": { "type": "array", "message": "CUSTOM_APP_ERROR_EXTRA_HOST_INVALID", "items": { "type": "string" } }, "extraLabels": { "type": "object", "message": "CUSTOM_APP_ERROR_LABEL_KEY_INVALID", "additionalProperties": { "anyOf": [ { "type": "string", "message": "CUSTOM_APP_ERROR_LABEL_VALUE_INVALID" }, { "type": "boolean" } ], "message": "CUSTOM_APP_ERROR_LABEL_VALUE_INVALID" } }, "healthCheck": { "type": "object", "properties": { "test": { "type": "string", "message": "CUSTOM_APP_ERROR_HEALTH_CHECK_TEST_REQUIRED" }, "interval": { "type": "string" }, "retries": { "type": "number", "message": "CUSTOM_APP_ERROR_HEALTH_CHECK_RETRIES_INVALID" }, "startInterval": { "type": "string" }, "startPeriod": { "type": "string" }, "timeout": { "type": "string" } }, "required": [ "test" ] }, "hostname": { "type": "string" }, "internalPort": { "anyOf": [ { "type": "string", "message": "CUSTOM_APP_ERROR_INTERNAL_PORT_INVALID" }, { "type": "integer", "message": "CUSTOM_APP_ERROR_INTERNAL_PORT_INVALID", "exclusiveMaximum": 65536, "exclusiveMinimum": 0 } ], "message": "CUSTOM_APP_ERROR_INTERNAL_PORT_INVALID" }, "isMain": { "type": "boolean" }, "logging": { "type": "object", "properties": { "driver": { "type": "string", "message": "CUSTOM_APP_ERROR_LOGGING_DRIVER_REQUIRED" }, "options": { "type": "object", "message": "CUSTOM_APP_ERROR_LOGGING_OPTION_KEY_INVALID", "additionalProperties": { "type": "string", "message": "CUSTOM_APP_ERROR_LOGGING_OPTION_VALUE_INVALID" } } }, "required": [ "driver" ] }, "networkMode": { "type": "string" }, "pid": { "type": "string" }, "privileged": { "type": "boolean" }, "readOnly": { "type": "boolean" }, "securityOpt": { "type": "array", "message": "CUSTOM_APP_ERROR_SECURITY_OPT_INVALID", "items": { "type": "string" } }, "shmSize": { "type": "string" }, "stdinOpen": { "type": "boolean" }, "stopGracePeriod": { "type": "string" }, "stopSignal": { "type": "string" }, "sysctls": { "type": "object", "message": "CUSTOM_APP_ERROR_SYSCTL_KEY_INVALID", "additionalProperties": { "type": "number", "message": "CUSTOM_APP_ERROR_SYSCTL_VALUE_INVALID" } }, "tty": { "type": "boolean" }, "ulimits": { "type": "object", "properties": { "core": { "anyOf": [ { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_CORE_INVALID" }, { "type": "object", "properties": { "hard": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" }, "soft": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" } }, "required": [ "hard", "soft" ] } ] }, "memlock": { "anyOf": [ { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_MEMLOCK_INVALID" }, { "type": "object", "properties": { "hard": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" }, "soft": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" } }, "required": [ "hard", "soft" ] } ] }, "nofile": { "anyOf": [ { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_NOFILE_INVALID" }, { "type": "object", "properties": { "hard": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" }, "soft": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" } }, "required": [ "hard", "soft" ] } ] }, "nproc": { "anyOf": [ { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_NPROC_INVALID" }, { "type": "object", "properties": { "hard": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" }, "soft": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" } }, "required": [ "hard", "soft" ] } ] } } }, "user": { "type": "string" }, "volumes": { "type": "array", "items": { "type": "object", "properties": { "containerPath": { "type": "string", "message": "CUSTOM_APP_ERROR_CONTAINER_PATH_REQUIRED" }, "hostPath": { "type": "string", "message": "CUSTOM_APP_ERROR_HOST_PATH_REQUIRED" }, "bind": { "type": "object", "properties": { "propagation": { "enum": [ "private", "rprivate", "rshared", "rslave", "shared", "slave" ] } }, "required": [ "propagation" ] }, "private": { "type": "boolean" }, "readOnly": { "type": "boolean" }, "shared": { "type": "boolean" } }, "required": [ "containerPath", "hostPath" ] } }, "workingDir": { "type": "string" } }, "required": [ "image", "name" ] } }, "overrides": { "type": "array", "items": { "type": "object", "properties": { "services": { "type": "array", "items": { "type": "object", "properties": { "addPorts": { "type": "array", "items": { "type": "object", "properties": { "containerPort": { "anyOf": [ { "type": "string", "message": "CUSTOM_APP_ERROR_CONTAINER_PORT_INVALID" }, { "type": "integer", "message": "CUSTOM_APP_ERROR_CONTAINER_PORT_INVALID", "exclusiveMaximum": 65536, "exclusiveMinimum": 0 } ], "message": "CUSTOM_APP_ERROR_CONTAINER_PORT_INVALID" }, "hostPort": { "anyOf": [ { "type": "string", "message": "CUSTOM_APP_ERROR_HOST_PORT_INVALID" }, { "type": "integer", "message": "CUSTOM_APP_ERROR_HOST_PORT_INVALID", "exclusiveMaximum": 65536, "exclusiveMinimum": 0 } ], "message": "CUSTOM_APP_ERROR_HOST_PORT_INVALID" }, "interface": { "type": "string" }, "tcp": { "type": "boolean" }, "udp": { "type": "boolean" } }, "required": [ "containerPort", "hostPort" ] } }, "addToMainNetwork": { "type": "boolean" }, "capAdd": { "type": "array", "message": "CUSTOM_APP_ERROR_CAP_ADD_INVALID", "items": { "type": "string" } }, "capDrop": { "type": "array", "message": "CUSTOM_APP_ERROR_CAP_DROP_INVALID", "items": { "type": "string" } }, "command": { "anyOf": [ { "type": "string", "message": "CUSTOM_APP_ERROR_COMMAND_INVALID" }, { "type": "array", "message": "CUSTOM_APP_ERROR_COMMAND_INVALID", "items": { "type": "string" } } ], "message": "CUSTOM_APP_ERROR_COMMAND_INVALID" }, "dependsOn": { "anyOf": [ { "type": "object", "additionalProperties": { "type": "object", "properties": { "condition": { "anyOf": [ { "const": "service_completed_successfully", "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" }, { "const": "service_healthy", "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" }, { "const": "service_started", "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" } ], "message": "CUSTOM_APP_ERROR_DEPENDS_ON_CONDITION_INVALID" } }, "required": [ "condition" ] } }, { "type": "array", "message": "CUSTOM_APP_ERROR_DEPENDS_ON_SERVICE_INVALID", "items": { "type": "string" } } ] }, "deploy": { "type": "object", "properties": { "resources": { "type": "object", "properties": { "limits": { "type": "object", "properties": { "cpus": { "type": "string" }, "memory": { "type": "string" }, "pids": { "type": "number", "message": "CUSTOM_APP_ERROR_DEPLOY_PIDS_INVALID" } } }, "reservations": { "type": "object", "properties": { "devices": { "type": "array", "items": { "type": "object", "properties": { "capabilities": { "type": "array", "message": "CUSTOM_APP_ERROR_DEVICE_CAPABILITY_INVALID", "items": { "type": "string" } }, "count": { "anyOf": [ { "type": "number", "message": "CUSTOM_APP_ERROR_DEVICE_COUNT_INVALID" }, { "const": "all", "message": "CUSTOM_APP_ERROR_DEVICE_COUNT_INVALID" } ], "message": "CUSTOM_APP_ERROR_DEVICE_COUNT_INVALID" }, "deviceIds": { "type": "array", "message": "CUSTOM_APP_ERROR_DEVICE_ID_INVALID", "items": { "type": "string" } }, "driver": { "type": "string" } }, "required": [ "capabilities" ] } }, "cpus": { "type": "string" }, "memory": { "type": "string" } }, "required": [ "devices" ] } } } }, "required": [ "resources" ] }, "devices": { "type": "array", "message": "CUSTOM_APP_ERROR_DEVICE_INVALID", "items": { "type": "string" } }, "dns": { "anyOf": [ { "type": "string", "message": "CUSTOM_APP_ERROR_DNS_INVALID" }, { "type": "array", "message": "CUSTOM_APP_ERROR_DNS_INVALID", "items": { "type": "string" } } ], "message": "CUSTOM_APP_ERROR_DNS_INVALID" }, "entrypoint": { "anyOf": [ { "type": "string", "message": "CUSTOM_APP_ERROR_ENTRYPOINT_INVALID" }, { "type": "array", "message": "CUSTOM_APP_ERROR_ENTRYPOINT_INVALID", "items": { "type": "string" } } ], "message": "CUSTOM_APP_ERROR_ENTRYPOINT_INVALID" }, "environment": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "message": "CUSTOM_APP_ERROR_ENV_KEY_REQUIRED", "minLength": 1 }, "value": { "anyOf": [ { "type": "number", "message": "CUSTOM_APP_ERROR_ENV_VALUE_REQUIRED" }, { "type": "string", "message": "CUSTOM_APP_ERROR_ENV_VALUE_REQUIRED", "minLength": 1 }, { "type": "boolean" } ], "message": "CUSTOM_APP_ERROR_ENV_VALUE_REQUIRED" } }, "required": [ "key", "value" ] } }, "extraHosts": { "type": "array", "message": "CUSTOM_APP_ERROR_EXTRA_HOST_INVALID", "items": { "type": "string" } }, "extraLabels": { "type": "object", "message": "CUSTOM_APP_ERROR_LABEL_KEY_INVALID", "additionalProperties": { "anyOf": [ { "type": "string", "message": "CUSTOM_APP_ERROR_LABEL_VALUE_INVALID" }, { "type": "boolean" } ], "message": "CUSTOM_APP_ERROR_LABEL_VALUE_INVALID" } }, "healthCheck": { "type": "object", "properties": { "test": { "type": "string", "message": "CUSTOM_APP_ERROR_HEALTH_CHECK_TEST_REQUIRED" }, "interval": { "type": "string" }, "retries": { "type": "number", "message": "CUSTOM_APP_ERROR_HEALTH_CHECK_RETRIES_INVALID" }, "startInterval": { "type": "string" }, "startPeriod": { "type": "string" }, "timeout": { "type": "string" } }, "required": [ "test" ] }, "hostname": { "type": "string" }, "image": { "type": "string", "message": "CUSTOM_APP_ERROR_IMAGE_REQUIRED" }, "internalPort": { "anyOf": [ { "type": "string", "message": "CUSTOM_APP_ERROR_INTERNAL_PORT_INVALID" }, { "type": "integer", "message": "CUSTOM_APP_ERROR_INTERNAL_PORT_INVALID", "exclusiveMaximum": 65536, "exclusiveMinimum": 0 } ], "message": "CUSTOM_APP_ERROR_INTERNAL_PORT_INVALID" }, "isMain": { "type": "boolean" }, "logging": { "type": "object", "properties": { "driver": { "type": "string", "message": "CUSTOM_APP_ERROR_LOGGING_DRIVER_REQUIRED" }, "options": { "type": "object", "message": "CUSTOM_APP_ERROR_LOGGING_OPTION_KEY_INVALID", "additionalProperties": { "type": "string", "message": "CUSTOM_APP_ERROR_LOGGING_OPTION_VALUE_INVALID" } } }, "required": [ "driver" ] }, "name": { "type": "string", "message": "CUSTOM_APP_ERROR_NAME_REQUIRED" }, "networkMode": { "type": "string" }, "pid": { "type": "string" }, "privileged": { "type": "boolean" }, "readOnly": { "type": "boolean" }, "securityOpt": { "type": "array", "message": "CUSTOM_APP_ERROR_SECURITY_OPT_INVALID", "items": { "type": "string" } }, "shmSize": { "type": "string" }, "stdinOpen": { "type": "boolean" }, "stopGracePeriod": { "type": "string" }, "stopSignal": { "type": "string" }, "sysctls": { "type": "object", "message": "CUSTOM_APP_ERROR_SYSCTL_KEY_INVALID", "additionalProperties": { "type": "number", "message": "CUSTOM_APP_ERROR_SYSCTL_VALUE_INVALID" } }, "tty": { "type": "boolean" }, "ulimits": { "type": "object", "properties": { "core": { "anyOf": [ { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_CORE_INVALID" }, { "type": "object", "properties": { "hard": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" }, "soft": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" } }, "required": [ "hard", "soft" ] } ] }, "memlock": { "anyOf": [ { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_MEMLOCK_INVALID" }, { "type": "object", "properties": { "hard": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" }, "soft": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" } }, "required": [ "hard", "soft" ] } ] }, "nofile": { "anyOf": [ { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_NOFILE_INVALID" }, { "type": "object", "properties": { "hard": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" }, "soft": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" } }, "required": [ "hard", "soft" ] } ] }, "nproc": { "anyOf": [ { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_NPROC_INVALID" }, { "type": "object", "properties": { "hard": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_HARD_INVALID" }, "soft": { "type": "number", "message": "CUSTOM_APP_ERROR_ULIMIT_SOFT_INVALID" } }, "required": [ "hard", "soft" ] } ] } } }, "user": { "type": "string" }, "volumes": { "type": "array", "items": { "type": "object", "properties": { "containerPath": { "type": "string", "message": "CUSTOM_APP_ERROR_CONTAINER_PATH_REQUIRED" }, "hostPath": { "type": "string", "message": "CUSTOM_APP_ERROR_HOST_PATH_REQUIRED" }, "bind": { "type": "object", "properties": { "propagation": { "enum": [ "private", "rprivate", "rshared", "rslave", "shared", "slave" ] } }, "required": [ "propagation" ] }, "private": { "type": "boolean" }, "readOnly": { "type": "boolean" }, "shared": { "type": "boolean" } }, "required": [ "containerPath", "hostPath" ] } }, "workingDir": { "type": "string" } } } }, "architecture": { "anyOf": [ { "const": "amd64", "message": "CUSTOM_APP_ERROR_ARCHITECTURE_INVALID" }, { "const": "arm64", "message": "CUSTOM_APP_ERROR_ARCHITECTURE_INVALID" } ], "message": "CUSTOM_APP_ERROR_ARCHITECTURE_INVALID" } }, "required": [ "services" ] } } }, "required": [ "schemaVersion", "services" ] }