118 lines
4.2 KiB
Bash
118 lines
4.2 KiB
Bash
#!/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 |