这是最新的文件夹结构:
.
├── 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 文件。