portainer/app/react/hooks/useDockerComposeSchema/docker-compose-schema.ts

1101 lines
34 KiB
TypeScript

// based on https://github.com/compose-spec/compose-spec/blob/master/schema/compose-spec.json
// with added descriptions from https://github.com/microsoft/compose-language-service/blob/7a74283ddb866988fed86241f461a657f0aee6d0/src/service/providers/KeyHoverProvider.ts#L57-L184
// hopefully https://github.com/compose-spec/compose-spec/pull/581 will apply these same changes
export const dockerComposeSchema = {
$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:
'The version of the Docker Compose document. Declared for backward compatibility, ignored in recent versions.',
},
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',
description: 'The services in your project.',
patternProperties: {
'^[a-zA-Z0-9._-]+$': {
$ref: '#/definitions/service',
},
},
additionalProperties: false,
},
networks: {
type: 'object',
description: 'Networks that are shared among multiple services.',
patternProperties: {
'^[a-zA-Z0-9._-]+$': {
$ref: '#/definitions/network',
},
},
},
volumes: {
type: 'object',
description: 'Named volumes that are shared among multiple services.',
patternProperties: {
'^[a-zA-Z0-9._-]+$': {
$ref: '#/definitions/volume',
},
},
additionalProperties: false,
},
secrets: {
type: 'object',
description: 'Secrets that are shared among multiple services.',
patternProperties: {
'^[a-zA-Z0-9._-]+$': {
$ref: '#/definitions/secret',
},
},
additionalProperties: false,
},
configs: {
type: 'object',
description: 'Configurations for services in the project.',
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',
description: 'The context used for building the image.',
properties: {
context: {
type: 'string',
description: 'The context used for building the image.',
},
dockerfile: {
type: 'string',
description: 'The Dockerfile used for building the image.',
},
dockerfile_inline: { type: 'string' },
entitlements: { type: 'array', items: { type: 'string' } },
args: {
$ref: '#/definitions/list_or_dict',
description: 'Arguments used during the image build process.',
},
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',
description: 'The command that will be run in the container.',
},
configs: {
$ref: '#/definitions/service_config_or_secret',
description: 'Configurations the service will have access to.',
},
container_name: {
type: 'string',
description: 'The name that will be given to the container.',
},
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'],
},
},
},
],
description:
'Other services that this service depends on, which will be started before this one.',
},
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',
description: 'The entrypoint to the application in the container.',
},
env_file: {
$ref: '#/definitions/env_file',
description:
'Files containing environment variables that will be included.',
},
label_file: { $ref: '#/definitions/label_file' },
environment: {
$ref: '#/definitions/list_or_dict',
description: 'Environment variables that will be included.',
},
expose: {
type: 'array',
items: {
type: ['string', 'number'],
},
uniqueItems: true,
description:
'Ports exposed to the other services but not to the host machine.',
},
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',
description: 'A command for checking if the container is healthy.',
},
hostname: { type: 'string' },
image: {
type: 'string',
description:
'The image that will be pulled for the service. If `build` is specified, the built image will be given this tag.',
},
init: { type: ['boolean', 'string'] },
ipc: { type: 'string' },
isolation: { type: 'string' },
labels: {
$ref: '#/definitions/list_or_dict',
description: 'Labels that will be given to the container.',
},
links: { type: 'array', items: { type: 'string' }, uniqueItems: true },
logging: {
type: 'object',
description: 'Settings for logging for this service.',
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',
properties: {},
patternProperties: {
'^[a-zA-Z0-9._-]+$': {
oneOf: [
{ type: 'null' },
{
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',
},
priority: { type: ['number', 'string'] },
},
additionalProperties: false,
patternProperties: { '^x-': {} },
},
],
},
},
additionalProperties: false,
},
],
description:
'The service will be included in these networks, allowing it to reach other containers on the same network.',
},
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', 'string'] },
{
type: 'object',
properties: {
mode: { type: 'string' },
host_ip: { type: 'string' },
target: { type: ['number', 'string'] },
published: { type: ['number', 'string'] },
protocol: { type: 'string' },
},
additionalProperties: false,
patternProperties: { '^x-': {} },
},
],
},
uniqueItems: true,
description: 'Ports that will be exposed to the host.',
},
post_start: {
type: 'array',
items: { $ref: '#/definitions/service_hook' },
},
pre_stop: {
type: 'array',
items: { $ref: '#/definitions/service_hook' },
},
privileged: { type: ['boolean', 'string'] },
profiles: {
type: 'array',
items: { type: 'string' },
uniqueItems: true,
description:
'Profiles that this service is a part of. When the profile is started, this service will be started.',
},
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',
description: 'Secrets the service will have access to.',
},
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',
description:
'The username under which the app in the container will be started.',
},
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'] },
selinux: { type: 'string', enum: ['z', 'Z'] },
},
additionalProperties: false,
patternProperties: { '^x-': {} },
},
volume: {
type: 'object',
properties: {
nocopy: { type: ['boolean', 'string'] },
},
additionalProperties: false,
patternProperties: { '^x-': {} },
},
tmpfs: {
type: 'object',
properties: {
size: { type: ['number', 'string'] },
mode: { type: ['number', 'string'] },
},
additionalProperties: false,
patternProperties: { '^x-': {} },
},
},
additionalProperties: false,
patternProperties: { '^x-': {} },
},
],
},
uniqueItems: true,
description:
'Named volumes and paths on the host mapped to paths in the container.',
},
volumes_from: {
type: 'array',
items: { type: 'string' },
uniqueItems: true,
},
working_dir: {
type: 'string',
description:
'The working directory in which the entrypoint or command will be run.',
},
},
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',
description: 'The driver used for this network.',
},
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',
description: 'The driver used for this volume.',
},
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-': {} },
},
],
},
},
},
},
};