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

FROM atlas-base:latest

ARG HADOOP_VERSION


COPY ./downloads/hadoop-${HADOOP_VERSION}.tar.gz /home/atlas/dist/

COPY ./scripts/atlas-hadoop-setup.sh             /home/atlas/scripts/
COPY ./scripts/atlas-hadoop.sh                   /home/atlas/scripts/
COPY ./scripts/atlas-hadoop-mkdir.sh             /home/atlas/scripts/

RUN tar xvfz /home/atlas/dist/hadoop-${HADOOP_VERSION}.tar.gz --directory=/opt/ && \
    ln -s /opt/hadoop-${HADOOP_VERSION} /opt/hadoop && \
    rm -f /home/atlas/dist/hadoop-${HADOOP_VERSION}.tar.gz

ENV HADOOP_HOME        /opt/hadoop
ENV HADOOP_CONF_DIR    /opt/hadoop/etc/hadoop
ENV HADOOP_HDFS_HOME   /opt/hadoop
ENV HADOOP_MAPRED_HOME /opt/hadoop
ENV HADOOP_COMMON_HOME /opt/hadoop
ENV YARN_HOME          /opt/hadoop
ENV PATH               /usr/java/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/hadoop/bin

EXPOSE 9000
EXPOSE 8088

ENTRYPOINT [ "/home/atlas/scripts/atlas-hadoop.sh" ]
