这是最新的文件夹结构: ``` tree . ├── LICENSE ├── README.md ├── create │ ├── README.md │ ├── create.sh │ ├── create_src.py │ ├── create_src_dockerfile.py │ └── create_table.py ├── docker-compose.yaml ├── infra │ └── postgres │ ├── scripts │ │ └── db-lanuch-entrypoint.sh │ └── sql │ ├── 01_uuid_v7_setup.sql │ ├── 02_create_function.sql │ └── 03_create_table.sql └── services ``` 以下是 shell 脚本内容。 ``` shell #!/bin/bash # create.sh - 启动Python容器执行create_table.py和create_src.py脚本 set -e # 遇到错误立即退出 # 定义表名变量,可以根据需要修改 TABLE_NAME="cn_pmi_records" echo "🚀 开始创建流程,表名: ${TABLE_NAME}" echo "==========================================" # ========== 第一部分:创建数据库表 ========== echo "📋 第一步:创建数据库表结构..." echo "🚀 启动Python容器执行create_table.py..." # 获取脚本所在目录的绝对路径 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" # 容器名称 CONTAINER_NAME="python-create-runner" # 检查是否已存在同名容器,如果存在则删除 if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then echo "🧹 清理已存在的容器 ${CONTAINER_NAME}..." docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 fi # 运行Python容器执行create_table.py echo "📦 启动Python容器执行create_table.py..." docker run --rm \ --name "${CONTAINER_NAME}" \ -v "${SCRIPT_DIR}:/app/create" \ -v "${PROJECT_ROOT}/infra/postgres/sql:/app/infra/postgres/sql" \ -e TABLE_NAME="${TABLE_NAME}" \ -w /app \ python:3.13.7-alpine3.22 \ sh -c " echo '📋 容器内环境信息:' python --version echo '' echo '🔧 安装依赖(如果需要)...' pip install --quiet --no-cache-dir psycopg2-binary >/dev/null 2>&1 || true echo '⚙️ 执行 create_table.py...' python create/create_table.py echo '' echo '✅ create_table.py 执行完成!' " # ========== 第二部分:创建服务结构 ========== echo "" echo "📋 第二步:创建服务文件夹结构..." echo "🚀 执行create_src.py..." # 运行Python容器执行create_src.py docker run --rm \ --name "${CONTAINER_NAME}-src" \ -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.py...' python create/create_src.py echo '' echo '✅ create_src.py 执行完成!' " echo "" echo "==========================================" echo "🎉 所有任务执行完成!" echo "📋 表名: ${TABLE_NAME}" echo "📁 服务目录: ${PROJECT_ROOT}/services/${TABLE_NAME}" ``` 以下是 create_src.py 内容: ```python #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ create_src.py - 在services目录下创建服务文件夹和文件结构 """ import os import sys def create_service_structure(table_name): """创建服务文件夹结构""" # 获取项目根目录 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) print(f"🚀 开始创建服务结构: {table_name}") print(f"📁 目标目录: {service_dir}") try: # 创建主目录 os.makedirs(service_dir, exist_ok=True) print(f"✅ 创建主目录: {service_dir}") # 创建子目录 subdirs = ['src', 'src/crud', 'src/infra', 'src/model'] for subdir in subdirs: dir_path = os.path.join(service_dir, subdir) os.makedirs(dir_path, exist_ok=True) print(f"✅ 创建子目录: {dir_path}") # 定义要创建的文件列表 files_to_create = [ 'dev.sh', 'README.md', 'src/Dockerfile', 'src/go.mod', 'src/go.sum', 'src/main.go', 'src/crud/create.go', 'src/crud/read.go', 'src/crud/update.go', 'src/crud/delete.go', 'src/infra/launch.go', 'src/infra/logger.go', 'src/infra/postgres.go', 'src/model/payload.go' ] # 创建所有文件 for file_path in files_to_create: full_path = os.path.join(service_dir, file_path) os.makedirs(os.path.dirname(full_path), exist_ok=True) # 确保目录存在 # 创建空文件 with open(full_path, 'w', encoding='utf-8') as f: f.write('') # 创建空文件 print(f"✅ 创建文件: {full_path}") print(f"🎉 服务结构创建完成: {table_name}") return True except Exception as e: print(f"❌ 创建服务结构时出错: {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 = create_service_structure(table_name) if success: sys.exit(0) else: sys.exit(1) ``` 你的任务是完成 create_src_dockerfile.py 编写,需求如下: 1、读取create_src.py中创建的Dockerfile文件。 2、清空文件内容后,原封不动地写入以下内容: ```dockerfile # ==================== 第一阶段:构建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"] ``` 3、重新调整一下 shell 脚本逻辑,执行create_src.py成功后,立马执行 create_src_dockerfile.py 文件。