Template
A Template is a base repository from which users can build a new Microservice.
Teamplates can be instantiated in Console the same as plugins. The difference is that they provide an archive that is cloned in the Project scope, instead of a Docker image, giving developers direct access to the codebase to evolve it at will.
Templates are meant to be starting points with the bear minimum needed to start a service. Just like plugins, templates may also come with some predefined configurations.
To create or edit a template, you need to provide a manifest, whose resources
property should adhere to the following JSON schema.
The JSON schemas of the template resources and of the full template manifest are available on GitHub.
- Schema Viewer
- Raw JSON Schema
- Example
Catalog template resources
services object required
{
"$id": "catalog-template-resources.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"description": "Resources of Catalog items of type template",
"properties": {
"services": {
"maxProperties": 1,
"minProperties": 1,
"patternProperties": {
"^[a-z]([-a-z0-9]*[a-z0-9])?$": {
"additionalProperties": false,
"properties": {
"archiveUrl": {
"format": "uri-reference",
"minLength": 1,
"type": "string"
},
"componentId": {
"type": "string"
},
"containerPorts": {
"items": {
"additionalProperties": false,
"properties": {
"from": {
"oneOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 65535
},
{
"pattern": "^$|^((\\{\\{([A-Z])([A-Z0-9_]*)\\}\\})|([1-9]\\d*|0))$",
"type": "string"
}
]
},
"name": {
"pattern": "^[a-z]([-a-z0-9]*[a-z0-9])?$",
"type": "string"
},
"protocol": {
"default": "TCP",
"enum": [
"TCP",
"UDP"
],
"type": "string"
},
"to": {
"oneOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 65535
},
{
"pattern": "^$|^((\\{\\{([A-Z])([A-Z0-9_]*)\\}\\})|([1-9]\\d*|0))$",
"type": "string"
}
]
}
},
"required": [
"name",
"from"
],
"type": "object"
},
"type": "array"
},
"defaultAnnotations": {
"description": "The service annotations, which can be used to provide additional information about your services for various purposes. Annotations starting with `mia-platform.eu` are reserved",
"items": {
"additionalProperties": false,
"properties": {
"description": {
"type": "string"
},
"name": {
"pattern": "^([a-zA-Z0-9][a-zA-Z0-9\\.\\-]{0,253}[\\/])?([a-zA-Z0-9][a-zA-Z0-9\\.\\-]{0,63}[a-zA-Z0-9]?)$",
"type": "string"
},
"readOnly": {
"type": "boolean"
},
"value": {
"type": "string"
}
},
"required": [
"name",
"value"
],
"type": "object"
},
"type": "array"
},
"defaultArgs": {
"items": {
"type": "string"
},
"type": "array"
},
"defaultConfigMaps": {
"description": "The default ConfigMaps, if any, that will be mounted inside the container of the microservice",
"items": {
"additionalProperties": false,
"properties": {
"files": {
"items": {
"properties": {
"content": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"name",
"content"
],
"type": "object"
},
"type": "array"
},
"link": {
"properties": {
"targetSection": {
"type": "string"
}
},
"type": "object"
},
"mountPath": {
"pattern": "^[a-zA-Z0-9-/_\\s.|\\\\!\"Β£$%&()=?^\"{}[\\]*+@]+$",
"type": "string"
},
"name": {
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
"type": "string"
},
"subPaths": {
"type": "array",
"items": {
"type": "string"
}
},
"usePreserve": {
"type": "boolean"
},
"viewAsReadOnly": {
"type": "boolean"
}
},
"required": [
"name",
"files",
"mountPath"
],
"type": "object"
},
"type": "array"
},
"defaultDocumentationPath": {
"description": "The APIs documentation path",
"pattern": "^$|^(\\/$|(\\/([\\w\\-\\.]|(:[a-zA-Z]))[\\w\\-\\.]*)+)$",
"type": "string"
},
"defaultEnvironmentVariables": {
"description": "The environment variables that will overwrite the default environment variables applied by the Console",
"items": {
"oneOf": [
{
"additionalProperties": false,
"properties": {
"name": {
"description": "The variable name (generally, a key written in UPPER_SNAKE_CASE)",
"minLength": 1,
"type": "string"
},
"description": {
"description": "A brief description of the variable",
"type": "string"
},
"managedBy": {
"description": "A string that represents the Console section that manages the variable. It only works used in combination with the `readOnly` property set to `true`",
"type": "string",
"enum": [
"fast-data"
]
},
"readOnly": {
"description": "A boolean that represents if you can change the value of the variable through the Console",
"type": "boolean"
},
"value": {
"description": "The variable default value. It can contain placeholders that will be replaced with the actual values when the service is created",
"type": "string"
},
"valueType": {
"const": "plain"
}
},
"required": [
"name",
"valueType"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"name": {
"description": "The variable name (generally, a key written in UPPER_SNAKE_CASE)",
"minLength": 1,
"type": "string"
},
"description": {
"description": "A brief description of the variable",
"type": "string"
},
"managedBy": {
"description": "A string that represents the Console section that manages the variable. It only works used in combination with the `readOnly` property set to `true`",
"type": "string",
"enum": [
"fast-data"
]
},
"readOnly": {
"description": "A boolean that represents if you can change the value of the variable through the Console",
"type": "boolean"
},
"configMapName": {
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
"type": "string"
},
"configMapFileName": {
"pattern": "^[-._a-zA-Z0-9]+$",
"type": "string"
},
"valueType": {
"const": "configmap"
}
},
"required": [
"name",
"valueType",
"secretName",
"secretKey"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"name": {
"description": "The variable name (generally, a key written in UPPER_SNAKE_CASE)",
"minLength": 1,
"type": "string"
},
"description": {
"description": "A brief description of the variable",
"type": "string"
},
"managedBy": {
"description": "A string that represents the Console section that manages the variable. It only works used in combination with the `readOnly` property set to `true`",
"type": "string",
"enum": [
"fast-data"
]
},
"readOnly": {
"description": "A boolean that represents if you can change the value of the variable through the Console",
"type": "boolean"
},
"secretKey": {
"pattern": "^((\\{\\{([A-Z])([A-Z0-9_]*)\\}\\})|[a-zA-Z0-9-_.]*)$",
"type": "string"
},
"secretName": {
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
"type": "string"
},
"valueType": {
"const": "secret"
}
},
"required": [
"name",
"valueType",
"secretName",
"secretKey"
],
"type": "object"
},
{
"oneOf": [
{
"additionalProperties": false,
"properties": {
"name": {
"description": "The variable name (generally, a key written in UPPER_SNAKE_CASE)",
"minLength": 1,
"type": "string"
},
"description": {
"description": "A brief description of the variable",
"type": "string"
},
"managedBy": {
"description": "A string that represents the Console section that manages the variable. It only works used in combination with the `readOnly` property set to `true`",
"type": "string",
"enum": [
"fast-data"
]
},
"readOnly": {
"description": "A boolean that represents if you can change the value of the variable through the Console",
"type": "boolean"
},
"fieldPath": {
"description": "The field path of the Downward API that contains the value of the variable",
"oneOf": [
{
"type": "string",
"enum": [
"metadata.name",
"metadata.namespace",
"metadata.uid",
"spec.serviceAccountName",
"spec.nodeName",
"status.hostIP",
"status.podIP",
"status.podIPs"
]
},
{
"type": "string",
"pattern": "^metadata.annotations\\['([a-zA-Z0-9][a-zA-Z0-9\\.\\-]{0,253}[\\/])?([a-zA-Z0-9][a-zA-Z0-9\\.\\-]{0,63}[a-zA-Z0-9]?)'\\]$"
},
{
"type": "string",
"pattern": "^metadata.labels\\['([a-zA-Z0-9][a-zA-Z0-9\\.\\-]{0,253}[\\/])?([a-zA-Z0-9][a-zA-Z0-9\\.\\-]{0,63}[a-zA-Z0-9]?)'\\]$"
}
]
},
"valueType": {
"const": "downwardAPI"
}
},
"required": [
"fieldPath",
"name",
"valueType"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"name": {
"description": "The variable name (generally, a key written in UPPER_SNAKE_CASE)",
"minLength": 1,
"type": "string"
},
"description": {
"description": "A brief description of the variable",
"type": "string"
},
"managedBy": {
"description": "A string that represents the Console section that manages the variable. It only works used in combination with the `readOnly` property set to `true`",
"type": "string",
"enum": [
"fast-data"
]
},
"readOnly": {
"description": "A boolean that represents if you can change the value of the variable through the Console",
"type": "boolean"
},
"fieldPath": {
"type": "string",
"enum": [
"resource.limits.cpu",
"resource.requests.cpu",
"resource.limits.memory",
"resource.requests.memory",
"resource.limits.ephemeral-storage",
"resource.requests.ephemeral-storage"
]
},
"valueType": {
"const": "downwardAPI"
},
"containerName": {
"description": "The name of the container where the field is located",
"type": "string"
}
},
"required": [
"fieldPath",
"name",
"valueType",
"containerName"
],
"type": "object"
}
]
}
]
},
"type": "array"
},
"defaultLabels": {
"description": "The service labels, which can be used to categorize, group, and select your service. Labels starting with \"mia-platform.eu\" are reserved",
"items": {
"additionalProperties": false,
"properties": {
"description": {
"type": "string"
},
"name": {
"pattern": "^([a-zA-Z0-9][a-zA-Z0-9\\.\\-]{0,253}[\\/])?([a-zA-Z0-9][a-zA-Z0-9\\.\\-]{0,63}[a-zA-Z0-9]?)$",
"type": "string"
},
"readOnly": {
"type": "boolean"
},
"value": {
"type": "string"
}
},
"required": [
"name",
"value"
],
"type": "object"
},
"type": "array"
},
"defaultLogParser": {
"enum": [
"mia-plain",
"mia-json",
"mia-nginx"
],
"type": "string"
},
"defaultMonitoring": {
"additionalProperties": false,
"properties": {
"endpoints": {
"items": {
"additionalProperties": false,
"properties": {
"interval": {
"type": "string",
"pattern": "^(\\d)+[s]$"
},
"path": {
"type": "string",
"pattern": "^\\/(([\\w-])\\/?)*$"
},
"port": {
"type": "string"
}
},
"required": [
"interval",
"path",
"port"
],
"type": "object"
},
"type": "array"
}
},
"type": "object"
},
"defaultProbes": {
"description": "The readiness, liveness, and startup paths of the service. By modifying the map of the probes, you can overwrite the default paths applied by the Console",
"additionalProperties": false,
"properties": {
"liveness": {
"oneOf": [
{
"additionalProperties": false,
"properties": {
"cmd": {
"items": {
"type": "string"
},
"type": "array"
},
"failureThreshold": {
"type": "number"
},
"initialDelaySeconds": {
"type": "number"
},
"periodSeconds": {
"type": "number"
},
"successThreshold": {
"type": "number"
},
"timeoutSeconds": {
"type": "number"
}
},
"required": [
"cmd"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"failureThreshold": {
"type": "number"
},
"initialDelaySeconds": {
"type": "number"
},
"periodSeconds": {
"type": "number"
},
"port": {
"type": "string"
},
"successThreshold": {
"type": "number"
},
"timeoutSeconds": {
"type": "number"
}
},
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"failureThreshold": {
"type": "number"
},
"initialDelaySeconds": {
"type": "number"
},
"path": {
"pattern": "^\\/(([\\w\\-:.\\{\\}])\\/?)*$|^$",
"type": "string"
},
"periodSeconds": {
"type": "number"
},
"port": {
"type": "string"
},
"successThreshold": {
"type": "number"
},
"timeoutSeconds": {
"type": "number"
}
},
"required": [
"path"
],
"type": "object"
}
]
},
"readiness": {
"oneOf": [
{
"additionalProperties": false,
"properties": {
"cmd": {
"items": {
"type": "string"
},
"type": "array"
},
"failureThreshold": {
"type": "number"
},
"initialDelaySeconds": {
"type": "number"
},
"periodSeconds": {
"type": "number"
},
"successThreshold": {
"type": "number"
},
"timeoutSeconds": {
"type": "number"
}
},
"required": [
"cmd"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"failureThreshold": {
"type": "number"
},
"initialDelaySeconds": {
"type": "number"
},
"periodSeconds": {
"type": "number"
},
"port": {
"type": "string"
},
"successThreshold": {
"type": "number"
},
"timeoutSeconds": {
"type": "number"
}
},
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"failureThreshold": {
"type": "number"
},
"initialDelaySeconds": {
"type": "number"
},
"path": {
"pattern": "^\\/(([\\w\\-:.\\{\\}])\\/?)*$|^$",
"type": "string"
},
"periodSeconds": {
"type": "number"
},
"port": {
"type": "string"
},
"successThreshold": {
"type": "number"
},
"timeoutSeconds": {
"type": "number"
}
},
"required": [
"path"
],
"type": "object"
}
]
},
"startup": {
"oneOf": [
{
"additionalProperties": false,
"properties": {
"cmd": {
"items": {
"type": "string"
},
"type": "array"
},
"failureThreshold": {
"type": "number"
},
"initialDelaySeconds": {
"type": "number"
},
"periodSeconds": {
"type": "number"
},
"successThreshold": {
"type": "number"
},
"timeoutSeconds": {
"type": "number"
}
},
"required": [
"cmd"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"failureThreshold": {
"type": "number"
},
"initialDelaySeconds": {
"type": "number"
},
"periodSeconds": {
"type": "number"
},
"port": {
"type": "string"
},
"successThreshold": {
"type": "number"
},
"timeoutSeconds": {
"type": "number"
}
},
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"failureThreshold": {
"type": "number"
},
"initialDelaySeconds": {
"type": "number"
},
"path": {
"pattern": "^\\/(([\\w\\-:.\\{\\}])\\/?)*$|^$",
"type": "string"
},
"periodSeconds": {
"type": "number"
},
"port": {
"type": "string"
},
"successThreshold": {
"type": "number"
},
"timeoutSeconds": {
"type": "number"
}
},
"required": [
"path"
],
"type": "object"
}
]
}
},
"type": "object"
},
"defaultResources": {
"description": "CPU and memory limitations of the service, which can be used to overwrite the default limitations imposed by the Console for these parameters",
"additionalProperties": false,
"properties": {
"cpuLimits": {
"additionalProperties": false,
"properties": {
"max": {
"pattern": "(^((\\{\\{([A-Z])([A-Z0-9_]*)\\}\\})|(\\d+))m$)|^$",
"type": "string"
},
"min": {
"pattern": "(^((\\{\\{([A-Z])([A-Z0-9_]*)\\}\\})|(\\d+))m$)|^$",
"type": "string"
}
},
"type": "object"
},
"memoryLimits": {
"additionalProperties": false,
"properties": {
"max": {
"pattern": "(^((\\{\\{([A-Z])([A-Z0-9_]*)\\}\\})|(\\d+))Mi$)|^$",
"type": "string"
},
"min": {
"pattern": "(^((\\{\\{([A-Z])([A-Z0-9_]*)\\}\\})|(\\d+))Mi$)|^$",
"type": "string"
}
},
"type": "object"
}
},
"type": "object"
},
"defaultSecrets": {
"description": "The default secrets, if any, to be mounted inside the container of the microservice",
"items": {
"additionalProperties": false,
"properties": {
"mountPath": {
"pattern": "^[a-zA-Z0-9-/_\\s.|\\\\!\"Β£$%&()=?^\"{}[\\]*+@]+$",
"type": "string"
},
"name": {
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
"type": "string"
}
},
"required": [
"name",
"mountPath"
],
"type": "object"
},
"type": "array"
},
"defaultTerminationGracePeriodSeconds": {
"type": "number"
},
"description": {
"type": "string"
},
"dockerImage": {
"pattern": "^(?:[a-z0-9.\\-\\/:]+\\/)?([\\w.}{\\-\\/]+)(:[\\w.}{\\-]+)?$",
"type": "string"
},
"mapEnvVarToMountPath": {
"type": "object",
"additionalProperties": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"file",
"folder"
]
},
"envName": {
"type": "string"
}
},
"additionalProperties": false,
"required": [
"type",
"envName"
]
}
},
"name": {
"minLength": 1,
"pattern": "^[a-z]([-a-z0-9]*[a-z0-9])?$",
"type": "string"
},
"pipelines": {
"properties": {
"azure-pipelines": {
"properties": {
"branch": {
"type": "string"
},
"path": {
"type": "string"
},
"providerId": {
"type": "string"
}
},
"type": "object"
},
"github-actions": {
"properties": {
"branch": {
"type": "string"
},
"path": {
"type": "string"
},
"providerId": {
"type": "string"
}
},
"type": "object"
},
"gitlab-ci": {
"properties": {
"branch": {
"type": "string"
},
"path": {
"type": "string"
},
"providerId": {
"type": "string"
}
},
"type": "object"
},
"jenkins": {
"properties": {
"gitWebhookOptions": {
"type": "object"
},
"gitlabWebhookOptions": {
"$comment": "Deprecated",
"type": "object"
},
"providerId": {
"type": "string"
},
"xmlTemplate": {
"properties": {
"gitBranch": {
"type": "string"
},
"gitPath": {
"type": "string"
},
"gitProjectId": {
"type": "string"
},
"gitlabBranch": {
"$comment": "Deprecated",
"type": "string"
},
"gitlabPath": {
"$comment": "Deprecated",
"type": "string"
},
"gitlabProjectId": {
"$comment": "Deprecated",
"type": "string"
}
},
"type": "object"
}
},
"type": "object"
},
"webhook": {
"properties": {
"providerId": {
"type": "string"
},
"token": {
"type": "string"
},
"url": {
"type": "string"
}
},
"type": "object"
}
},
"type": "object"
},
"type": {
"const": "template"
}
},
"required": [
"name",
"type",
"archiveUrl"
],
"type": "object"
}
},
"additionalProperties": false,
"type": "object"
}
},
"required": [
"services"
],
"title": "Catalog template resources",
"type": "object",
"examples": [
{
"services": {
"e-commerce-service": {
"type": "template",
"name": "e-commerce-service",
"description": "Backend for an E-Commerce",
"componentId": "e-commerce",
"archiveUrl": "https://github.com/e-commerce/backend/archive/refs/tags/v1.0.0.tar.gz",
"containerPorts": [
{
"from": 3000,
"to": 80,
"name": "http"
}
],
"defaultAnnotations": [
{
"name": "domain",
"value": "orders"
}
],
"defaultLabels": [
{
"name": "technologies",
"value": "javascript"
}
],
"defaultDocumentationPath": "/documentation/json",
"defaultLogParser": "mia-json",
"defaultEnvironmentVariables": [
{
"name": "LOG_LEVEL",
"valueType": "plain",
"value": "info"
}
],
"defaultConfigMaps": [
{
"name": "e-commerce-service-config",
"mountPath": "/home/node",
"files": [
{
"name": "config.json",
"content": "{ \"mongodbUrl\": \"{{MONGODB_URL}}\" }"
}
]
}
],
"defaultSecrets": [
{
"name": "private-key",
"mountPath": "/home/node"
}
],
"defaultProbes": {
"liveness": {
"port": "3000",
"path": "/healthz"
},
"readiness": {
"port": "3000",
"path": "/healthz"
},
"startup": {
"port": "3000",
"path": "/healthz"
}
},
"defaultResources": {
"memoryLimits": {
"max": "250Mi",
"min": "150Mi"
},
"cpuLimits": {
"min": "150m",
"max": "200m"
}
}
}
}
}
]
}
{
"services": {
"e-commerce-service": {
"type": "template",
"name": "e-commerce-service",
"description": "Backend for an E-Commerce",
"componentId": "e-commerce",
"archiveUrl": "https://github.com/e-commerce/backend/archive/refs/tags/v1.0.0.tar.gz",
"containerPorts": [
{
"from": 3000,
"to": 80,
"name": "http"
}
],
"defaultAnnotations": [
{
"name": "domain",
"value": "orders"
}
],
"defaultLabels": [
{
"name": "technologies",
"value": "javascript"
}
],
"defaultDocumentationPath": "/documentation/json",
"defaultLogParser": "mia-json",
"defaultEnvironmentVariables": [
{
"name": "LOG_LEVEL",
"valueType": "plain",
"value": "info"
}
],
"defaultConfigMaps": [
{
"name": "e-commerce-service-config",
"mountPath": "/home/node",
"files": [
{
"name": "config.json",
"content": "{ \"mongodbUrl\": \"{{MONGODB_URL}}\" }"
}
]
}
],
"defaultSecrets": [
{
"name": "private-key",
"mountPath": "/home/node"
}
],
"defaultProbes": {
"liveness": {
"port": "3000",
"path": "/healthz"
},
"readiness": {
"port": "3000",
"path": "/healthz"
},
"startup": {
"port": "3000",
"path": "/healthz"
}
},
"defaultResources": {
"memoryLimits": {
"max": "250Mi",
"min": "150Mi"
},
"cpuLimits": {
"min": "150m",
"max": "200m"
}
}
}
}
}
The source repositoryβ
The template content must be hosted on a remote Git repository. Once a new microservice starting from the template is created, the Console clones the content of the repository in a new one under the Git provider of the user's project.
The URL to the repository must be specified in the archiveUrl
filed of the item, and must point to the tar.gz version of a specific sha
or ref
of the Git project (e.g., https://github.com/mia-platform-marketplace/crud-sql-template/archive/0.1.0.tar.gz
).
For archives hosted on GitLab, if is better to use API URLs (e.g. https://git.tools.mia-platform.eu/api/v4/projects/MY_PROJECT_ID/repository/archive.tar.gz?sha=main
), instead of UI-based URLs, since group tokens work properly with the API format but often fail with the UI path.
Private repositoriesβ
If the repository is public and openly accessible (i.e., open source), no further actions are required for the item to be accessible and usable by any Company.
However, if the item is stored in a private repository, some additional configurations are required to ensure the Console can access it.
Namely, you need to create a provider for the Catalog, where you'll configure the credentials required to access your Git Provider, and link the provider to the item through the providerId
field.
To make Software Catalog resources accessible to other Companies, you must enable the "Allow access to all the Companies" option in the Provider settings, as explained here. This ensures the Console can access the itemβs resources even when it belongs to a project in a different Company.
Continuous integrationβ
The service should ensure that Continuous Integration (CI) is set up, to update the service image any time its code is modified.
When creating a template item, you can either ship the CI with the archive itself, or use the pipelines
field to reference an existing CI that will be generated alongside the service files.
Mia-Platform provides some ready-to-use pipeline teamplates. Contact your referent to know how to configure them within your Console installation.
Special files and placeholdersβ
Any of the archive file can contain some special placeholders that will be replaced by the Console at the creation of the new microservice. The available placeholders are:
mia_template_image_name_placeholder
: name of the docker image entered by the user;%CUSTOM_PLUGIN_PROJECT_NAME%
: name (label) of the Console project;mia_template_project_id_placeholder
: id of the Console project;mia_template_service_name_placeholder
: service name chosen by the user;%CUSTOM_PLUGIN_SERVICE_DESCRIPTION%
: description of the service chosen by the user;%CUSTOM_PLUGIN_CREATOR_USERNAME%
: username of the user who created the service;%CUSTOM_PLUGIN_PROJECT_GIT_PATH%
: full path of the repository of the Git provider;%GIT_PROVIDER_PROJECT%
: name of the Git project entered by the user (e.g. GitHub repository or Gitlab project);%GIT_PROVIDER_GROUP%
: name of the group of Projects entered by the user (e.g. GitHub organization or Gitlab group);%GIT_PROVIDER_BASE_URL%
: URL base of the Git provider;%NEXUS_HOSTNAME%
: Docker registry hostname;%CUSTOM_PLUGIN_IMAGE_NAME%
(deprecated): name of the Docker image entered by the user;%CUSTOM_PLUGIN_PROJECT_ID%
(deprecated): id of the Console project;%CUSTOM_PLUGIN_PROJECT_NAMESPACE%
(deprecated): id of the Console project;%CUSTOM_PLUGIN_SERVICE_NAME%
(deprecated): service name chosen by the user.
Moreover, in the archive you can make use of the special root-level directory .mia-template/
. This folder will not be committed in the created repository: instead, its content will overwrite any file with the same name in the main directory (e.g., you can use it to provide a different README
file to developers or to store the images and the marketplace item configuration).