#!/bin/bash # Usage function usage() { echo "Usage: $0 [-l] [-f ] [-c ] [-w ] [-t ] [use_cache]" echo "Options:" echo " -f, --ftlbranch Specify FTL branch (cannot be used in conjunction with -l)" echo " -c, --corebranch Specify Core branch" echo " -w, --webbranch Specify Web branch" echo " -p, --paddbranch Specify PADD branch" echo " -t, --tag Specify Docker image tag (default: pihole:local)" echo " -l, --local Use locally built FTL binary (requires src/pihole-FTL file)" echo " use_cache Enable caching (by default --no-cache is used)" echo "" echo "If no options are specified, the following command will be executed:" echo " docker buildx build src/. --tag pihole:local --load --no-cache" exit 1 } # Set default values TAG="pihole:local" DOCKER_BUILD_CMD="docker buildx build src/. --tag ${TAG} --load --no-cache" FTL_FLAG=false CORE_FORK="pi-hole" WEB_FORK="pi-hole" PADD_FORK="pi-hole" # Check if buildx is installed docker buildx version >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "Error: Docker buildx is required to build this image. For installation instructions, see:" echo " https://github.com/docker/buildx#installing" exit 1 fi # Function to check if a custom branch entered by the user is valid check_branch_exists() { local repo=$1 local branch=$2 local fork=$3 local url if [ "$repo" == "ftl" ]; then # Special case for FTL - we check for the binary instead of just the branch - in case it is not yet built. url="https://ftl.pi-hole.net/${branch}/pihole-FTL-amd64" else url="https://github.com/${fork}/${repo}/blob/${branch}/README.md" fi local http_code http_code=$(curl -sI "$url" -o /dev/null -w "%{http_code}") if [ "${http_code}" -ne 200 ]; then echo "Error: $repo branch '$branch' not found. Exiting." exit 1 fi } # Parse command line arguments while [[ $# -gt 0 ]]; do key="$1" case $key in -l | --local) if [ ! -f "src/pihole-FTL" ]; then echo "File 'src/pihole-FTL' not found. Exiting." exit 1 fi if [ "$FTL_FLAG" = true ]; then echo "Error: Both -l and -f cannot be used together." usage fi FTL_FLAG=true DOCKER_BUILD_CMD+=" --build-arg FTL_SOURCE=local" shift ;; -f | --ftlbranch) if [ "$FTL_FLAG" = true ]; then echo "Error: Both -l and -f cannot be used together." usage fi FTL_FLAG=true FTL_BRANCH="$2" check_branch_exists "ftl" "$FTL_BRANCH" DOCKER_BUILD_CMD+=" --build-arg FTL_BRANCH=$FTL_BRANCH" shift shift ;; -c | --corebranch) CORE_BRANCH="$2" check_branch_exists "pi-hole" "$CORE_BRANCH" "$CORE_FORK" DOCKER_BUILD_CMD+=" --build-arg CORE_BRANCH=$CORE_BRANCH" shift shift ;; -w | --webbranch) WEB_BRANCH="$2" check_branch_exists "web" "$WEB_BRANCH" "$WEB_FORK" DOCKER_BUILD_CMD+=" --build-arg WEB_BRANCH=$WEB_BRANCH" shift shift ;; -p | --paddbranch) PADD_BRANCH="$2" check_branch_exists "padd" "$PADD_BRANCH" DOCKER_BUILD_CMD+=" --build-arg PADD_BRANCH=$PADD_BRANCH" shift shift ;; -cf | --corefork) CORE_FORK="$2" DOCKER_BUILD_CMD+=" --build-arg CORE_FORK=$CORE_FORK" shift shift ;; -wf | --webfork) WEB_FORK="$2" DOCKER_BUILD_CMD+=" --build-arg WEB_FORK=$WEB_FORK" shift shift ;; -pf | --paddfork) PADD_FORK="$2" DOCKER_BUILD_CMD+=" --build-arg PADD_FORK=$PADD_FORK" shift shift ;; -t | --tag) CUSTOM_TAG="$2" DOCKER_BUILD_CMD=${DOCKER_BUILD_CMD/$TAG/$CUSTOM_TAG} TAG=$CUSTOM_TAG shift shift ;; use_cache) DOCKER_BUILD_CMD=${DOCKER_BUILD_CMD/--no-cache/} shift ;; *) echo "Unknown option: $1" usage ;; esac done # Execute the docker build command echo "Executing command: $DOCKER_BUILD_CMD" eval "${DOCKER_BUILD_CMD}" # Check exit code of previous command if [ $? -ne 0 ]; then echo "" echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" echo "!! ERROR: Docker build failed, please review logs above !!" echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" exit 1 else echo "" echo "Successfully built Docker image with tag '$TAG'" docker images "${TAG}" fi