添加Dockerfile
This commit is contained in:
parent
824ac04099
commit
98e82d75bd
40
Dockerfile
Normal file
40
Dockerfile
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# 构建阶段
|
||||||
|
FROM python:3.11-slim as builder
|
||||||
|
|
||||||
|
# 设置工作目录
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# 设置环境变量
|
||||||
|
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||||
|
PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
|
# 安装构建依赖
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y --no-install-recommends gcc && \
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# 安装Python依赖
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
|
||||||
|
|
||||||
|
# 最终阶段
|
||||||
|
FROM python:3.11-slim
|
||||||
|
|
||||||
|
# 设置工作目录
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# 设置环境变量
|
||||||
|
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||||
|
PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
|
# 从构建阶段复制Python环境
|
||||||
|
COPY --from=builder /usr/local/lib/python3.11/site-packages/ /usr/local/lib/python3.11/site-packages/
|
||||||
|
|
||||||
|
# 复制应用代码
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# 暴露端口
|
||||||
|
EXPOSE 8000
|
||||||
|
|
||||||
|
# 启动命令
|
||||||
|
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||||
28
app/core/version.py
Normal file
28
app/core/version.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
"""版本管理模块"""
|
||||||
|
|
||||||
|
import tomli
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# 读取pyproject.toml中的版本号
|
||||||
|
def _read_version_from_toml():
|
||||||
|
try:
|
||||||
|
project_root = Path(__file__).parent.parent.parent
|
||||||
|
toml_path = project_root / "pyproject.toml"
|
||||||
|
with open(toml_path, "rb") as f:
|
||||||
|
data = tomli.load(f)
|
||||||
|
return data["project"]["version"]
|
||||||
|
except Exception:
|
||||||
|
return "0.0.0" # 默认版本号
|
||||||
|
|
||||||
|
# 项目版本号,采用语义化版本格式 (https://semver.org/)
|
||||||
|
VERSION = _read_version_from_toml()
|
||||||
|
|
||||||
|
# 解析版本号组件
|
||||||
|
try:
|
||||||
|
MAJOR, MINOR, PATCH = map(int, VERSION.split("."))
|
||||||
|
except ValueError:
|
||||||
|
MAJOR = MINOR = PATCH = 0
|
||||||
|
|
||||||
|
def get_version():
|
||||||
|
"""获取完整的版本号"""
|
||||||
|
return VERSION
|
||||||
@ -31,7 +31,7 @@ templates = Jinja2Templates(directory=str(Path(__file__).parent / "templates"))
|
|||||||
app = FastAPI(
|
app = FastAPI(
|
||||||
title=settings.APP_NAME,
|
title=settings.APP_NAME,
|
||||||
description="配置中心API",
|
description="配置中心API",
|
||||||
version="1.0.1",
|
version="1.0.0",
|
||||||
docs_url="/api/docs",
|
docs_url="/api/docs",
|
||||||
redoc_url="/api/redoc",
|
redoc_url="/api/redoc",
|
||||||
openapi_url="/api/openapi.json"
|
openapi_url="/api/openapi.json"
|
||||||
|
|||||||
106
build.sh
Normal file
106
build.sh
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 从version.py获取版本号
|
||||||
|
VERSION=$(python3 -c "from app.core.version import get_version; print(get_version())")
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "错误: 无法获取版本号"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
IMAGE_NAME="config-center"
|
||||||
|
REGISTRY=""
|
||||||
|
LATEST=false
|
||||||
|
|
||||||
|
# 显示帮助信息
|
||||||
|
show_help() {
|
||||||
|
echo "Usage: $0 [options]"
|
||||||
|
echo "Options:"
|
||||||
|
echo " -h, --help 显示帮助信息"
|
||||||
|
echo " -n, --name 设置镜像名称 (默认: config-center)"
|
||||||
|
echo " -r, --registry 设置镜像仓库地址"
|
||||||
|
echo " -v, --version 设置版本号 (默认: 1.0.0)"
|
||||||
|
echo " -l, --latest 同时构建latest标签"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 解析命令行参数
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
key="$1"
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
show_help
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-n|--name)
|
||||||
|
IMAGE_NAME="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-r|--registry)
|
||||||
|
REGISTRY="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v|--version)
|
||||||
|
VERSION="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-l|--latest)
|
||||||
|
LATEST=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "未知参数: $1"
|
||||||
|
show_help
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# 构建完整的镜像名称
|
||||||
|
if [ -n "$REGISTRY" ]; then
|
||||||
|
FULL_IMAGE_NAME="$REGISTRY/$IMAGE_NAME"
|
||||||
|
else
|
||||||
|
FULL_IMAGE_NAME="$IMAGE_NAME"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 构建Docker镜像
|
||||||
|
echo "开始构建Docker镜像: $FULL_IMAGE_NAME:$VERSION"
|
||||||
|
if ! docker build -t "$FULL_IMAGE_NAME:$VERSION" .; then
|
||||||
|
echo "错误: Docker镜像构建失败"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 如果指定了latest标签,则也构建latest版本
|
||||||
|
if [ "$LATEST" = true ]; then
|
||||||
|
echo "标记latest版本"
|
||||||
|
if ! docker tag "$FULL_IMAGE_NAME:$VERSION" "$FULL_IMAGE_NAME:latest"; then
|
||||||
|
echo "错误: 标记latest版本失败"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 如果设置了镜像仓库,推送latest版本
|
||||||
|
if [ -n "$REGISTRY" ]; then
|
||||||
|
echo "推送latest版本到镜像仓库"
|
||||||
|
if ! docker push "$FULL_IMAGE_NAME:latest"; then
|
||||||
|
echo "错误: 推送latest版本失败"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 如果设置了镜像仓库,推送版本化的镜像
|
||||||
|
if [ -n "$REGISTRY" ]; then
|
||||||
|
echo "推送版本化镜像到镜像仓库"
|
||||||
|
if ! docker push "$FULL_IMAGE_NAME:$VERSION"; then
|
||||||
|
echo "错误: 推送版本化镜像失败"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "构建完成!"
|
||||||
|
echo "镜像信息:"
|
||||||
|
echo " 名称: $FULL_IMAGE_NAME"
|
||||||
|
echo " 版本: $VERSION"
|
||||||
|
if [ "$LATEST" = true ]; then
|
||||||
|
echo " latest标签: 是"
|
||||||
|
fi
|
||||||
12
pyproject.toml
Normal file
12
pyproject.toml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[project]
|
||||||
|
name = "config_center"
|
||||||
|
version = "1.0.0"
|
||||||
|
description = "配置中心服务"
|
||||||
|
authors = [
|
||||||
|
{name = "Guyue", email = "guyuecw@qq.com"}
|
||||||
|
]
|
||||||
|
requires-python = ">=3.8"
|
||||||
|
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools>=42", "wheel"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
Loading…
Reference in New Issue
Block a user