<#--
  ~ 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.
-->

docker run -d \
        --memory=1024m \
        --name ${docker_container_name} \
        --env SCENARIO_NAME=${scenario_name} \
        --env SCENARIO_VERSION=${scenario_version}  \
        --env SCENARIO_SUPPORT_FRAMEWORK=${scenario_name} \
        <#if start_script??>
        --env SCENARIO_START_SCRIPT=${start_script} \
        </#if>
        --env SCENARIO_ENTRY_SERVICE=${entry_service} \
        --env SCENARIO_HEALTH_CHECK_URL=${health_check} \
        --env SCENARIO_EXTEND_ENTRY_HEADER=${extend_entry_header} \
        <#if catalina_opts??>
        --env CATALINA_OPTS=${catalina_opts} \
        </#if>
        <#if debug_mode??>
        --env DEBUG_MODE=${debug_mode} \
        </#if>
        <#if environments??>
        <#list environments as env>
        --env ${env} \
        </#list>
        </#if>
        -v ${agent_home}:/usr/local/skywalking/scenario/agent \
        -v ${scenario_home}:/usr/local/skywalking/scenario \
        -v ${jacoco_home}:/jacoco \
        ${docker_image_name}:${docker_image_version}

sleep 3

container_name=`docker ps -aqf "name=${docker_container_name}"`
<#noparse>
if [[ -z ${container_name} ]]; then
    echo "docker startup failure!" >&2
    echo "=== docker ps -a ===" >&2
    docker ps -a >&2 || true
    # Create container.log with diagnostic info
    mkdir -p ${SCENARIO_HOME}/logs
    {
        echo "=== CONTAINER STARTUP FAILURE ==="
        echo "Container not found by docker ps"
        echo "=== docker ps -a ==="
        docker ps -a 2>&1 || true
    } >${SCENARIO_HOME}/logs/container.log
    status=1
else
    status=$(docker wait ${container_name})

    [[ $status -ne 0 ]] && docker logs ${container_name} >&2
    # Recreate logs dir in case the container removed it via volume mount
    mkdir -p ${SCENARIO_HOME}/logs
    docker logs ${container_name} >${SCENARIO_HOME}/logs/container.log
    docker container rm -f $container_name
fi
</#noparse>
