mirror of
https://github.com/pi-hole/docker-pi-hole.git
synced 2026-04-19 16:31:01 +01:00
Building a command string and calling eval is harder to reason about and requires careful manual quoting. Replacing with a bash array makes each argument explicit and removes the fragile string substitution previously used to toggle --no-cache and update the tag value. Signed-off-by: Adam Warner <me@adamwarner.co.uk> Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
168 lines
4.8 KiB
Bash
Executable File
168 lines
4.8 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
# Usage function
|
|
usage() {
|
|
echo "Usage: $0 [-l] [-f <ftl_branch>] [-c <core_branch>] [-w <web_branch>] [-t <tag>] [use_cache]"
|
|
echo "Options:"
|
|
echo " -f, --ftlbranch <branch> Specify FTL branch (cannot be used in conjunction with -l)"
|
|
echo " -c, --corebranch <branch> Specify Core branch"
|
|
echo " -w, --webbranch <branch> Specify Web branch"
|
|
echo " -p, --paddbranch <branch> Specify PADD branch"
|
|
echo " -t, --tag <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"
|
|
FTL_FLAG=false
|
|
USE_CACHE=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 --max-time 10 "$url" -o /dev/null -w "%{http_code}")
|
|
if [ "${http_code}" -ne 200 ]; then
|
|
echo "Error: $repo branch '$branch' not found. Exiting."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Collect extra --build-arg values from flags
|
|
BUILD_ARGS=()
|
|
|
|
# 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
|
|
BUILD_ARGS+=(--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"
|
|
BUILD_ARGS+=(--build-arg "FTL_BRANCH=$FTL_BRANCH")
|
|
shift
|
|
shift
|
|
;;
|
|
-c | --corebranch)
|
|
CORE_BRANCH="$2"
|
|
check_branch_exists "pi-hole" "$CORE_BRANCH" "$CORE_FORK"
|
|
BUILD_ARGS+=(--build-arg "CORE_BRANCH=$CORE_BRANCH")
|
|
shift
|
|
shift
|
|
;;
|
|
-w | --webbranch)
|
|
WEB_BRANCH="$2"
|
|
check_branch_exists "web" "$WEB_BRANCH" "$WEB_FORK"
|
|
BUILD_ARGS+=(--build-arg "WEB_BRANCH=$WEB_BRANCH")
|
|
shift
|
|
shift
|
|
;;
|
|
-p | --paddbranch)
|
|
PADD_BRANCH="$2"
|
|
check_branch_exists "padd" "$PADD_BRANCH"
|
|
BUILD_ARGS+=(--build-arg "PADD_BRANCH=$PADD_BRANCH")
|
|
shift
|
|
shift
|
|
;;
|
|
-cf | --corefork)
|
|
CORE_FORK="$2"
|
|
BUILD_ARGS+=(--build-arg "CORE_FORK=$CORE_FORK")
|
|
shift
|
|
shift
|
|
;;
|
|
-wf | --webfork)
|
|
WEB_FORK="$2"
|
|
BUILD_ARGS+=(--build-arg "WEB_FORK=$WEB_FORK")
|
|
shift
|
|
shift
|
|
;;
|
|
-pf | --paddfork)
|
|
PADD_FORK="$2"
|
|
BUILD_ARGS+=(--build-arg "PADD_FORK=$PADD_FORK")
|
|
shift
|
|
shift
|
|
;;
|
|
-t | --tag)
|
|
TAG="$2"
|
|
shift
|
|
shift
|
|
;;
|
|
use_cache)
|
|
USE_CACHE=true
|
|
shift
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
usage
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Build the command as an array to avoid eval and shell injection
|
|
DOCKER_BUILD_CMD=(docker buildx build src/. --tag "${TAG}" --load)
|
|
[ "$USE_CACHE" = false ] && DOCKER_BUILD_CMD+=(--no-cache)
|
|
DOCKER_BUILD_CMD+=("${BUILD_ARGS[@]}")
|
|
|
|
# Execute the docker build command
|
|
echo "Executing command: ${DOCKER_BUILD_CMD[*]}"
|
|
"${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
|