This commit is contained in:
vipg
2026-02-06 15:34:47 +08:00
parent 7c911595b3
commit 9106829336
2 changed files with 422 additions and 0 deletions

118
init_monorepo.sh Normal file
View File

@@ -0,0 +1,118 @@
#!/bin/bash
set -euo pipefail
# 脚本编码设置,避免中文乱码
export LANG=C.UTF-8
# 配置项(可按需修改)
PROJECT_NAME="go-monorepo"
PYTHON_IMAGE="python:3.11-alpine" # 轻量Python3镜像仅80+MB
PYTHON_SCRIPT="init-monorepo.py"
# 颜色输出函数(增强可读性)
red() { echo -e "\033[31m$1\033[0m"; }
green() { echo -e "\033[32m$1\033[0m"; }
yellow() { echo -e "\033[33m$1\033[0m"; }
blue() { echo -e "\033[34m$1\033[0m"; }
# 第一步检查Docker环境是否安装
check_docker() {
blue "===== 1. 检测Docker环境 ====="
if ! command -v docker &> /dev/null; then
red "❌ 错误本地未安装Docker请先安装Docker后再执行"
red "Docker官方安装地址https://docs.docker.com/get-docker/"
exit 1
fi
# 检查Docker守护进程是否运行
if ! docker info &> /dev/null; then
red "❌ 错误Docker守护进程未启动请先启动Docker服务"
exit 1
fi
green "✅ Docker环境检测通过版本$(docker --version | awk '{print $3}' | sed 's/,//g')"
}
# 第二步检查Python脚本是否存在
check_script() {
blue -e "\n===== 2. 检测${PYTHON_SCRIPT}脚本 ====="
if [ ! -f "${PYTHON_SCRIPT}" ]; then
red "❌ 错误:当前目录未找到${PYTHON_SCRIPT}文件!"
red "请确保${PYTHON_SCRIPT}与本sh脚本在同一目录下"
exit 1
fi
green "${PYTHON_SCRIPT}脚本检测通过"
}
# 第三步拉取Python镜像若本地无
pull_python_image() {
blue -e "\n===== 3. 检查Python3镜像 ====="
if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^${PYTHON_IMAGE}$"; then
green "✅ 本地已存在${PYTHON_IMAGE}镜像,无需拉取"
else
yellow "⚠️ 本地无${PYTHON_IMAGE}镜像开始拉取轻量镜像仅80+MB耗时约10s"
docker pull "${PYTHON_IMAGE}"
green "${PYTHON_IMAGE}镜像拉取完成"
fi
}
# 第四步创建临时Python容器执行初始化脚本
run_python_container() {
blue -e "\n===== 4. 启动临时Python容器执行初始化 ====="
yellow "⚠️ 正在生成${PROJECT_NAME}基础结构,文件将保存在当前目录..."
# 核心docker run命令
# --rm执行完成后自动销毁容器
# -v $(pwd):/app将本地当前目录挂载到容器内/app目录
# -w /app设置容器工作目录为/app与本地挂载目录一致
# ${PYTHON_IMAGE}使用的Python镜像
# python3 ${PYTHON_SCRIPT}在容器内执行Python脚本
docker run --rm \
-v "$(pwd)":/app \
-w /app \
--name "tmp-go-monorepo-init" \
"${PYTHON_IMAGE}" \
python3 "${PYTHON_SCRIPT}"
# 检查脚本执行结果
if [ -d "${PROJECT_NAME}" ]; then
green -e "\n✅ 容器执行完成!${PROJECT_NAME}基础结构已生成在当前目录"
else
red "❌ 容器执行失败,未生成${PROJECT_NAME}目录,请检查日志!"
exit 1
fi
}
# 第五步:权限修复(解决容器生成文件的权限问题)
fix_permission() {
blue -e "\n===== 5. 修复文件目录权限 ====="
# 容器内生成的文件可能属于root用户修复为当前用户权限
if [ -d "${PROJECT_NAME}" ] && [ "$(id -u)" -ne 0 ]; then
sudo chown -R "$(id -u)":"$(id -g)" "${PROJECT_NAME}" 2>/dev/null || true
chmod +x "${PROJECT_NAME}/Makefile" 2>/dev/null || true
green "✅ 目录权限修复完成,当前用户可正常操作${PROJECT_NAME}内文件"
else
yellow "⚠️ 无需修复权限当前为root用户或目录不存在"
fi
}
# 主执行流程
main() {
clear
blue "====================================================="
blue " Go Monorepo 容器化初始化脚本"
blue " 无本地Python环境依赖 · 仅需Docker"
blue "====================================================="
echo ""
check_docker
check_script
pull_python_image
run_python_container
fix_permission
echo ""
green "🎉 所有操作完成!"
green "👉 下一步操作cd ${PROJECT_NAME} && make go-init"
echo ""
}
# 执行主函数
main