2026-01-10 15:15:45 +08:00
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
"""
|
|
|
|
|
|
Docker Compose 部署模块
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
|
import subprocess
|
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
from .log import Logger
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def run_docker_compose(compose_dir, service_name):
|
|
|
|
|
|
"""
|
|
|
|
|
|
执行 docker-compose 命令
|
|
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
|
compose_dir: docker-compose.yml 所在目录
|
|
|
|
|
|
service_name: 要构建和启动的服务名称
|
|
|
|
|
|
|
|
|
|
|
|
返回:
|
|
|
|
|
|
bool: 成功返回 True,失败返回 False
|
|
|
|
|
|
"""
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 转换为绝对路径
|
|
|
|
|
|
compose_dir = Path(compose_dir).resolve()
|
|
|
|
|
|
|
|
|
|
|
|
Logger.separator()
|
|
|
|
|
|
Logger.info("开始 Docker 部署")
|
|
|
|
|
|
Logger.separator()
|
|
|
|
|
|
Logger.info(f"执行目录: {compose_dir}")
|
|
|
|
|
|
Logger.info(f"服务名称: {service_name}")
|
|
|
|
|
|
|
|
|
|
|
|
# 检查目录是否存在
|
|
|
|
|
|
if not compose_dir.exists():
|
|
|
|
|
|
Logger.error(f"目录不存在: {compose_dir}")
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
# 检查 docker-compose.yml 是否存在
|
|
|
|
|
|
compose_file = compose_dir / "docker-compose.yml"
|
|
|
|
|
|
if not compose_file.exists():
|
|
|
|
|
|
Logger.error(f"docker-compose.yml 不存在: {compose_file}")
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
2026-01-15 13:40:44 +08:00
|
|
|
|
# 停止并删除容器和匿名卷(确保使用最新的镜像内容)
|
|
|
|
|
|
Logger.info(f"停止并删除旧容器和卷: {service_name}")
|
|
|
|
|
|
Logger.run_command(f"docker-compose down {service_name} -v", compose_dir)
|
|
|
|
|
|
|
2026-01-10 15:15:45 +08:00
|
|
|
|
# 构建镜像
|
2026-01-10 15:21:06 +08:00
|
|
|
|
if not Logger.run_command(f"docker-compose build --no-cache {service_name}", compose_dir):
|
2026-01-10 15:15:45 +08:00
|
|
|
|
Logger.error(f"镜像构建失败: {service_name}")
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
Logger.info(f"镜像构建成功: {service_name}")
|
|
|
|
|
|
|
|
|
|
|
|
# 启动服务
|
2026-01-10 15:21:06 +08:00
|
|
|
|
if not Logger.run_command(f"docker-compose up -d {service_name}", compose_dir):
|
2026-01-10 15:15:45 +08:00
|
|
|
|
Logger.error(f"服务启动失败: {service_name}")
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
Logger.info(f"服务启动成功: {service_name}")
|
|
|
|
|
|
Logger.info(f"Docker 部署完成: {service_name}")
|
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
Logger.error(f"Docker 部署异常: {e}")
|
|
|
|
|
|
return False
|