FINAL: Hopefully!
This commit is contained in:
222
docker-multiarch-build.sh
Executable file
222
docker-multiarch-build.sh
Executable file
@ -0,0 +1,222 @@
|
||||
#!/bin/bash
|
||||
# HMAC File Server 3.3.0 "Nexus Infinitum" - Docker Multi-Architecture Builder
|
||||
# Builds multi-arch Docker images using Docker Buildx
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Colors
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
PURPLE='\033[0;35m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
# Configuration
|
||||
IMAGE_NAME="hmac-file-server"
|
||||
VERSION="3.3.0"
|
||||
REGISTRY="localhost" # Change to your registry
|
||||
PLATFORMS="linux/amd64,linux/arm64,linux/arm/v7"
|
||||
|
||||
# Functions
|
||||
print_header() {
|
||||
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║${NC} ${CYAN}HMAC File Server Docker Multi-Architecture Builder${NC} ${BLUE}║${NC}"
|
||||
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
}
|
||||
|
||||
print_info() {
|
||||
echo -e "${GREEN}✓${NC} $1"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}⚠${NC} $1"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}✗${NC} $1"
|
||||
}
|
||||
|
||||
print_status() {
|
||||
echo -e "${PURPLE}▶${NC} $1"
|
||||
}
|
||||
|
||||
check_requirements() {
|
||||
print_status "Checking requirements..."
|
||||
|
||||
# Check Docker
|
||||
if ! command -v docker >/dev/null 2>&1; then
|
||||
print_error "Docker is not installed or not in PATH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check Docker Buildx
|
||||
if ! docker buildx version >/dev/null 2>&1; then
|
||||
print_error "Docker Buildx is not available"
|
||||
print_info "Install with: docker buildx install"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if Docker daemon is running
|
||||
if ! docker info >/dev/null 2>&1; then
|
||||
print_error "Docker daemon is not running"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
print_info "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') detected"
|
||||
print_info "Buildx $(docker buildx version | cut -d' ' -f2) detected"
|
||||
}
|
||||
|
||||
setup_buildx() {
|
||||
print_status "Setting up Docker Buildx..."
|
||||
|
||||
# Create builder if it doesn't exist
|
||||
if ! docker buildx inspect multiarch-builder >/dev/null 2>&1; then
|
||||
print_status "Creating multiarch builder..."
|
||||
docker buildx create --name multiarch-builder --use --bootstrap
|
||||
print_info "Multiarch builder created and activated"
|
||||
else
|
||||
print_info "Using existing multiarch builder"
|
||||
docker buildx use multiarch-builder
|
||||
fi
|
||||
|
||||
# Verify platforms
|
||||
print_status "Available platforms:"
|
||||
docker buildx inspect --bootstrap | grep "Platforms:" | head -1
|
||||
}
|
||||
|
||||
build_images() {
|
||||
local push_flag=""
|
||||
if [ "${1:-}" = "--push" ]; then
|
||||
push_flag="--push"
|
||||
print_warning "Images will be pushed to registry"
|
||||
else
|
||||
push_flag="--load"
|
||||
print_info "Images will be loaded locally (AMD64 only)"
|
||||
fi
|
||||
|
||||
print_status "Building multi-architecture images..."
|
||||
|
||||
# Build and optionally push
|
||||
docker buildx build \
|
||||
--platform $PLATFORMS \
|
||||
--file Dockerfile.multiarch \
|
||||
--tag "${REGISTRY}/${IMAGE_NAME}:${VERSION}" \
|
||||
--tag "${REGISTRY}/${IMAGE_NAME}:latest" \
|
||||
$push_flag \
|
||||
.
|
||||
|
||||
if [ "$push_flag" = "--push" ]; then
|
||||
print_info "Multi-arch images built and pushed successfully"
|
||||
else
|
||||
print_info "Multi-arch images built and loaded locally"
|
||||
fi
|
||||
}
|
||||
|
||||
test_images() {
|
||||
print_status "Testing built images..."
|
||||
|
||||
# Test AMD64 image (if loaded locally)
|
||||
if [ "${1:-}" != "--push" ]; then
|
||||
print_status "Testing AMD64 image..."
|
||||
if docker run --rm "${REGISTRY}/${IMAGE_NAME}:${VERSION}" -version 2>/dev/null; then
|
||||
print_info "AMD64 image test passed"
|
||||
else
|
||||
print_warning "AMD64 image test failed (this is normal if image wasn't loaded)"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Show image info
|
||||
print_status "Image information:"
|
||||
docker images "${REGISTRY}/${IMAGE_NAME}" 2>/dev/null | head -2 || print_warning "Images not found locally (normal if pushed to registry)"
|
||||
}
|
||||
|
||||
show_usage() {
|
||||
echo "Usage: $0 [OPTIONS]"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " --push Build and push to registry (multi-arch)"
|
||||
echo " --local Build for local use (AMD64 only)"
|
||||
echo " --registry REG Set registry (default: localhost)"
|
||||
echo " --help Show this help"
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " $0 --local # Build for local testing"
|
||||
echo " $0 --push # Build and push multi-arch"
|
||||
echo " $0 --registry hub.docker.com --push # Push to Docker Hub"
|
||||
}
|
||||
|
||||
# Main execution
|
||||
main() {
|
||||
local push_mode=""
|
||||
|
||||
# Parse arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--push)
|
||||
push_mode="--push"
|
||||
shift
|
||||
;;
|
||||
--local)
|
||||
push_mode="--local"
|
||||
shift
|
||||
;;
|
||||
--registry)
|
||||
REGISTRY="$2"
|
||||
shift 2
|
||||
;;
|
||||
--help)
|
||||
show_usage
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
print_error "Unknown option: $1"
|
||||
show_usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
print_header
|
||||
|
||||
print_info "Configuration:"
|
||||
print_info " Image: ${REGISTRY}/${IMAGE_NAME}:${VERSION}"
|
||||
print_info " Platforms: ${PLATFORMS}"
|
||||
print_info " Registry: ${REGISTRY}"
|
||||
echo ""
|
||||
|
||||
check_requirements
|
||||
setup_buildx
|
||||
|
||||
echo ""
|
||||
|
||||
if [ "$push_mode" = "--push" ]; then
|
||||
build_images --push
|
||||
else
|
||||
build_images --local
|
||||
fi
|
||||
|
||||
echo ""
|
||||
test_images "$push_mode"
|
||||
|
||||
echo ""
|
||||
print_info "Multi-architecture Docker build complete!"
|
||||
|
||||
if [ "$push_mode" = "--push" ]; then
|
||||
echo ""
|
||||
print_info "To use the images:"
|
||||
echo " docker run -p 8080:8080 ${REGISTRY}/${IMAGE_NAME}:${VERSION}"
|
||||
echo " docker run --platform linux/arm64 ${REGISTRY}/${IMAGE_NAME}:${VERSION}"
|
||||
else
|
||||
echo ""
|
||||
print_info "To push to registry later:"
|
||||
echo " $0 --registry YOUR_REGISTRY --push"
|
||||
fi
|
||||
}
|
||||
|
||||
# Check if script is executed directly
|
||||
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||
main "$@"
|
||||
fi
|
Reference in New Issue
Block a user