2014-09-05 20:36:18 -04:00
|
|
|
#!/bin/bash
|
|
|
|
#
|
|
|
|
# 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.
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# hbase_docker.sh
|
|
|
|
# A driver script to build HBase master branch from source and start the HBase
|
|
|
|
# shell in a Docker container.
|
|
|
|
#
|
|
|
|
# Usage: This script automates the build process facilitated by the Dockerfile
|
|
|
|
# in the hbase_docker folder. In particular, it is assumed that an
|
|
|
|
# Oracle JDK .tar.gz and an Apache Maven .tar.gz file are both present in
|
|
|
|
# the same directory as the Dockerfile; this script can download and place
|
|
|
|
# those tarballs for you. Moreover, due to bugs in Docker, the docker build
|
|
|
|
# command occasionally fails, but then succeeds upon rerunning; this script
|
|
|
|
# will rerun the command and attempt to finish a build. Finally, this
|
|
|
|
# script allows you to specify a desired name for the Docker image being
|
|
|
|
# created, defaulting to "hbase_docker." For complete usage instructions,
|
|
|
|
# run this script with the -h or --help option.
|
|
|
|
#
|
|
|
|
# Example: To build HBase and start an HBase shell using Oracle JDK 7u67 and
|
|
|
|
# Apache Maven 3.2.3:
|
|
|
|
#
|
|
|
|
# # ./hbase_docker.sh -j http://download.oracle.com/otn-pub/java/jdk/7u67-b01/jdk-7u67-linux-x64.tar.gz \
|
|
|
|
# -m http://apache.claz.org/maven/maven-3/3.2.3/binaries/apache-maven-3.2.3-bin.tar.gz
|
|
|
|
|
|
|
|
|
|
|
|
# Before doing anything else, make sure Docker is installed.
|
|
|
|
if ! which docker &> /dev/null; then
|
|
|
|
cat >&2 << __EOF
|
|
|
|
Docker must be installed to run hbase_docker. Go to http://www.docker.io
|
|
|
|
for installation instructions. Exiting...
|
|
|
|
__EOF
|
|
|
|
exit 1
|
|
|
|
elif ! docker ps &> /dev/null; then
|
|
|
|
echo "Docker must be run as root or with sudo privileges. Exiting..." >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Usage message.
|
|
|
|
usage() {
|
|
|
|
SCRIPT=$(basename "${BASH_SOURCE}")
|
|
|
|
|
|
|
|
cat << __EOF
|
|
|
|
|
|
|
|
hbase_docker. A driver script for building HBase and starting the HBase shell
|
|
|
|
inside of a Docker container.
|
|
|
|
|
|
|
|
Usage: ${SCRIPT} [-j | --jdk <url>] [-m | --mvn <url>] [-n | --name <name>]
|
|
|
|
${SCRIPT} -h | --help
|
|
|
|
|
|
|
|
-h | --help Show this screen.
|
|
|
|
-j | --jdk '<url>' A URL pointing to an x64 .tar.gz file of Oracle's JDK.
|
|
|
|
Using this argument implies acceptance of the Oracle
|
|
|
|
Binary Code License Agreement for Java SE. See www.oracle.com
|
|
|
|
for more details.
|
|
|
|
-m | --mvn '<url>' A URL pointing to an x64 .tar.gz file of Apache Maven.
|
|
|
|
-n | --name <name> The name to give to the Docker image created by this script.
|
|
|
|
If left blank, "hbase_docker" will be used.
|
|
|
|
__EOF
|
|
|
|
}
|
|
|
|
|
|
|
|
if ! [ ${#} -le 6 ]; then
|
|
|
|
usage >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Default Docker image name.
|
|
|
|
IMAGE_NAME=hbase_docker
|
|
|
|
|
|
|
|
while ((${#})); do
|
|
|
|
case "${1}" in
|
|
|
|
-h | --help )
|
|
|
|
usage; exit 0 ;;
|
|
|
|
-j | --jdk )
|
|
|
|
JDK_URL="${2}"; shift 2 ;;
|
|
|
|
-m | --mvn )
|
|
|
|
MAVEN_URL="${2}"; shift 2 ;;
|
|
|
|
-n | --name )
|
|
|
|
IMAGE_NAME="${2}"; shift 2 ;;
|
|
|
|
* )
|
|
|
|
usage >&2; exit 1 ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
# The relative file path to the directory containing this script. This allows the
|
|
|
|
# script to be run from any working directory and still have it place downloaded
|
|
|
|
# files in the right locations.
|
|
|
|
SCRIPT_DIRECTORY=$(dirname ${BASH_SOURCE})
|
|
|
|
|
|
|
|
# If JDK_URL is set, download the JDK into the hbase_docker folder.
|
|
|
|
if [ -n "${JDK_URL}" ]; then
|
|
|
|
echo "Downloading Oracle JDK..."
|
|
|
|
ORACLE_HEADER="Cookie: oraclelicense=accept-securebackup-cookie"
|
|
|
|
if ! wget -nv -N --header "${ORACLE_HEADER}" -P "${SCRIPT_DIRECTORY}/hbase_docker" \
|
|
|
|
"${JDK_URL}"; then
|
|
|
|
echo "Error downloading Oracle JDK. Exiting..." >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
# If MAVEN_URL is set, download Maven into the hbase_docker folder.
|
|
|
|
if [ -n "${MAVEN_URL}" ]; then
|
|
|
|
echo "Downloading Apache Maven..."
|
|
|
|
if ! wget -nv -N -P "${SCRIPT_DIRECTORY}/hbase_docker" "${MAVEN_URL}"; then
|
|
|
|
echo "Error downloading Apache Maven. Exiting..." >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Before running docker build, confirm that the hbase_docker folder contains
|
|
|
|
# one JDK .tar.gz and one Maven .tar.gz.
|
|
|
|
FILE_CHECK_EXIT_CODE=0
|
|
|
|
for file in jdk maven; do
|
|
|
|
NUM_FILES=$(ls -l "${SCRIPT_DIRECTORY}/hbase_docker/"*${file}*.tar.gz 2>/dev/null | \
|
|
|
|
wc -l)
|
|
|
|
if [ ${NUM_FILES} -eq 0 ]; then
|
|
|
|
echo "Could not detect tarball containing \"${file}\" in hbase_docker folder." >&2
|
|
|
|
FILE_CHECK_EXIT_CODE=1
|
|
|
|
elif [ ${NUM_FILES} -gt 1 ]; then
|
|
|
|
echo "There are too many files containing \"${file}\" in hbase_docker folder." >&2
|
|
|
|
FILE_CHECK_EXIT_CODE=1
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
if [ ${FILE_CHECK_EXIT_CODE} -ne 0 ]; then
|
|
|
|
echo "Required dependencies not satisfied. Exiting..." >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
# docker build can be buggy (e.g. see https://github.com/docker/docker/issues/4036).
|
|
|
|
# To get around this, this script will try doing up to ${MAX_BUILD_ATTEMPTS} builds.
|
|
|
|
BUILD_ATTEMPTS=0
|
|
|
|
MAX_BUILD_ATTEMPTS=10
|
|
|
|
echo "Beginning docker build..."
|
|
|
|
until docker build -t ${IMAGE_NAME} ${SCRIPT_DIRECTORY}/hbase_docker; do
|
|
|
|
((++BUILD_ATTEMPTS))
|
|
|
|
if [ ${BUILD_ATTEMPTS} -ge ${MAX_BUILD_ATTEMPTS} ]; then
|
|
|
|
echo "Build of ${IMAGE_NAME} failed after ${BUILD_ATTEMPTS} attempts. Exiting..." >&2
|
|
|
|
exit 1
|
|
|
|
else
|
|
|
|
echo "Build attempt #${BUILD_ATTEMPTS} of ${IMAGE_NAME} was unsuccessful. Retrying..."
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
echo "Successfully built ${IMAGE_NAME}."
|
|
|
|
|
|
|
|
echo "Starting hbase shell..."
|
2020-04-06 21:23:35 -04:00
|
|
|
docker run --ulimit nproc=12500 -it ${IMAGE_NAME}
|