🐳 修改 docker 构建逻辑.
This commit is contained in:
207
docker/docker-build.sh
Normal file
207
docker/docker-build.sh
Normal file
@@ -0,0 +1,207 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# DockerContext: orion-visor/docker
|
||||
|
||||
# 加载项目构建
|
||||
source ./project-build.sh "$@"
|
||||
|
||||
# 版本号
|
||||
version=2.test
|
||||
# 是否推送镜像
|
||||
push_image=false
|
||||
# 是否构建 latest
|
||||
latest_image=false
|
||||
# 是否本地构建
|
||||
locally_build=false
|
||||
# 备份后缀
|
||||
backup_suffix=".bak"
|
||||
# 镜像命名空间
|
||||
namespace="registry.cn-hangzhou.aliyuncs.com/orionsec"
|
||||
|
||||
# 解析命令行参数
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
-l|--locally)
|
||||
locally_build=true
|
||||
shift
|
||||
;;
|
||||
-latest|latest-image)
|
||||
latest_image=true
|
||||
shift
|
||||
;;
|
||||
-push|--push-image)
|
||||
push_image=true
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# 要处理的 Dockerfile 列表及对应的镜像名称
|
||||
declare -A images=(
|
||||
["./ui/Dockerfile"]="orion-visor-ui"
|
||||
["./service/Dockerfile"]="orion-visor-service"
|
||||
["./mysql/Dockerfile"]="orion-visor-mysql"
|
||||
["./redis/Dockerfile"]="orion-visor-redis"
|
||||
["./adminer/Dockerfile"]="orion-visor-adminer"
|
||||
["./guacd/Dockerfile"]="orion-visor-guacd"
|
||||
)
|
||||
|
||||
# 准备 service jar
|
||||
function prepare_app_jar() {
|
||||
local source_file="../orion-visor-launch/target/orion-visor-launch.jar"
|
||||
local target_file="./service/orion-visor-launch.jar"
|
||||
if [ ! -f "$target_file" ]; then
|
||||
echo "警告: $target_file 不存在, 正在尝试从 $source_file 复制..."
|
||||
if [ -f "$source_file" ]; then
|
||||
cp "$source_file" "$target_file"
|
||||
echo "已成功复制 $source_file 至 $target_file"
|
||||
else
|
||||
echo "错误: $source_file 不存在, 无法继续构建."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "$target_file 已存在, 无需复制."
|
||||
fi
|
||||
}
|
||||
|
||||
# 准备前端 dist 目录
|
||||
function prepare_dist_directory() {
|
||||
local source_dir="../orion-visor-ui/dist"
|
||||
local target_dir="./ui/dist"
|
||||
if [ ! -d "$target_dir" ]; then
|
||||
echo "警告: $target_dir 不存在, 正在尝试从 $source_dir 复制..."
|
||||
if [ -d "$source_dir" ]; then
|
||||
cp -r "$source_dir" "$target_dir"
|
||||
echo "已成功复制 $source_dir 至 $target_dir"
|
||||
else
|
||||
echo "错误: $source_dir 不存在, 无法继续构建."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "$target_dir 已存在, 无需复制."
|
||||
fi
|
||||
}
|
||||
|
||||
# 准备 mysql sql 目录
|
||||
function prepare_sql_directory() {
|
||||
local source_dir="../sql"
|
||||
local target_dir="./mysql/sql"
|
||||
if [ ! -d "$target_dir" ]; then
|
||||
echo "警告: $target_dir 不存在, 正在尝试从 $source_dir 复制..."
|
||||
if [ -d $source_dir ]; then
|
||||
cp -r $source_dir "$target_dir"
|
||||
echo "已成功复制 ../sql 至 $target_dir"
|
||||
else
|
||||
echo "错误: $source_dir 不存在!根据预期它应该存在, 请确认路径或项目结构是否正确"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "$target_dir 已存在, 无需复制."
|
||||
fi
|
||||
}
|
||||
|
||||
# 修改 Dockerfile 前的备份
|
||||
function modify_dockerfiles() {
|
||||
if [ "$locally_build" = false ]; then
|
||||
echo "跳过 Dockerfile 修改"
|
||||
return
|
||||
fi
|
||||
echo "正在备份并修改 Dockerfile..."
|
||||
for file in "${!images[@]}"; do
|
||||
if [ -f "$file" ]; then
|
||||
echo "备份并修改: $file"
|
||||
cp "$file" "$file$backup_suffix"
|
||||
sed -i 's/--platform=\$BUILDPLATFORM//g' "$file"
|
||||
else
|
||||
echo "文件不存在 -> $file"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# 恢复原始 Dockerfile
|
||||
function restore_dockerfiles() {
|
||||
if [ "$locally_build" = false ]; then
|
||||
return
|
||||
fi
|
||||
echo "开始恢复 Dockerfile"
|
||||
for file in "${!images[@]}"; do
|
||||
if [ -f "$file$backup_suffix" ]; then
|
||||
echo "恢复: $file"
|
||||
rm -rf "$file"
|
||||
mv "$file$backup_suffix" "$file"
|
||||
fi
|
||||
done
|
||||
echo "Dockerfile 已恢复为原始版本"
|
||||
}
|
||||
|
||||
# 构建镜像
|
||||
function build_images() {
|
||||
echo "构建镜像开始..."
|
||||
for dockerfile in "${!images[@]}"; do
|
||||
image_name="${images[$dockerfile]}"
|
||||
echo "Building $image_name with version $version."
|
||||
# 构建 Docker 镜像
|
||||
docker build -f "$dockerfile" -t "${image_name}:${version}" -t "${namespace}/${image_name}:${version}" .
|
||||
# 添加 latest 标签
|
||||
if [ "$latest_image" = true ]; then
|
||||
echo "Tag $image_name with latest version."
|
||||
docker tag "${image_name}:${version}" "${image_name}:latest"
|
||||
docker tag "${namespace}/${image_name}:${version}" "${namespace}/${image_name}:latest"
|
||||
fi
|
||||
done
|
||||
echo "构建镜像结束..."
|
||||
}
|
||||
|
||||
# 推送镜像
|
||||
function push_image_to_registry() {
|
||||
if [ "$push_image" = true ]; then
|
||||
echo "推送镜像开始..."
|
||||
for image_name in "${images[@]}"; do
|
||||
# 推送版本
|
||||
docker push "${namespace}/${image_name}:${version}"
|
||||
# 推送 latest
|
||||
if [ "latest_image" = true ]; then
|
||||
docker push "${namespace}/${image_name}:latest"
|
||||
fi
|
||||
done
|
||||
echo "推送镜像结束..."
|
||||
fi
|
||||
}
|
||||
|
||||
# 构建项目-service
|
||||
if [ "$build_service" = true ]; then
|
||||
run_build_service
|
||||
fi
|
||||
|
||||
# 构建项目-ui
|
||||
if [ "$build_ui" = true ]; then
|
||||
run_build_ui
|
||||
fi
|
||||
|
||||
# 检查资源
|
||||
echo "正在检查并准备必要的构建资源..."
|
||||
prepare_app_jar
|
||||
prepare_dist_directory
|
||||
prepare_sql_directory
|
||||
echo "所有前置资源已准备完毕"
|
||||
|
||||
# 修改镜像文件
|
||||
modify_dockerfiles
|
||||
|
||||
# 设置异常捕获, 确保失败时恢复 Dockerfile
|
||||
trap 'restore_dockerfiles; echo "构建失败, 已恢复原始 Dockerfile"; exit 1' ERR INT
|
||||
|
||||
# 构建镜像
|
||||
build_images
|
||||
|
||||
# 推送镜像
|
||||
push_image_to_registry
|
||||
|
||||
# 恢复原始 Dockerfile
|
||||
restore_dockerfiles
|
||||
trap - ERR INT
|
||||
echo "构建完成"
|
||||
Reference in New Issue
Block a user