-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdocker-build.sh
More file actions
executable file
·279 lines (225 loc) · 6.57 KB
/
docker-build.sh
File metadata and controls
executable file
·279 lines (225 loc) · 6.57 KB
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
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
#!/bin/bash
# ==========================================
# Docker 多平台构建和发布脚本
# ==========================================
# 使用 Docker Buildx 构建多架构镜像并推送到多个镜像仓库
# ==========================================
set -e # 遇到错误立即退出
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# ==========================================
# 配置区域
# ==========================================
# 项目信息
PROJECT_NAME="redis-proxy"
VERSION="${VERSION:-latest}" # 从环境变量获取版本号,默认为 latest
# 支持的平台
PLATFORMS="linux/amd64,linux/arm64,linux/arm/v7"
# 镜像仓库配置
# Docker Hub
DOCKERHUB_USERNAME="${DOCKERHUB_USERNAME:-your-dockerhub-username}"
DOCKERHUB_REPO="${DOCKERHUB_USERNAME}/${PROJECT_NAME}"
# 构建选项
PUSH="${PUSH:-false}" # 是否推送镜像
LOAD="${LOAD:-false}" # 是否加载到本地 Docker
CACHE="${CACHE:-true}" # 是否使用缓存
# ==========================================
# 函数定义
# ==========================================
# 显示帮助信息
show_help() {
cat << EOF
使用方法: $0 [选项]
选项:
-v, --version VERSION 指定版本号 (默认: latest)
-p, --push 构建并推送镜像到仓库
-l, --load 构建并加载到本地 Docker
--no-cache 不使用缓存构建
--platforms PLATFORMS 指定目标平台 (默认: linux/amd64,linux/arm64,linux/arm/v7)
-h, --help 显示此帮助信息
环境变量:
VERSION 镜像版本号
DOCKERHUB_USERNAME Docker Hub 用户名
DOCKERHUB_TOKEN Docker Hub 访问令牌
示例:
# 本地构建 (不推送)
$0
# 构建并推送到 Docker Hub
$0 --push --version v1.0.0
# 构建特定平台
$0 --platforms linux/amd64,linux/arm64
# 不使用缓存构建
$0 --no-cache --push
EOF
}
# 检查依赖
check_dependencies() {
log_info "检查依赖..."
# 检查 Docker
if ! command -v docker &> /dev/null; then
log_error "Docker 未安装,请先安装 Docker"
exit 1
fi
# 检查 Docker Buildx
if ! docker buildx version &> /dev/null; then
log_error "Docker Buildx 未安装,请先安装 Docker Buildx"
exit 1
fi
log_success "依赖检查完成"
}
# 创建 Buildx 构建器
setup_buildx() {
log_info "设置 Docker Buildx 构建器..."
# 检查构建器是否存在
if docker buildx inspect multiarch-builder &> /dev/null; then
log_info "构建器 multiarch-builder 已存在"
else
log_info "创建新的构建器 multiarch-builder"
docker buildx create --name multiarch-builder --driver docker-container --use
fi
# 使用构建器
docker buildx use multiarch-builder
# 启动构建器
docker buildx inspect --bootstrap
log_success "构建器设置完成"
}
# 登录镜像仓库
login_registry() {
log_info "登录 Docker Hub..."
if [ -n "$DOCKERHUB_TOKEN" ]; then
echo "$DOCKERHUB_TOKEN" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin
log_success "Docker Hub 登录成功"
else
log_error "未设置 DOCKERHUB_TOKEN 环境变量"
log_error "请设置 DOCKERHUB_TOKEN 或手动登录: docker login"
exit 1
fi
}
# 构建镜像
build_image() {
log_info "开始构建镜像..."
log_info "版本: $VERSION"
log_info "平台: $PLATFORMS"
# 构建参数
BUILD_ARGS=(
"buildx" "build"
"--platform" "$PLATFORMS"
"--file" "Dockerfile"
)
# 添加标签
TAGS=(
"--tag" "${DOCKERHUB_REPO}:${VERSION}"
)
# 如果不是 latest 版本,同时添加 latest 标签
if [ "$VERSION" != "latest" ]; then
TAGS+=("--tag" "${DOCKERHUB_REPO}:latest")
fi
BUILD_ARGS+=("${TAGS[@]}")
# 缓存选项
if [ "$CACHE" = false ]; then
BUILD_ARGS+=("--no-cache")
fi
# 推送或加载
if [ "$PUSH" = true ]; then
BUILD_ARGS+=("--push")
elif [ "$LOAD" = true ]; then
BUILD_ARGS+=("--load")
fi
# 构建上下文
BUILD_ARGS+=(".")
# 执行构建
log_info "执行命令: docker ${BUILD_ARGS[*]}"
docker "${BUILD_ARGS[@]}"
log_success "镜像构建完成"
}
# 显示构建信息
show_build_info() {
log_info "=========================================="
log_info "构建信息"
log_info "=========================================="
log_info "项目名称: $PROJECT_NAME"
log_info "版本号: $VERSION"
log_info "目标平台: $PLATFORMS"
log_info "推送镜像: $PUSH"
log_info "使用缓存: $CACHE"
if [ "$PUSH" = true ]; then
log_info "推送目标: Docker Hub (${DOCKERHUB_REPO}:${VERSION})"
fi
log_info "=========================================="
}
# ==========================================
# 主程序
# ==========================================
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case $1 in
-v|--version)
VERSION="$2"
shift 2
;;
-p|--push)
PUSH=true
shift
;;
-l|--load)
LOAD=true
shift
;;
--no-cache)
CACHE=false
shift
;;
--platforms)
PLATFORMS="$2"
shift 2
;;
-h|--help)
show_help
exit 0
;;
*)
log_error "未知选项: $1"
show_help
exit 1
;;
esac
done
# 显示构建信息
show_build_info
# 执行构建流程
check_dependencies
setup_buildx
# if [ "$PUSH" = true ]; then
# login_registry
# fi
build_image
log_success "=========================================="
log_success "构建流程完成!"
log_success "=========================================="
if [ "$PUSH" = true ]; then
log_success "镜像已推送到 Docker Hub:"
log_success " ✓ ${DOCKERHUB_REPO}:${VERSION}"
if [ "$VERSION" != "latest" ]; then
log_success " ✓ ${DOCKERHUB_REPO}:latest"
fi
log_success ""
log_success "拉取镜像:"
log_success " docker pull ${DOCKERHUB_REPO}:${VERSION}"
fi