<#--
  ~ Licensed to the Apache Software Foundation (ASF) under one or more
  ~ contributor license agreements.  See the NOTICE file distributed with
  ~ this work for additional information regarding copyright ownership.
  ~ The ASF licenses this file to You under the Apache License, Version 2.0
  ~ (the "License"); you may not use this file except in compliance with
  ~ the License.  You may obtain a copy of the License at
  ~
  ~     http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
-->
version: '2.1'

networks:
   default:
     name: ${network_name}

services:
<#list services as service>
    ${service.name}:
        image: ${service.imageName}
        hostname: ${service.hostname}
        <#if service.volumes??>
        volumes:
        <#list service.volumes as volume>
            - ${volume}
        </#list>
        </#if>
        <#if service.volumes_from??>
        volumes_from:
        <#list service.volumes_from as volume>
            - ${volume}
        </#list>
        </#if>
        <#if service.environment??>
        environment:
        <#list service.environment as environment>
            - ${environment}
        </#list>
        </#if>
        <#if service.expose??>
        expose:
        <#list service.expose as expose>
            - ${expose}
        </#list>
        </#if>
        <#if service.ports??>
        ports:
        <#list service.ports as port>
            - ${port}
        </#list>
        </#if>
        <#if service.startScript??>
        command:
        <#list service.startScript as startScript>
            - ${startScript}
        </#list>
        </#if>
        <#if service.depends_on??>
        depends_on:
        <#list service.depends_on as item>
            - ${item}
        </#list>
        </#if>
        <#if service.entrypoint??>
        entrypoint:
        <#list service.entrypoint as item>
            - ${item}
        </#list>
        </#if>
        <#if service.healthcheck??>
        healthcheck:
        <#list service.healthcheck as item>
            ${item}
        </#list>
        </#if>
        <#if service.links??>
        links:
        <#list service.links as item>
            - ${item}
        </#list>
        </#if>
</#list>
