#!/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