diff --git a/create/create.sh b/create/create.sh index a4539e9..6abbf8c 100644 --- a/create/create.sh +++ b/create/create.sh @@ -1,5 +1,5 @@ #!/bin/bash -# create.sh - 启动Python容器执行create_table.py和create_src.py脚本 +# create.sh - 启动Python容器执行create_table.py、create_src.py和create_src_dockerfile.py脚本 set -e # 遇到错误立即退出 @@ -75,8 +75,34 @@ docker run --rm \ echo '✅ create_src.py 执行完成!' " +# ========== 第三部分:更新Dockerfile ========== +echo "" +echo "📋 第三步:更新Dockerfile内容..." +echo "🚀 执行create_src_dockerfile.py..." + +# 运行Python容器执行create_src_dockerfile.py +docker run --rm \ + --name "${CONTAINER_NAME}-dockerfile" \ + -v "${SCRIPT_DIR}:/app/create" \ + -v "${PROJECT_ROOT}/services:/app/services" \ + -e TABLE_NAME="${TABLE_NAME}" \ + -w /app \ + python:3.13.7-alpine3.22 \ + sh -c " + echo '📋 容器内环境信息:' + python --version + echo '' + + echo '⚙️ 执行 create_src_dockerfile.py...' + python create/create_src_dockerfile.py + + echo '' + echo '✅ create_src_dockerfile.py 执行完成!' + " + echo "" echo "==========================================" echo "🎉 所有任务执行完成!" echo "📋 表名: ${TABLE_NAME}" -echo "📁 服务目录: ${PROJECT_ROOT}/services/${TABLE_NAME}" \ No newline at end of file +echo "📁 服务目录: ${PROJECT_ROOT}/services/${TABLE_NAME}" +echo "🐳 Dockerfile: ${PROJECT_ROOT}/services/${TABLE_NAME}/src/Dockerfile" \ No newline at end of file diff --git a/create/create_src_dockerfile.py b/create/create_src_dockerfile.py index e69de29..06748c1 100644 --- a/create/create_src_dockerfile.py +++ b/create/create_src_dockerfile.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +create_src_dockerfile.py - 更新Dockerfile内容 +""" + +import os +import sys + +def update_dockerfile(table_name): + """更新指定服务目录下的Dockerfile内容""" + + # 获取项目根目录 + project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + services_dir = os.path.join(project_root, 'services') + + # 服务目录路径 + service_dir = os.path.join(services_dir, table_name) + dockerfile_path = os.path.join(service_dir, 'src', 'Dockerfile') + + print(f"🚀 开始更新Dockerfile: {dockerfile_path}") + + # Dockerfile内容 + dockerfile_content = """# ==================== 第一阶段:构建Go程序(构建阶段)==================== +# 使用官方Go镜像作为构建基础,选择与项目匹配的Go版本(示例用1.25.0,可根据实际调整) +FROM golang:1.25.0-alpine3.22 AS builder + +# 设置工作目录(容器内的目录,规范文件位置) +WORKDIR /app + +# 复制go.mod和go.sum(先复制依赖文件,利用Docker缓存机制,避免每次代码变动都重新下载依赖) +COPY go.mod go.sum ./ + +# 下载项目依赖(仅当go.mod/go.sum变动时才会重新执行) +RUN go mod download + +# 复制整个项目代码到工作目录 +COPY . . + +# 构建Go程序: +# - CGO_ENABLED=0:禁用CGO,生成静态链接的二进制文件(避免依赖系统库,保证镜像兼容性) +# - -o app:指定输出二进制文件名为app +# - ./main.go:指定入口文件 +RUN CGO_ENABLED=0 GOOS=linux go build -o app ./main.go + + +# ==================== 第二阶段:运行程序(运行阶段)==================== +# 使用轻量级的scratch(大幅减小最终镜像体积) +FROM scratch + +# 设置工作目录 +WORKDIR /app + +# 从构建阶段复制编译好的二进制文件到当前镜像(仅复制最终产物,减小体积) +COPY --from=builder /app/app ./ + +# 暴露程序运行端口(与代码中一致) +EXPOSE 80 + +# 容器启动时执行的命令:运行二进制文件 +CMD ["./app"] +""" + + try: + # 检查文件是否存在 + if not os.path.exists(dockerfile_path): + print(f"❌ Dockerfile不存在: {dockerfile_path}") + return False + + # 清空文件内容并写入新内容 + with open(dockerfile_path, 'w', encoding='utf-8') as f: + f.write(dockerfile_content) + + print(f"✅ 成功更新Dockerfile: {dockerfile_path}") + print(f"📋 Dockerfile内容已完全替换") + return True + + except Exception as e: + print(f"❌ 更新Dockerfile时出错: {e}") + return False + +if __name__ == "__main__": + # 从环境变量获取表名 + table_name = os.environ.get('TABLE_NAME') + + if not table_name: + print("❌ 错误: 未设置 TABLE_NAME 环境变量") + sys.exit(1) + + print(f"📋 接收到的表名: {table_name}") + success = update_dockerfile(table_name) + + if success: + sys.exit(0) + else: + sys.exit(1) \ No newline at end of file