blob: d1c084185a7bd66aa971d36e0685281beac002aa [file]
#!/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.
#
#set -ex
script_dir="$(dirname "${BASH_SOURCE-$0}")"
script_dir="$(cd "${script_dir}">/dev/null; pwd)"
# Build docker image for multi-arch
# shellcheck disable=SC2089
usage() {
cat << EOF
Usage:
./build-docker.sh --platform [all|linux/amd64|linux/arm64] --type [gravitino|hive|kerberos-hive|trino|doris|ranger|iceberg-rest-server|lance-rest-server|mcp-server] --image {image_name} --tag {tag_name} --latest
Notice: You shouldn't use 'all' for the platform if you don't use the Github action to publish the Docker image.
EOF
}
# Get platform type
if [[ "$1" == "--platform" ]]; then
shift
platform_type="$1"
if [[ "${platform_type}" == "linux/amd64" || "${platform_type}" == "linux/arm64" || "${platform_type}" == "all" ]]; then
echo "INFO : platform type is ${platform_type}"
else
echo "ERROR : ${platform_type} is not a valid platform type"
usage
exit 1
fi
shift
else
platform_type="all"
fi
# Get component type
if [[ "$1" == "--type" ]]; then
shift
component_type="$1"
shift
else
echo "ERROR : must specify component type"
usage
exit 1
fi
# Get docker image name
if [[ "$1" == "--image" ]]; then
shift
image_name="$1"
shift
else
echo "ERROR : must specify image name"
usage
exit 1
fi
# Get docker image tag
if [[ "$1" == "--tag" ]]; then
shift
tag_name="$1"
shift
fi
# Get latest flag
build_latest=0
if [[ "$1" == "--latest" ]]; then
shift
build_latest=1
fi
if [[ "${component_type}" == "hive" ]]; then
. ${script_dir}/hive/hive-dependency.sh
build_args="
--build-arg HADOOP_PACKAGE_NAME=${HADOOP_PACKAGE_NAME} \
--build-arg HIVE_PACKAGE_NAME=${HIVE_PACKAGE_NAME} \
--build-arg HADOOP_VERSION=${HADOOP_VERSION} \
--build-arg HIVE_VERSION=${HIVE_VERSION} \
--build-arg MYSQL_JDBC_DRIVER_VERSION=${MYSQL_JDBC_DRIVER_VERSION} \
--build-arg RANGER_VERSION=${RANGER_VERSION} \
--build-arg ZOOKEEPER_VERSION=${ZOOKEEPER_VERSION} \
--build-arg HIVE2_VERSION=${HIVE2_VERSION} \
--build-arg HIVE3_VERSION=${HIVE3_VERSION} \
--build-arg HADOOP2_VERSION=${HADOOP2_VERSION} \
--build-arg HADOOP3_VERSION=${HADOOP3_VERSION}
"
elif [[ "${component_type}" == "kerberos-hive" ]]; then
. ${script_dir}/kerberos-hive/hive-dependency.sh
build_args="--build-arg HADOOP_PACKAGE_NAME=${HADOOP_PACKAGE_NAME} --build-arg HIVE_PACKAGE_NAME=${HIVE_PACKAGE_NAME} --build-arg JDBC_DIVER_PACKAGE_NAME=${JDBC_DIVER_PACKAGE_NAME}"
elif [ "${component_type}" == "trino" ]; then
. ${script_dir}/trino/trino-dependency.sh
elif [ "${component_type}" == "gravitino" ]; then
. ${script_dir}/gravitino/gravitino-dependency.sh
elif [ "${component_type}" == "doris" ]; then
. ${script_dir}/doris/doris-dependency.sh --platform ${platform_type}
build_args="--build-arg DORIS_VERSION=${DORIS_VERSION}"
elif [ "${component_type}" == "ranger" ]; then
. ${script_dir}/ranger/ranger-dependency.sh
build_args="--build-arg RANGER_PACKAGE_NAME=${RANGER_PACKAGE_NAME} --build-arg MYSQL_CONNECTOR_PACKAGE_NAME=${MYSQL_CONNECTOR_PACKAGE_NAME} --build-arg LOG4JDBC_PACKAGE_NAME=${LOG4JDBC_PACKAGE_NAME} --build-arg RANGER_VERSION=${RANGER_VERSION}"
elif [ "${component_type}" == "iceberg-rest-server" ]; then
. ${script_dir}/iceberg-rest-server/iceberg-rest-server-dependency.sh
elif [ "${component_type}" == "mcp-server" ]; then
. ${script_dir}/mcp-server/mcp-server-dependency.sh
elif [ "${component_type}" == "lance-rest-server" ]; then
. ${script_dir}/lance-rest-server/lance-rest-server-dependency.sh
else
echo "ERROR : ${component_type} is not a valid component type"
usage
exit 1
fi
build_args="${build_args} --build-arg IMAGE_NAME=${image_name} --build-arg TAG_NAME=${tag_name}"
# Create multi-arch builder
BUILDER_NAME="gravitino-builder"
builders=$(docker buildx ls)
if echo "${builders}" | grep -q "${BUILDER_NAME}"; then
echo "BuildKit builder '${BUILDER_NAME}' already exists."
else
echo "BuildKit builder '${BUILDER_NAME}' does not exist."
docker buildx create --driver-opt env.BUILDKIT_STEP_LOG_MAX_SIZE=10000000 --platform linux/amd64,linux/arm64 --name ${BUILDER_NAME}
fi
cd ${script_dir}/${component_type}
if [[ "${platform_type}" == "all" ]]; then
if [ ${build_latest} -eq 1 ]; then
docker buildx build --builder ${BUILDER_NAME} --no-cache --pull --platform=linux/amd64,linux/arm64 ${build_args} --push --progress plain -f Dockerfile -t ${image_name}:latest -t ${image_name}:${tag_name} .
else
docker buildx build --builder ${BUILDER_NAME} --no-cache --pull --platform=linux/amd64,linux/arm64 ${build_args} --push --progress plain -f Dockerfile -t ${image_name}:${tag_name} .
fi
else
if [ ${build_latest} -eq 1 ]; then
docker buildx build --builder ${BUILDER_NAME} --no-cache --pull --platform=${platform_type} ${build_args} --output type=docker --progress plain -f Dockerfile -t ${image_name}:latest -t ${image_name}:${tag_name} .
else
docker buildx build --builder ${BUILDER_NAME} --no-cache --pull --platform=${platform_type} ${build_args} --output type=docker --progress plain -f Dockerfile -t ${image_name}:${tag_name} .
fi
fi