Files
ai_trading_api/create
2025-12-26 17:20:14 +08:00
..
add
2025-12-26 17:06:47 +08:00
add
2025-12-26 16:57:36 +08:00
add
2025-12-26 17:07:53 +08:00
add
2025-12-26 17:08:48 +08:00
add
2025-12-26 17:20:14 +08:00

这是最新的文件夹结构:

.
├── 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 脚本内容。

#!/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 内容:

#!/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、清空文件内容后原封不动地写入以下内容

# ==================== 第一阶段构建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 文件。