3 # Licensed to the Apache Software Foundation (ASF) under one
4 # or more contributor license agreements. See the NOTICE file
5 # distributed with this work for additional information
6 # regarding copyright ownership. The ASF licenses this file
7 # to you under the Apache License, Version 2.0 (the
8 # "License"); you may not use this file except in compliance
9 # with the License. You may obtain a copy of the License at
11 # http://www.apache.org/licenses/LICENSE-2.0
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS,
15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 # See the License for the specific language governing permissions and
17 # limitations under the License.
21 # A driver script to build HBase master branch from source and start the HBase
22 # shell in a Docker container.
24 # Usage: This script automates the build process facilitated by the Dockerfile
25 # in the hbase_docker folder. In particular, it is assumed that an
26 # Oracle JDK .tar.gz and an Apache Maven .tar.gz file are both present in
27 # the same directory as the Dockerfile; this script can download and place
28 # those tarballs for you. Moreover, due to bugs in Docker, the docker build
29 # command occasionally fails, but then succeeds upon rerunning; this script
30 # will rerun the command and attempt to finish a build. Finally, this
31 # script allows you to specify a desired name for the Docker image being
32 # created, defaulting to "hbase_docker." For complete usage instructions,
33 # run this script with the -h or --help option.
35 # Example: To build HBase and start an HBase shell using Oracle JDK 7u67 and
38 # # ./hbase_docker.sh -j http://download.oracle.com/otn-pub/java/jdk/7u67-b01/jdk-7u67-linux-x64.tar.gz \
39 # -m http://apache.claz.org/maven/maven-3/3.2.3/binaries/apache-maven-3.2.3-bin.tar.gz
42 # Before doing anything else, make sure Docker is installed.
43 if ! which docker
&> /dev
/null
; then
45 Docker must be installed to run hbase_docker. Go to http://www.docker.io
46 for installation instructions. Exiting...
49 elif ! docker ps
&> /dev
/null
; then
50 echo "Docker must be run as root or with sudo privileges. Exiting..." >&2
56 SCRIPT
=$
(basename "${BASH_SOURCE}")
60 hbase_docker. A driver script for building HBase and starting the HBase shell
61 inside of a Docker container.
63 Usage: ${SCRIPT} [-j | --jdk <url>] [-m | --mvn <url>] [-n | --name <name>]
66 -h | --help Show this screen.
67 -j | --jdk '<url>' A URL pointing to an x64 .tar.gz file of Oracle's JDK.
68 Using this argument implies acceptance of the Oracle
69 Binary Code License Agreement for Java SE. See www.oracle.com
71 -m | --mvn '<url>' A URL pointing to an x64 .tar.gz file of Apache Maven.
72 -n | --name <name> The name to give to the Docker image created by this script.
73 If left blank, "hbase_docker" will be used.
77 if ! [ ${#} -le 6 ]; then
82 # Default Docker image name.
83 IMAGE_NAME
=hbase_docker
90 JDK_URL
="${2}"; shift 2 ;;
92 MAVEN_URL
="${2}"; shift 2 ;;
94 IMAGE_NAME
="${2}"; shift 2 ;;
100 # The relative file path to the directory containing this script. This allows the
101 # script to be run from any working directory and still have it place downloaded
102 # files in the right locations.
103 SCRIPT_DIRECTORY
=$
(dirname ${BASH_SOURCE})
105 # If JDK_URL is set, download the JDK into the hbase_docker folder.
106 if [ -n "${JDK_URL}" ]; then
107 echo "Downloading Oracle JDK..."
108 ORACLE_HEADER
="Cookie: oraclelicense=accept-securebackup-cookie"
109 if ! wget
-nv -N --header "${ORACLE_HEADER}" -P "${SCRIPT_DIRECTORY}/hbase_docker" \
111 echo "Error downloading Oracle JDK. Exiting..." >&2
116 # If MAVEN_URL is set, download Maven into the hbase_docker folder.
117 if [ -n "${MAVEN_URL}" ]; then
118 echo "Downloading Apache Maven..."
119 if ! wget
-nv -N -P "${SCRIPT_DIRECTORY}/hbase_docker" "${MAVEN_URL}"; then
120 echo "Error downloading Apache Maven. Exiting..." >&2
125 # Before running docker build, confirm that the hbase_docker folder contains
126 # one JDK .tar.gz and one Maven .tar.gz.
127 FILE_CHECK_EXIT_CODE
=0
128 for file in jdk maven
; do
129 NUM_FILES
=$
(ls -l "${SCRIPT_DIRECTORY}/hbase_docker/"*${file}*.
tar.gz
2>/dev
/null | \
131 if [ ${NUM_FILES} -eq 0 ]; then
132 echo "Could not detect tarball containing \"${file}\" in hbase_docker folder." >&2
133 FILE_CHECK_EXIT_CODE
=1
134 elif [ ${NUM_FILES} -gt 1 ]; then
135 echo "There are too many files containing \"${file}\" in hbase_docker folder." >&2
136 FILE_CHECK_EXIT_CODE
=1
139 if [ ${FILE_CHECK_EXIT_CODE} -ne 0 ]; then
140 echo "Required dependencies not satisfied. Exiting..." >&2
144 # docker build can be buggy (e.g. see https://github.com/docker/docker/issues/4036).
145 # To get around this, this script will try doing up to ${MAX_BUILD_ATTEMPTS} builds.
147 MAX_BUILD_ATTEMPTS
=10
148 echo "Beginning docker build..."
149 until docker build
-t ${IMAGE_NAME} ${SCRIPT_DIRECTORY}/hbase_docker
; do
151 if [ ${BUILD_ATTEMPTS} -ge ${MAX_BUILD_ATTEMPTS} ]; then
152 echo "Build of ${IMAGE_NAME} failed after ${BUILD_ATTEMPTS} attempts. Exiting..." >&2
155 echo "Build attempt #${BUILD_ATTEMPTS} of ${IMAGE_NAME} was unsuccessful. Retrying..."
159 echo "Successfully built ${IMAGE_NAME}."
161 echo "Starting hbase shell..."
162 docker run
--ulimit nproc
=12500 -it ${IMAGE_NAME}