#
# 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 centos
MAINTAINER Gang Wang (garyw@apache.org)

#set up your proxy below, refer to readme in the Docker folder
# ENV proxy_host "172.17.42.1"
# ENV proxy_port "8668"
ENV proxy_host ""
ENV proxy_port ""

#ENV http_proxy "http://${proxy_host}:${proxy_port}"
#ENV https_proxy ${http_proxy}
#ENV HTTP_PROXY ${http_proxy}
#ENV HTTPS_PROXY ${http_proxy}
#ENV proxy ${http_proxy}

ENV LC_ALL en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.UTF-8

RUN yum -y update && yum -y groupinstall 'Development Tools' && \
    yum -y install ruby ruby-devel rubygems zlib-devel && yum clean all

RUN gem install jekyll bundler nokogiri

RUN mkdir -p /ws && cd /ws && git clone https://gitbox.apache.org/repos/asf/mnemonic-site.git && \
    cd mnemonic-site && bundle install

ENV MNEMONIC_SITE_HOME /ws/mnemonic-site

WORKDIR /ws
CMD ["bash"]

