-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdocker-build.sh
executable file
·222 lines (199 loc) · 6.08 KB
/
docker-build.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#!/bin/bash
# Set strict error handling
set -euo pipefail
IFS=$'\n\t'
# Default values
REGISTRY=""
VERSION="latest"
PLATFORMS="linux/amd64,linux/arm64,linux/arm/v7"
PUSH=false
BUILD_ALL=true
BUILDER_NAME="webgyb-multiarch"
CLEANUP=false
# Color output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Help function
show_help() {
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " -h, --help Show this help message"
echo " -r, --registry REGISTRY Docker registry (e.g., 'username/' or 'registry.example.com/')"
echo " -v, --version VERSION Image version tag (default: latest)"
echo " -p, --platform PLATFORM Build for specific platform (amd64, arm64, or armv7)"
echo " --push Push images to registry"
echo " --cleanup Remove builders and temporary containers after build"
echo ""
echo "Examples:"
echo " $0 # Build all architectures locally"
echo " $0 -p amd64 # Build only AMD64 architecture"
echo " $0 -r username/ --push # Build all and push to Docker Hub"
echo " $0 --cleanup # Clean up all builders and temporary containers"
}
# Log function
log() {
local level=$1
shift
case $level in
"info")
echo -e "${GREEN}[INFO]${NC} $*"
;;
"warn")
echo -e "${YELLOW}[WARN]${NC} $*"
;;
"error")
echo -e "${RED}[ERROR]${NC} $*"
;;
esac
}
# Error handler
error_handler() {
log "error" "An error occurred on line $1"
cleanup_resources
exit 1
}
trap 'error_handler ${LINENO}' ERR
# Cleanup function
cleanup_resources() {
log "info" "Cleaning up resources..."
# Stop and remove any running webgyb containers
local containers
containers=$(docker ps -a --filter "ancestor=webgyb" --format "{{.ID}}" 2>/dev/null || true)
if [ -n "$containers" ]; then
log "info" "Stopping and removing webgyb containers..."
echo "$containers" | xargs docker stop >/dev/null 2>&1 || true
echo "$containers" | xargs docker rm >/dev/null 2>&1 || true
fi
# Remove buildx builders
log "info" "Removing buildx builders..."
docker buildx rm "$BUILDER_NAME" >/dev/null 2>&1 || true
docker buildx rm multiplatform-builder >/dev/null 2>&1 || true
log "info" "Cleanup completed"
}
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_help
exit 0
;;
-r|--registry)
REGISTRY="$2"
shift 2
;;
-v|--version)
VERSION="$2"
shift 2
;;
-p|--platform)
case $2 in
amd64)
PLATFORMS="linux/amd64"
;;
arm64)
PLATFORMS="linux/arm64"
;;
armv7)
PLATFORMS="linux/arm/v7"
;;
*)
log "error" "Invalid platform. Use amd64, arm64, or armv7"
exit 1
;;
esac
BUILD_ALL=false
shift 2
;;
--push)
PUSH=true
shift
;;
--cleanup)
CLEANUP=true
shift
;;
*)
log "error" "Unknown option: $1"
show_help
exit 1
;;
esac
done
# Setup buildx
setup_buildx() {
log "info" "Setting up Docker Buildx..."
if ! docker buildx inspect "$BUILDER_NAME" >/dev/null 2>&1; then
docker buildx create --name "$BUILDER_NAME" --driver docker-container --bootstrap
fi
docker buildx use "$BUILDER_NAME"
}
# Function to build for a specific platform
build_platform() {
local platform=$1
local tag_suffix=$2
log "info" "Building for $platform..."
if [ "$PUSH" = true ]; then
log "info" "Building and pushing for $platform..."
docker buildx build --platform "$platform" \
-t "${REGISTRY}webgyb:${VERSION}-${tag_suffix}" \
-t "${REGISTRY}webgyb:latest-${tag_suffix}" \
--push .
else
log "info" "Building locally for $platform..."
docker buildx build --platform "$platform" \
-t "webgyb:${tag_suffix}" \
--load .
fi
}
# Main build process
main() {
# If only cleanup is requested
if [ "$CLEANUP" = true ] && [ "$BUILD_ALL" = true ] && [ "$PUSH" = false ]; then
cleanup_resources
exit 0
fi
setup_buildx
if [ "$BUILD_ALL" = true ]; then
if [ "$PUSH" = true ]; then
log "info" "Building and pushing all architectures..."
docker buildx build --platform "$PLATFORMS" \
-t "${REGISTRY}webgyb:${VERSION}" \
-t "${REGISTRY}webgyb:latest" \
--push .
else
log "info" "Building all architectures locally..."
build_platform "linux/amd64" "amd64"
build_platform "linux/arm64" "arm64"
build_platform "linux/arm/v7" "armv7"
fi
else
case $PLATFORMS in
"linux/amd64")
build_platform "$PLATFORMS" "amd64"
;;
"linux/arm64")
build_platform "$PLATFORMS" "arm64"
;;
"linux/arm/v7")
build_platform "$PLATFORMS" "armv7"
;;
esac
fi
# Show results
log "info" "Build completed successfully!"
echo -e "\nAvailable images:"
docker images webgyb
echo -e "\nUsage examples:"
echo " AMD64 (x86_64): docker run -p 3000:3000 -v \"\$(pwd)/accounts:/app/accounts\" webgyb:amd64"
echo " ARM64: docker run -p 3000:3000 -v \"\$(pwd)/accounts:/app/accounts\" webgyb:arm64"
echo " ARM/v7: docker run -p 3000:3000 -v \"\$(pwd)/accounts:/app/accounts\" webgyb:armv7"
# Cleanup if requested
if [ "$CLEANUP" = true ]; then
cleanup_resources
fi
}
# Run main function
main