#########
#  ============LICENSE_START====================================================
#  org.onap.aaf
#  ===========================================================================
#  Copyright (c) 2017 AT&T Intellectual Property. All rights reserved.
#  ===========================================================================
#  Licensed 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.
#  ============LICENSE_END====================================================
#
FROM ${DOCKER_REPOSITORY}/onap/aaf/aaf_base:${AAF_VERSION}
MAINTAINER AAF Team, AT&T 2018
ENV VERSION=${AAF_VERSION}

LABEL description="aaf_hello"
LABEL version=${AAF_VERSION}
 
COPY bin/pod_wait.sh /opt/app/aaf/bin/
COPY lib /opt/app/aaf/lib
COPY bin/hello /opt/app/aaf/bin/
COPY etc /opt/app/aaf/etc
COPY logs /opt/app/aaf/logs

RUN mkdir -p /opt/app/osaaf &&\
    mkdir -p /opt/app/aaf/status &&\
    chmod 755 /opt/app/aaf/bin/* &&\
    if [ -n "${DUSER}" ]; then  chown ${DUSER}:${DUSER} /opt/app/aaf/status \
      && chown ${DUSER}:${DUSER} /opt/app/osaaf \
      && chown -R ${DUSER}:${DUSER} /opt/app/aaf;\
    fi

CMD []
