{

"$schema": "http://json-schema.org/draft-04/schema#",
"id": "compote_2.1.json",
"type": "object",

"properties": {
  "version": {
    "type": "string",
    "enum": ["2.1"]
  },

  "services": {
    "type": "object",
    "patternProperties": {
      "^[a-zA-Z0-9._-]+$": {
        "$ref": "#/definitions/service"
      }
    },
    "additionalProperties": false
  },

  "networks": {
    "type": "object",
    "patternProperties": {
      "^[a-zA-Z0-9._-]+$": {
        "$ref": "#/definitions/network"
      }
    },
    "additionalProperties": false
  },

  "volumes": {
    "type": "object",
    "patternProperties": {
      "^[a-zA-Z0-9._-]+$": {
        "$ref": "#/definitions/volume"
      }
    },
    "additionalProperties": false
  },

  "compote": {
    "type": "object",
    "properties": {
      "extends": {
        "oneOf": [
          {"$ref": "#/definitions/string_or_list"},
          {
            "type": "object",
            "patternProperties": {
              "^.+$": {
                "oneOf": [
                  { "type": "null" },
                  {
                    "type": "object",
                    "properties": {
                      "only": {"$ref": "#/definitions/string_or_list"},
                      "except": {"$ref": "#/definitions/string_or_list"}
                    },
                    "additionalProperties": false
                  }
                ]
              }
            },
            "additionalProperties": false
          }
        ]
      },
      "env_file": {"$ref": "#/definitions/string_or_list"},
      "environment": {"$ref": "#/definitions/list_or_dict"},
      "commands": {
        "type": "object",
        "patternProperties": {
          "^[a-zA-Z0-9._-]+$": {
            "type": "string",
            "minLength": 1
          }
        },
        "additionalProperties": false
      }
    },
    "additionalProperties": false
  }
},

"additionalProperties": false,

"definitions": {

  "service": {
    "id": "#/definitions/service",
    "type": "object",

    "properties": {
      "build": {
        "oneOf": [
          {"type": "string"},
          {
            "type": "object",
            "properties": {
              "context": {"type": "string"},
              "dockerfile": {"type": "string"},
              "args": {"$ref": "#/definitions/list_or_dict"}
            },
            "additionalProperties": false
          }
        ]
      },
      "cap_add": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
      "cap_drop": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
      "cgroup_parent": {"type": "string"},
      "command": {
        "oneOf": [
          {"type": "string"},
          {"type": "array", "items": {"type": "string"}}
        ]
      },
      "container_name": {"type": "string"},
      "cpu_shares": {"type": ["number", "string"]},
      "cpu_quota": {"type": ["number", "string"]},
      "cpuset": {"type": "string"},
      "depends_on": {
        "oneOf": [
          {"$ref": "#/definitions/list_of_strings"},
          {
            "type": "object",
            "additionalProperties": false,
            "patternProperties": {
              "^[a-zA-Z0-9._-]+$": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "condition": {
                    "type": "string",
                    "enum": ["service_started", "service_healthy"]
                  }
                },
                "required": ["condition"]
              }
            }
          }
        ]
      },
      "devices": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
      "dns_opt": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "uniqueItems": true
      },
      "dns": {"$ref": "#/definitions/string_or_list"},
      "dns_search": {"$ref": "#/definitions/string_or_list"},
      "domainname": {"type": "string"},
      "entrypoint": {
        "oneOf": [
          {"type": "string"},
          {"type": "array", "items": {"type": "string"}}
        ]
      },
      "env_file": {"$ref": "#/definitions/string_or_list"},
      "environment": {"$ref": "#/definitions/list_or_dict"},

      "expose": {
        "type": "array",
        "items": {
          "type": ["string", "number"],
          "format": "expose"
        },
        "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/list_or_dict"},
      "healthcheck": {"$ref": "#/definitions/healthcheck"},
      "hostname": {"type": "string"},
      "image": {"type": "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"}
          },
          "additionalProperties": false
      },

      "mac_address": {"type": "string"},
      "mem_limit": {"type": ["number", "string"]},
      "mem_reservation": {"type": ["string", "integer"]},
      "mem_swappiness": {"type": "integer"},
      "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"}
                    },
                    "additionalProperties": false
                  },
                  {"type": "null"}
                ]
              }
            },
            "additionalProperties": false
          }
        ]
      },
      "oom_score_adj": {"type": "integer", "minimum": -1000, "maximum": 1000},
      "group_add": {
          "type": "array",
          "items": {
              "type": ["string", "number"]
          },
          "uniqueItems": true
      },
      "pid": {"type": ["string", "null"]},

      "ports": {
        "type": "array",
        "items": {
          "type": ["string", "number"],
          "format": "ports"
        },
        "uniqueItems": true
      },

      "privileged": {"type": "boolean"},
      "read_only": {"type": "boolean"},
      "restart": {"type": "string"},
      "security_opt": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
      "shm_size": {"type": ["number", "string"]},
      "sysctls": {"$ref": "#/definitions/list_or_dict"},
      "pids_limit": {"type": ["number", "string"]},
      "stdin_open": {"type": "boolean"},
      "stop_grace_period": {"type": "string", "format": "duration"},
      "stop_signal": {"type": "string"},
      "tmpfs": {"$ref": "#/definitions/string_or_list"},
      "tty": {"type": "boolean"},
      "ulimits": {
        "type": "object",
        "patternProperties": {
          "^[a-z]+$": {
            "oneOf": [
              {"type": "integer"},
              {
                "type":"object",
                "properties": {
                  "hard": {"type": "integer"},
                  "soft": {"type": "integer"}
                },
                "required": ["soft", "hard"],
                "additionalProperties": false
              }
            ]
          }
        }
      },
      "user": {"type": "string"},
      "userns_mode": {"type": "string"},
      "volumes": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
      "volume_driver": {"type": "string"},
      "volumes_from": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
      "working_dir": {"type": "string"},

      "compote": {
        "type": "object",
        "properties": {
          "extends": {
            "oneOf": [
              {"$ref": "#/definitions/string_or_list"},
              {
                "type": "object",
                "patternProperties": {
                  "^.+$": {
                    "oneOf": [
                      { "type": "null" },
                      {
                        "type": "object",
                        "properties": {
                          "only": {"$ref": "#/definitions/string_or_list"},
                          "except": {"$ref": "#/definitions/string_or_list"}
                        },
                        "additionalProperties": false
                      }
                    ]
                  }
                },
                "additionalProperties": false
              }
            ]
          },
          "networks": {
            "type": "object",
            "patternProperties": {
              "^[a-zA-Z0-9._-]+$": {
                "$ref": "#/definitions/network"
              }
            },
            "additionalProperties": false
          },
          "volumes": {
            "type": "object",
            "patternProperties": {
              "^[a-zA-Z0-9._-]+$": {
                "$ref": "#/definitions/volume"
              }
            },
            "additionalProperties": false
          },
          "commands": {
            "type": "object",
            "patternProperties": {
              "^[a-zA-Z0-9._-]+$": {
                "type": "string",
                "minLength": 1
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      }
    },

    "dependencies": {
      "memswap_limit": ["mem_limit"]
    },
    "additionalProperties": false
  },

  "healthcheck": {
    "id": "#/definitions/healthcheck",
    "type": "object",
    "additionalProperties": false,
    "properties": {
      "disable": {"type": "boolean"},
      "interval": {"type": "string"},
      "retries": {"type": "number"},
      "test": {
        "oneOf": [
          {"type": "string"},
          {"type": "array", "items": {"type": "string"}}
        ]
      },
      "timeout": {"type": "string"}
    }
  },

  "network": {
    "id": "#/definitions/network",
    "type": "object",
    "properties": {
      "driver": {"type": "string"},
      "driver_opts": {
        "type": "object",
        "patternProperties": {
          "^.+$": {"type": ["string", "number"]}
        }
      },
      "ipam": {
          "type": "object",
          "properties": {
              "driver": {"type": "string"},
              "config": {
                  "type": "array"
              }
          },
          "additionalProperties": false
      },
      "external": {
        "type": ["boolean", "object"],
        "properties": {
          "name": {"type": "string"}
        },
        "additionalProperties": false
      },
      "internal": {"type": "boolean"},
      "enable_ipv6": {"type": "boolean"},
      "labels": {"$ref": "#/definitions/list_or_dict"}
    },
    "additionalProperties": false
  },

  "volume": {
    "id": "#/definitions/volume",
    "type": ["object", "null"],
    "properties": {
      "driver": {"type": "string"},
      "driver_opts": {
        "type": "object",
        "patternProperties": {
          "^.+$": {"type": ["string", "number"]}
        }
      },
      "external": {
        "type": ["boolean", "object"],
        "properties": {
          "name": {"type": "string"}
        },
        "additionalProperties": false
      },
      "labels": {"$ref": "#/definitions/list_or_dict"}
    },
    "additionalProperties": false
  },

  "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", "null"]
          }
        },
        "additionalProperties": false
      },
      {"type": "array", "items": {"type": "string"}, "uniqueItems": true}
    ]
  },

  "constraints": {
    "service": {
      "id": "#/definitions/constraints/service",
      "anyOf": [
        {"required": ["build"]},
        {"required": ["image"]}
      ],
      "properties": {
        "build": {
          "required": ["context"]
        }
      }
    }
  }
}

}