# Dockerfile for image with ONAP Portal SDK demo app

# Multistage to be able to have SDK war content and not war itself
FROM busybox:latest AS war-decompress

# Arguments are supplied by build.sh script
# the defaults below only support testing
ARG SDK_WAR=build/epsdk-app-os.war

# Just variables, never passed in
ARG SDKCONTEXT=ONAPPORTALSDK

RUN mkdir ${SDKCONTEXT}

# SDK app has only a war
COPY $SDK_WAR ${SDKCONTEXT}
RUN cd ${SDKCONTEXT} && unzip -q *.war && rm *.war


# Yields an image 823 MB
FROM openjdk:8-alpine
# Yields an image 1.4 GB
# FROM openjdk:8-jdk
ARG SDK_WAR=build/epsdk-app-os.war
ARG HTTP_PROXY
ARG HTTPS_PROXY

# Just variables, never passed in
ARG TOMCAT_VERSION=8.0.37
ARG TOMCAT=apache-tomcat-${TOMCAT_VERSION}
ARG TOMCATTAR=${TOMCAT}.tar.gz
ARG TOMCATHOME=/opt/${TOMCAT}
ARG SDKCONTEXT=ONAPPORTALSDK


ENV http_proxy $HTTP_PROXY
ENV https_proxy $HTTPS_PROXY
RUN if [ ! -z ${HTTP_PROXY} ]; then echo "Acquire::http::proxy  \"${HTTP_PROXY}\";" >> /etc/apt/apt.conf; fi && \
    if [ ! -z ${HTTPS_PROXY} ]; then echo "Acquire::https::proxy \"${HTTPS_PROXY}\";" >> /etc/apt/apt.conf; fi

# Install Tomcat.  This image already has curl.
# Remove manager and sample apps
WORKDIR /tmp
RUN wget -q http://archive.apache.org/dist/tomcat/tomcat-8/v${TOMCAT_VERSION}/bin/${TOMCATTAR} && \
    tar -xzf ${TOMCATTAR} && \
    rm ${TOMCATTAR} &&\
    rm -fr ${TOMCAT}/webapps/[a-z]* &&\
    mkdir -p /opt &&\
    mv ${TOMCAT} /opt

COPY --from=war-decompress /${SDKCONTEXT} ${TOMCATHOME}/webapps/${SDKCONTEXT}/

VOLUME ${TOMCATHOME}/logs

# Switch back to root
WORKDIR /

# Define commonly used ENV variables
ENV PATH $PATH:$JAVA_HOME/bin:${TOMCATHOME}/bin
# Install the launch script
COPY start-apache-tomcat.sh /

# Define default command
CMD /start-apache-tomcat.sh
