diff --git a/.gitignore b/.gitignore index 9fc0a2e..11040cf 100644 --- a/.gitignore +++ b/.gitignore @@ -46,4 +46,8 @@ node_modules/ # Logs X1.WebAPI.logs/ X1.WebAPI/logs/ -*.log \ No newline at end of file +*.log + +# Publish directories +publish/ +**/publish/ \ No newline at end of file diff --git a/src/X1.WebAPI/Dockerfile b/src/X1.WebAPI/Dockerfile new file mode 100644 index 0000000..a32b797 --- /dev/null +++ b/src/X1.WebAPI/Dockerfile @@ -0,0 +1,18 @@ +# 使用官方.NET 8.0运行时镜像作为基础镜像(完整版本,支持调试) +FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy + +# 设置工作目录 +WORKDIR /app + +# 设置环境变量 +ENV ASPNETCORE_ENVIRONMENT=Production +ENV ASPNETCORE_URLS=http://+:12789 + +# 复制发布文件到容器中 +COPY publish/ . + +# 暴露端口12789 +EXPOSE 12789 + +# 设置应用启动命令 +ENTRYPOINT ["./X1.WebAPI"] diff --git a/src/X1.WebAPI/Dockerfile.dev b/src/X1.WebAPI/Dockerfile.dev new file mode 100644 index 0000000..6e01f0f --- /dev/null +++ b/src/X1.WebAPI/Dockerfile.dev @@ -0,0 +1,53 @@ +# 开发环境Dockerfile - 精简版调试支持 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy + +# 安装核心调试工具 +RUN apt-get update && apt-get install -y \ + bash \ + curl \ + vim \ + htop \ + procps \ + net-tools \ + iputils-ping \ + telnet \ + tree \ + less \ + lsof \ + dnsutils \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# 设置工作目录 +WORKDIR /app + +# 设置环境变量(开发环境) +ENV ASPNETCORE_ENVIRONMENT=Development +ENV ASPNETCORE_URLS=http://+:12790 +ENV DOTNET_USE_POLLING_FILE_WATCHER=1 + +# 复制发布文件到容器中 +COPY publish/ . + +# 暴露端口12790 +EXPOSE 12790 + +# 创建开发环境启动脚本 +RUN echo '#!/bin/bash\n\ +echo "=========================================="\n\ +echo "X1.WebAPI 开发环境启动" \n\ +echo "=========================================="\n\ +echo "环境: Development"\n\ +echo "端口: 12790"\n\ +echo "调试工具:"\n\ +echo " - 基本: bash, curl"\n\ +echo " - 编辑: vim"\n\ +echo " - 系统: htop, ps, lsof"\n\ +echo " - 网络: netstat, ping, telnet"\n\ +echo " - 文件: tree, less"\n\ +echo " - DNS: dig, nslookup"\n\ +echo "=========================================="\n\ +exec ./X1.WebAPI' > /app/start-dev.sh && chmod +x /app/start-dev.sh + +# 设置应用启动命令 +ENTRYPOINT ["./start-dev.sh"] diff --git a/src/X1.WebAPI/Program.cs b/src/X1.WebAPI/Program.cs index 8970e26..4351d09 100644 --- a/src/X1.WebAPI/Program.cs +++ b/src/X1.WebAPI/Program.cs @@ -173,18 +173,25 @@ builder.Services.AddDirectoryBrowser(); var app = builder.Build(); // 配置 HTTP 请求管道 -if (app.Environment.IsDevelopment()) -{ - app.UseSwagger(); - app.UseSwaggerUI(); - // 在开发环境中禁用 HTTPS 重定向 - app.UseHttpsRedirection(); -} -else -{ - // 在生产环境中强制使用 HTTPS - app.UseHttpsRedirection(); -} +//if (app.Environment.IsDevelopment()) +//{ +// app.UseSwagger(); +// app.UseSwaggerUI(); +// // 在开发环境中禁用 HTTPS 重定向 +// app.UseHttpsRedirection(); +//} +//else +//{ +// // 在生产环境中强制使用 HTTPS +// app.UseHttpsRedirection(); +//} + +app.UseSwagger(); +app.UseSwaggerUI(); +// 在开发环境中禁用 HTTPS 重定向 +app.UseHttpsRedirection(); + + // 配置 CORS 策略 app.UseCors("CorsPolicy"); diff --git a/src/X1.WebAPI/Properties/launchSettings.json b/src/X1.WebAPI/Properties/launchSettings.json index 9a408c6..8ba8425 100644 --- a/src/X1.WebAPI/Properties/launchSettings.json +++ b/src/X1.WebAPI/Properties/launchSettings.json @@ -24,8 +24,8 @@ "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "swagger", - "applicationUrl": "https://localhost:7268;http://localhost:5000;https://192.168.1.233:7268;http://192.168.1.233:5000", - //"applicationUrl": "https://localhost:7268;http://localhost:5000", + //"applicationUrl": "https://localhost:7268;http://localhost:5000;https://192.168.1.233:7268;http://192.168.1.233:5000", + "applicationUrl": "https://localhost:7268;http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/src/X1.WebAPI/deploy.sh b/src/X1.WebAPI/deploy.sh new file mode 100644 index 0000000..9eea53f --- /dev/null +++ b/src/X1.WebAPI/deploy.sh @@ -0,0 +1,424 @@ +#!/bin/bash + +# X1.WebAPI Docker 部署脚本 +# 使用方法: +# ./deploy.sh # 生产环境部署 +# ./deploy.sh --dev # 开发环境部署 +# ./deploy.sh --help # 显示帮助信息 + +set -e # 遇到错误立即退出 + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# 日志函数 +log_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +log_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +log_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# 默认配置 +ENVIRONMENT="production" +DOCKERFILE="Dockerfile" +IMAGE_NAME="x1-webapi" +CONTAINER_NAME="x1-webapi-container" +PORT="12789" +REMOVE_MODE=false + +# 解析命令行参数 +parse_arguments() { + while [[ $# -gt 0 ]]; do + case $1 in + --dev) + ENVIRONMENT="development" + DOCKERFILE="Dockerfile.dev" + IMAGE_NAME="x1-webapi-dev" + CONTAINER_NAME="x1-webapi-dev-container" + PORT="12790" + shift + ;; + --remove) + REMOVE_MODE=true + shift + ;; + --help|-h|-help) + show_help + exit 0 + ;; + *) + log_error "未知参数: $1" + show_help + exit 1 + ;; + esac + done +} + +# 显示帮助信息 +show_help() { + echo "X1.WebAPI Docker 部署脚本" + echo "" + echo "使用方法:" + echo " ./deploy.sh # 生产环境部署" + echo " ./deploy.sh --dev # 开发环境部署" + echo " ./deploy.sh --remove # 删除当前环境容器和镜像" + echo " ./deploy.sh --dev --remove # 删除开发环境容器和镜像" + echo " ./deploy.sh --help # 显示帮助信息" + echo " ./deploy.sh -h # 显示帮助信息(简写)" + echo " ./deploy.sh -help # 显示帮助信息(简写)" + echo "" + echo "参数说明:" + echo " --dev : 使用开发环境配置(Dockerfile.dev,端口12790)" + echo " --remove : 删除模式,删除容器和镜像" + echo " --help : 显示帮助信息" + echo " -h : 显示帮助信息(简写)" + echo " -help : 显示帮助信息(简写)" + echo "" + echo "环境说明:" + echo " 生产环境: 使用 Dockerfile,包含基本调试工具" + echo " 开发环境: 使用 Dockerfile.dev,包含完整调试工具集" + echo "" + echo "开发环境包含的额外工具:" + echo " - 网络诊断: ping, telnet, net-tools, curl, wget" + echo " - 系统监控: htop, procps, ps" + echo " - 文件编辑: vim, nano" + echo " - 基本工具: bash, procps" + echo "" + echo "删除功能:" + echo " --remove: 删除指定环境的容器和镜像,释放资源" +} + +echo "==========================================" +echo "X1.WebAPI Docker 部署脚本" +echo "开始时间: $(date)" +echo "==========================================" + +# 解析命令行参数 +parse_arguments "$@" + +# 显示环境信息 +echo "部署环境: $ENVIRONMENT" +echo "使用Dockerfile: $DOCKERFILE" +echo "镜像名称: $IMAGE_NAME" +echo "容器名称: $CONTAINER_NAME" +echo "端口: $PORT" +echo "操作模式: $([ "$REMOVE_MODE" = true ] && echo "删除模式" || echo "部署模式")" +echo "==========================================" + +# 检查Docker是否安装 +check_docker() { + log_info "检查Docker安装状态..." + if ! command -v docker &> /dev/null; then + log_error "Docker未安装,请先安装Docker" + exit 1 + fi + log_success "Docker已安装: $(docker --version)" +} + +# 检查Docker服务状态 +check_docker_service() { + log_info "检查Docker服务状态..." + if ! systemctl is-active --quiet docker; then + log_warning "Docker服务未运行,尝试启动..." + sudo systemctl start docker + sleep 2 + fi + log_success "Docker服务运行正常" +} + +# 检查目录和文件 +check_files() { + log_info "检查部署文件..." + + if [ ! -d "publish" ]; then + log_error "publish目录不存在,请先上传发布文件" + exit 1 + fi + + if [ ! -f "publish/X1.WebAPI" ]; then + log_error "可执行文件 publish/X1.WebAPI 不存在" + exit 1 + fi + + if [ ! -f "$DOCKERFILE" ]; then + log_error "Dockerfile不存在: $DOCKERFILE" + if [ "$ENVIRONMENT" = "development" ]; then + log_info "请确保 Dockerfile.dev 文件存在" + fi + exit 1 + fi + + log_success "所有必要文件检查通过" +} + +# 设置文件权限 +set_permissions() { + log_info "设置文件权限..." + + # 设置可执行文件权限 + chmod +x publish/X1.WebAPI + log_success "设置可执行文件权限完成" + + # 设置目录权限 + chmod 755 publish/ + log_success "设置目录权限完成" + + # 设置Dockerfile权限 + chmod 644 "$DOCKERFILE" + log_success "设置Dockerfile权限完成" + + # 显示权限信息 + log_info "文件权限信息:" + ls -la publish/X1.WebAPI + ls -la "$DOCKERFILE" +} + +# 停止旧容器 +stop_old_container() { + log_info "检查并停止旧容器..." + + if docker ps -a --format "table {{.Names}}" | grep -q "$CONTAINER_NAME"; then + log_info "发现旧容器,正在停止..." + docker stop "$CONTAINER_NAME" 2>/dev/null || true + log_success "旧容器已停止" + + log_info "删除旧容器..." + docker rm "$CONTAINER_NAME" 2>/dev/null || true + log_success "旧容器已删除" + else + log_info "未发现旧容器" + fi +} + +# 删除容器和镜像 +remove_container_and_image() { + log_info "开始删除容器和镜像..." + + # 删除容器 + if docker ps -a --format "table {{.Names}}" | grep -q "$CONTAINER_NAME"; then + log_info "发现容器,正在停止并删除..." + docker stop "$CONTAINER_NAME" 2>/dev/null || true + docker rm "$CONTAINER_NAME" 2>/dev/null || true + log_success "容器已删除" + else + log_info "未发现容器: $CONTAINER_NAME" + fi + + # 删除镜像 + if docker images --format "table {{.Repository}}:{{.Tag}}" | grep -q "$IMAGE_NAME:latest"; then + log_info "发现镜像,正在删除..." + docker rmi "$IMAGE_NAME:latest" 2>/dev/null || true + log_success "镜像已删除" + else + log_info "未发现镜像: $IMAGE_NAME:latest" + fi + + # 清理悬空镜像 + log_info "清理悬空镜像..." + docker image prune -f 2>/dev/null || true + log_success "悬空镜像清理完成" +} + +# 构建Docker镜像 +build_image() { + log_info "开始构建Docker镜像..." + + if [ "$ENVIRONMENT" = "development" ]; then + log_info "构建开发环境镜像..." + log_info "构建命令: docker build -f $DOCKERFILE -t $IMAGE_NAME:latest ." + + # 显示构建上下文 + log_info "构建上下文文件:" + ls -la + + # 构建开发镜像 + if docker build -f "$DOCKERFILE" -t "$IMAGE_NAME:latest" .; then + log_success "开发环境Docker镜像构建成功" + else + log_error "开发环境Docker镜像构建失败" + exit 1 + fi + else + log_info "构建生产环境镜像..." + log_info "构建命令: docker build -t $IMAGE_NAME:latest ." + + # 显示构建上下文 + log_info "构建上下文文件:" + ls -la + + # 构建生产镜像 + if docker build -t "$IMAGE_NAME:latest" .; then + log_success "生产环境Docker镜像构建成功" + else + log_error "生产环境Docker镜像构建失败" + exit 1 + fi + fi + + # 显示镜像信息 + log_info "镜像信息:" + docker images "$IMAGE_NAME:latest" +} + +# 运行新容器 +run_container() { + log_info "启动新容器..." + + # 根据环境设置不同的环境变量 + if [ "$ENVIRONMENT" = "development" ]; then + log_info "启动开发环境容器..." + docker run -d \ + --name "$CONTAINER_NAME" \ + --restart unless-stopped \ + -p "$PORT:12790" \ + -e ASPNETCORE_ENVIRONMENT=Development \ + "$IMAGE_NAME:latest" + else + log_info "启动生产环境容器..." + docker run -d \ + --name "$CONTAINER_NAME" \ + --restart unless-stopped \ + -p "$PORT:12789" \ + -e ASPNETCORE_ENVIRONMENT=Production \ + "$IMAGE_NAME:latest" + fi + + if [ $? -eq 0 ]; then + log_success "容器启动成功" + + # 等待容器启动 + log_info "等待容器启动..." + sleep 3 + + # 检查容器状态 + if docker ps | grep -q "$CONTAINER_NAME"; then + log_success "容器运行正常" + + # 显示容器信息 + log_info "容器信息:" + docker ps | grep "$CONTAINER_NAME" + + # 显示端口信息 + log_info "端口信息:" + netstat -tlnp | grep "$PORT" || log_warning "端口$PORT未监听,可能容器还在启动中" + + else + log_error "容器启动失败" + log_info "容器日志:" + docker logs "$CONTAINER_NAME" + exit 1 + fi + else + log_error "容器启动失败" + exit 1 + fi +} + +# 健康检查 +health_check() { + log_info "执行健康检查..." + + # 等待应用启动 + log_info "等待应用启动(最多30秒)..." + for i in {1..30}; do + if curl -s http://localhost:$PORT/health > /dev/null 2>&1; then + log_success "应用健康检查通过" + return 0 + fi + echo -n "." + sleep 1 + done + + log_warning "健康检查超时,但容器可能仍在启动中" + log_info "容器日志:" + docker logs "$CONTAINER_NAME" --tail 20 +} + +# 显示部署信息 +show_deployment_info() { + echo "" + echo "==========================================" + echo "部署完成!" + echo "==========================================" + echo "部署环境: $ENVIRONMENT" + echo "应用地址: http://localhost:$PORT" + echo "健康检查: http://localhost:$PORT/health" + echo "Swagger文档: http://localhost:$PORT/swagger" + echo "" + echo "容器管理命令:" + echo " 查看状态: docker ps | grep $CONTAINER_NAME" + echo " 查看日志: docker logs $CONTAINER_NAME" + echo " 重启容器: docker restart $CONTAINER_NAME" + echo " 停止容器: docker stop $CONTAINER_NAME" + + if [ "$ENVIRONMENT" = "development" ]; then + echo "" + echo "开发环境调试命令:" + echo " 进入容器: docker exec -it $CONTAINER_NAME /bin/bash" + echo " 系统监控: docker exec -it $CONTAINER_NAME htop" + echo " 网络测试: docker exec -it $CONTAINER_NAME ping google.com" + echo " 端口检查: docker exec -it $CONTAINER_NAME netstat -tulpn" + echo " 查看进程: docker exec -it $CONTAINER_NAME ps aux" + fi + + echo "" + echo "完成时间: $(date)" + echo "==========================================" +} + +# 主函数 +main() { + echo "开始执行流程..." + + # 检查Docker环境 + check_docker + check_docker_service + + # 如果是删除模式 + if [ "$REMOVE_MODE" = true ]; then + log_info "执行删除操作..." + remove_container_and_image + log_success "删除完成!" + return + fi + + # 部署模式 + log_info "执行部署操作..." + + # 检查当前目录 + if [ ! -f "publish/X1.WebAPI" ]; then + log_error "请在包含publish目录的目录中运行此脚本" + log_info "当前目录: $(pwd)" + log_info "期望结构: ./publish/X1.WebAPI" + exit 1 + fi + + # 执行部署步骤 + check_files + set_permissions + stop_old_container + build_image + run_container + health_check + show_deployment_info + + log_success "部署完成!" +} + +# 执行主函数 +main "$@" diff --git a/src/X1.WebAPI/docker-deploy.md b/src/X1.WebAPI/docker-deploy.md new file mode 100644 index 0000000..1cb9244 --- /dev/null +++ b/src/X1.WebAPI/docker-deploy.md @@ -0,0 +1,288 @@ +# X1.WebAPI Docker 部署指南 + +## 部署流程 + +### 1. 本地发布 +在Windows开发机器上执行: +```bash +# 在 X1.WebAPI 目录下运行 +publish.bat +``` + +### 2. 上传文件到服务器 +将 `publish/` 文件夹上传到Ubuntu服务器的 `/home/hyh/x1_service` 目录: +- `publish/` 文件夹(包含所有发布文件、Dockerfile、deploy.sh和部署指南) + +### 3. 服务器端操作 + +#### 方式一:使用自动化部署脚本(推荐) + +##### 3.1 准备部署环境 +```bash +cd /home/hyh/x1_service + +# 将deploy.sh从publish目录移动到当前目录 +mv publish/deploy.sh ./ + +# 设置deploy.sh执行权限 +chmod +x deploy.sh +``` + +##### 3.2 执行自动化部署 +```bash +# 运行部署脚本 +./deploy.sh +``` + +部署脚本会自动执行以下操作: +- 检查Docker安装和运行状态 +- 验证所有必要文件 +- 设置正确的文件权限 +- 停止并删除旧容器 +- 构建新的Docker镜像 +- 启动新容器 +- 执行健康检查 +- 显示部署结果 + +#### 方式二:手动部署(备选方案) + +##### 3.1 进入部署目录并设置权限 +```bash +cd /home/hyh/x1_service + +# 设置可执行文件权限 +chmod +x publish/X1.WebAPI + +# 设置目录权限 +chmod 755 publish/ +chmod 644 publish/Dockerfile + +# 如果使用非root用户运行Docker,可能需要调整权限 +# chown -R $USER:$USER publish/ +``` + +##### 3.2 构建Docker镜像 +```bash +docker build -t x1-webapi:latest . +``` + +##### 3.3 运行容器 +```bash +# 停止并删除旧容器(如果存在) +docker stop x1-webapi-container 2>/dev/null || true +docker rm x1-webapi-container 2>/dev/null || true + +# 运行新容器 +docker run -d \ + --name x1-webapi-container \ + --restart unless-stopped \ + -p 12789:12789 \ + x1-webapi:latest +``` + +## 容器管理命令 + +### 查看容器状态 +```bash +docker ps -a | grep x1-webapi +``` + +### 查看容器日志 +```bash +# 查看最新日志 +docker logs x1-webapi-container + +# 实时查看日志 +docker logs -f x1-webapi-container + +# 查看最后100行日志 +docker logs x1-webapi-container --tail 100 +``` + +### 容器操作 +```bash +# 停止容器 +docker stop x1-webapi-container + +# 启动容器 +docker start x1-webapi-container + +# 重启容器 +docker restart x1-webapi-container + +# 删除容器 +docker rm -f x1-webapi-container + +# 删除镜像 +docker rmi x1-webapi:latest +``` + +## 更新部署流程 + +### 使用自动化脚本更新(推荐) +```bash +# 1. 本地重新发布 +publish.bat + +# 2. 上传新的publish文件夹到服务器 +# 替换 /home/hyh/x1_service/publish/ 目录 + +# 3. 重新运行部署脚本 +cd /home/hyh/x1_service +./deploy.sh +``` + +### 手动更新(备选方案) +```bash +# 1. 本地重新发布 +publish.bat + +# 2. 上传新的publish文件夹到服务器 +# 替换 /home/hyh/x1_service/publish/ 目录 + +# 3. 重新构建和部署 +cd /home/hyh/x1_service + +# 重新设置权限(如果需要) +chmod +x publish/X1.WebAPI + +# 重新构建镜像 +docker build -t x1-webapi:latest . + +# 重启容器 +docker restart x1-webapi-container +``` + +## 故障排除 + +### 容器状态检查 +```bash +# 检查容器是否正常运行 +docker ps | grep x1-webapi + +# 检查容器详细状态 +docker inspect x1-webapi-container +``` + +### 网络和端口检查 +```bash +# 检查端口是否被占用 +netstat -tlnp | grep 12789 + +# 检查防火墙设置 +sudo ufw status +sudo ufw allow 12789 + +# 测试应用是否响应 +curl http://localhost:12789/health +``` + +### 权限问题排查 +```bash +# 检查文件权限 +ls -la publish/X1.WebAPI +ls -la publish/Dockerfile + +# 检查文件所有者 +ls -la publish/ + +# 如果权限有问题,重新设置 +chmod +x publish/X1.WebAPI +chmod 755 publish/ +chmod 644 publish/Dockerfile +``` + +### 日志分析 +```bash +# 查看容器启动日志 +docker logs x1-webapi-container + +# 查看应用错误日志 +docker logs x1-webapi-container | grep -i error + +# 查看最近的日志 +docker logs x1-webapi-container --since 10m +``` + +### deploy.sh脚本问题排查 +```bash +# 检查脚本权限 +ls -la deploy.sh + +# 重新设置脚本权限 +chmod +x deploy.sh + +# 检查脚本语法 +bash -n deploy.sh + +# 查看脚本详细输出 +bash -x deploy.sh +``` + +## 性能优化 + +### 资源限制 +```bash +docker run -d \ + --name x1-webapi-container \ + --restart unless-stopped \ + --memory=2g \ + --cpus=2 \ + -p 12789:12789 \ + x1-webapi:latest +``` + +### 日志管理 +```bash +# 限制日志大小 +docker run -d \ + --name x1-webapi-container \ + --restart unless-stopped \ + --log-opt max-size=10m \ + --log-opt max-file=3 \ + -p 12789:12789 \ + x1-webapi:latest +``` + +## 快速命令参考 + +### 一键部署(使用脚本) +```bash +cd /home/hyh/x1_service +mv publish/deploy.sh ./ +chmod +x deploy.sh +./deploy.sh +``` + +### 一键部署(手动) +```bash +cd /home/hyh/x1_service +chmod +x publish/X1.WebAPI +docker build -t x1-webapi:latest . +docker stop x1-webapi-container 2>/dev/null || true +docker rm x1-webapi-container 2>/dev/null || true +docker run -d --name x1-webapi-container --restart unless-stopped -p 12789:12789 x1-webapi:latest +``` + +### 一键重启 +```bash +docker restart x1-webapi-container && docker logs -f x1-webapi-container +``` + +### 一键清理 +```bash +docker stop x1-webapi-container +docker rm x1-webapi-container +docker rmi x1-webapi:latest +``` + +## 注意事项 + +1. **端口配置**:确保服务器防火墙允许12789端口访问 +2. **文件权限**:上传文件后必须设置正确的文件权限 +3. **网络配置**:如果使用反向代理,确保正确配置代理规则 +4. **日志管理**:定期清理容器日志避免磁盘空间不足 +5. **备份策略**:定期备份应用数据和配置文件 +6. **容器重启**:容器配置了自动重启策略,系统重启后会自动启动 +7. **deploy.sh脚本**:首次使用需要将脚本从publish目录移动到部署根目录 +8. **自动化优势**:使用deploy.sh脚本可以避免手动操作错误,提供详细的部署反馈 diff --git a/src/X1.WebAPI/publish.bat b/src/X1.WebAPI/publish.bat new file mode 100644 index 0000000..155b93a --- /dev/null +++ b/src/X1.WebAPI/publish.bat @@ -0,0 +1,34 @@ +@echo off +chcp 65001 >nul +echo 开始发布 X1.WebAPI 项目... +echo. + +echo 清理旧的发布文件... +if exist "publish" ( + rmdir /s /q "publish" 2>nul + if exist "publish" ( + echo 警告:无法删除publish目录,可能正在被使用 + echo 请关闭所有可能使用该目录的程序后重试 + pause + exit /b 1 + ) +) + +echo 开始发布... +echo 当前目录: %CD% +echo 使用相对路径发布以避免路径过长问题... +dotnet publish -c Release -o publish --self-contained true -r linux-x64 + +if %ERRORLEVEL% EQU 0 ( + echo. + echo 发布成功!输出目录: %CD%\publish + + echo. + echo 发布完成!可以上传publish目录到服务器进行Docker部署 + echo 注意:Dockerfile、docker-deploy.md和deploy.sh现在位于项目根目录,不需要复制到publish目录 +) else ( + echo. + echo 发布失败!错误代码: %ERRORLEVEL% +) + +pause \ No newline at end of file diff --git a/src/modify.md b/src/modify.md index 3a25a49..65ce37a 100644 --- a/src/modify.md +++ b/src/modify.md @@ -2,6 +2,130 @@ ## 2025年修改记录 +### 2025-08-19 - 修复deploy.sh脚本Docker构建错误 + +#### 问题描述 +deploy.sh脚本执行时出现错误: +``` +ERROR: failed to solve: failed to read dockerfile: open Dockerfile: no such file or directory +[ERROR] Docker镜像构建失败 +``` + +#### 问题原因 +deploy.sh脚本在`/home/hyh/x1_service`目录中执行`docker build -t x1-webapi:latest .`,但Dockerfile实际位于`publish`目录中,导致Docker找不到Dockerfile文件。 + +#### 解决方案 +**优化Dockerfile位置和构建流程:** + +1. 将Dockerfile移动到deploy.sh同层级(`/home/hyh/x1_service/Dockerfile`) +2. 修改Dockerfile中的COPY命令:`COPY publish/ .` +3. 恢复deploy.sh中的标准docker build命令:`docker build -t x1-webapi:latest .` +4. 删除publish目录中的旧Dockerfile + +**优势:** +- 更符合Docker最佳实践 +- 构建上下文更清晰直观 +- 不需要特殊的docker build参数 +- 更容易理解和维护 + +**修复循环依赖问题:** + +1. 修改`DependencyInjection.cs`中的配置验证方式,直接创建`ConfigurationValidator`实例而不依赖服务容器 +2. 修改`ConfigurationValidator`类,使logger参数可选,避免在服务注册过程中的依赖问题 +3. 保持配置验证在服务注册阶段进行,确保配置正确性 + +#### 修改文件 +- `X1.WebAPI/Dockerfile` - 新建Dockerfile在deploy.sh同层级 +- `X1.WebAPI/deploy.sh` - 恢复标准docker build命令 +- `X1.WebAPI/publish/Dockerfile` - 删除旧Dockerfile +- `X1.WebAPI/publish.bat` - 移除对Dockerfile、docker-deploy.md和deploy.sh的复制操作 +- `X1.Infrastructure/DependencyInjection.cs` - 修复循环依赖问题,直接创建ConfigurationValidator实例 +- `X1.Infrastructure/Configurations/Common/ConfigurationValidator.cs` - 修改logger参数为可选 + +#### 修改内容 +```bash +# 新的目录结构 +/home/hyh/x1_service/ +├── deploy.sh +├── Dockerfile # 新建 +└── publish/ + ├── X1.WebAPI + └── 其他发布文件... + +# deploy.sh +log_info "构建命令: docker build -t x1-webapi:latest ." +if docker build -t x1-webapi:latest .; then + +# Dockerfile +COPY publish/ . + +# publish.bat +# 移除复制Dockerfile、docker-deploy.md、deploy.sh的操作 +# 添加说明:这些文件现在位于项目根目录,不需要复制到publish目录 + +# DependencyInjection.cs +# 修改配置验证方式:直接创建ConfigurationValidator实例而不依赖服务容器 +var validator = new ConfigurationValidator(configuration, null); + +# ConfigurationValidator.cs +# 修改构造函数,使logger参数可选 +public ConfigurationValidator(IConfiguration configuration, ILogger? logger = null) +``` + +#### 测试验证 +修复后,deploy.sh脚本应该能够正确找到publish目录中的Dockerfile并成功构建Docker镜像。 + +--- + +### 2025-01-15 X1.WebAPI 部署脚本优化 + +#### 修改文件: +1. `X1.WebAPI/publish.bat` - 添加deploy.sh复制功能 +2. `X1.WebAPI/deploy.sh` - 创建优化的服务器端部署脚本 + +#### 修改内容: + +1. **publish.bat脚本增强**: + - 添加了自动复制 `deploy.sh` 到发布目录的功能 + - 现在会自动复制:Dockerfile、docker-deploy.md、deploy.sh + - 提供详细的复制状态反馈和错误提示 + +2. **deploy.sh脚本特性**: + - **彩色输出**:不同级别的信息用不同颜色显示(INFO蓝色、SUCCESS绿色、WARNING黄色、ERROR红色) + - **详细日志**:每个步骤都有详细的输出信息和状态反馈 + - **错误处理**:遇到错误立即停止并显示错误信息 + - **健康检查**:自动检查应用是否正常启动(最多等待30秒) + - **状态显示**:显示容器状态、端口信息、镜像信息等 + - **权限检查**:自动设置正确的文件权限 + - **Docker检查**:检查Docker安装状态和服务运行状态 + +3. **部署流程优化**: + - **文件检查**:验证所有必要文件是否存在 + - **权限设置**:自动设置可执行文件和目录权限 + - **容器管理**:自动停止和删除旧容器 + - **镜像构建**:显示构建过程和结果 + - **容器启动**:显示启动状态和端口监听情况 + - **健康检查**:验证应用是否正常响应 + +4. **使用方式**: + ```bash + # 本地发布 + publish.bat + + # 上传publish目录到服务器 + # 在服务器上运行 + chmod +x deploy.sh + ./deploy.sh + ``` + +#### 修改时间: +2025-01-15 + +#### 修改原因: +优化X1.WebAPI项目的部署流程,提供详细的部署输出信息,简化服务器端部署操作,提高部署的可视化和可维护性。 + +--- + ### 2025-01-16 测试用例列表组件创建 #### 修改文件: @@ -3624,4 +3748,1586 @@ if (webSocketResponse?.Success == true) - 集成了终端设备服务 - 添加了设备ID的必填验证 - 支持多条命令输入,每条命令带时间 - - 路径设为可选,描述不做限制 \ No newline at end of file + - 路径设为可选,描述不做限制 + +--- + +## 2025-01-16 - Dockerfile优化:提供开发调试支持 + +### 修改文件 +1. **X1.WebAPI/Dockerfile** - 使用完整版本镜像 +2. **X1.WebAPI/Dockerfile.dev** - 创建开发环境专用Dockerfile + +### 问题描述 +使用 `mcr.microsoft.com/dotnet/aspnet:8.0-jammy-chiseled` 精简镜像时,容器内没有bash或sh shell,导致无法使用 `docker exec -it` 进入容器进行调试。 + +### 解决方案 + +#### 方案1:生产环境Dockerfile(推荐) +使用完整版本的镜像,提供基本的调试支持: + +```dockerfile +# 使用官方.NET 8.0运行时镜像作为基础镜像(完整版本,支持调试) +FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy + +# 设置工作目录 +WORKDIR /app + +# 设置环境变量 +ENV ASPNETCORE_ENVIRONMENT=Production +ENV ASPNETCORE_URLS=http://+:12789 + +# 复制发布文件到容器中 +COPY publish/ . + +# 暴露端口12789 +EXPOSE 12789 + +# 设置应用启动命令 +ENTRYPOINT ["./X1.WebAPI"] +``` + +#### 方案2:开发环境Dockerfile(完整调试支持) +创建专门的开发环境Dockerfile,提供完整的调试工具: + +```dockerfile +# 开发环境Dockerfile - 提供完整的调试支持 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy + +# 安装开发调试工具 +RUN apt-get update && apt-get install -y \ + bash \ + curl \ + wget \ + vim \ + nano \ + htop \ + procps \ + net-tools \ + iputils-ping \ + telnet \ + && rm -rf /var/lib/apt/lists/* + +# 设置工作目录 +WORKDIR /app + +# 设置环境变量(开发环境) +ENV ASPNETCORE_ENVIRONMENT=Development +ENV ASPNETCORE_URLS=http://+:12789 +ENV DOTNET_USE_POLLING_FILE_WATCHER=1 + +# 复制发布文件到容器中 +COPY publish/ . + +# 暴露端口12789 +EXPOSE 12789 + +# 设置应用启动命令 +ENTRYPOINT ["./X1.WebAPI"] +``` + +### 修改内容 + +#### 生产环境Dockerfile +1. **镜像选择**:从 `jammy-chiseled` 改为 `jammy` +2. **调试支持**:完整镜像包含bash、sh等基本工具 +3. **性能平衡**:在调试便利性和镜像大小之间取得平衡 + +#### 开发环境Dockerfile +1. **完整工具集**:安装常用的调试和网络工具 +2. **开发环境配置**:设置Development环境和文件监视 +3. **调试工具**:包含vim、nano、htop、net-tools等 + +### 技术特性 + +#### 生产环境特性 +- **基本调试**:支持bash shell和基本命令 +- **镜像优化**:比精简镜像稍大,但包含必要工具 +- **安全平衡**:保持相对安全的镜像环境 + +#### 开发环境特性 +- **完整调试**:提供完整的Linux工具集 +- **网络诊断**:包含ping、telnet、net-tools等 +- **系统监控**:包含htop、procps等监控工具 +- **文件编辑**:包含vim、nano等编辑器 + +### 使用方法 + +#### 生产环境部署 +```bash +# 构建生产镜像 +docker build -t x1-webapi:latest . + +# 运行生产容器 +docker run -d --name x1-webapi -p 12789:12789 x1-webapi:latest + +# 进入容器调试 +docker exec -it /bin/bash +``` + +#### 开发环境部署 +```bash +# 构建开发镜像 +docker build -f Dockerfile.dev -t x1-webapi:dev . + +# 运行开发容器 +docker run -d --name x1-webapi-dev -p 12789:12789 x1-webapi:dev + +# 进入容器调试 +docker exec -it /bin/bash + +# 使用开发工具 +docker exec -it htop +docker exec -it ping google.com +docker exec -it netstat -tulpn +``` + +### 开发工具说明 + +#### 网络诊断工具 +- **ping**:网络连通性测试 +- **telnet**:端口连通性测试 +- **net-tools**:网络配置和状态查看 +- **curl/wget**:HTTP请求测试 + +#### 系统监控工具 +- **htop**:进程监控和系统资源查看 +- **procps**:进程管理工具 +- **ps**:进程状态查看 + +#### 文件编辑工具 +- **vim**:高级文本编辑器 +- **nano**:简单文本编辑器 + +### 部署建议 + +#### 生产环境 +- 使用 `Dockerfile`(完整版本镜像) +- 提供基本调试支持 +- 保持相对安全的镜像环境 + +#### 开发环境 +- 使用 `Dockerfile.dev`(完整工具集) +- 提供完整的调试和诊断工具 +- 便于问题排查和系统分析 + +#### 测试环境 +- 根据需求选择对应的Dockerfile +- 可以先用开发版本进行测试 +- 确认无误后使用生产版本 + +### 优势对比 + +| 特性 | 精简镜像 | 完整镜像 | 开发镜像 | +|------|----------|----------|----------| +| 镜像大小 | 最小 | 中等 | 较大 | +| 调试支持 | 无 | 基本 | 完整 | +| 安全风险 | 最低 | 中等 | 较高 | +| 开发便利性 | 差 | 好 | 最好 | +| 生产适用性 | 最佳 | 好 | 不推荐 | + +### 注意事项 +- **生产环境**:建议使用完整镜像,平衡调试需求和安全性 +- **开发环境**:可以使用开发镜像,提供完整的调试工具 +- **镜像大小**:完整镜像比精简镜像大约增加50-100MB +- **安全考虑**:开发镜像包含更多工具,安全风险相对较高 + +#### 修改时间: +2025-01-16 + +#### 修改原因: +优化Docker镜像配置,提供更好的开发调试支持。使用完整版本镜像解决无法进入容器的问题,同时创建专门的开发环境Dockerfile,为不同环境提供合适的调试工具支持。 + +--- + +## 2025-01-16 - deploy.sh脚本更新:支持开发环境部署 + +### 修改文件 +**X1.WebAPI/deploy.sh** - 添加开发环境部署支持 + +### 功能增强 +为deploy.sh脚本添加了命令行参数支持,可以根据不同环境选择对应的Dockerfile进行部署。 + +### 新增功能 + +#### 1. 命令行参数支持 +```bash +# 生产环境部署(默认) +./deploy.sh + +# 开发环境部署 +./deploy.sh --dev + +# 显示帮助信息 +./deploy.sh --help +``` + +#### 2. 环境配置 +- **生产环境**: + - Dockerfile: `Dockerfile` + - 镜像名称: `x1-webapi` + - 容器名称: `x1-webapi-container` + - 环境变量: `ASPNETCORE_ENVIRONMENT=Production` + +- **开发环境**: + - Dockerfile: `Dockerfile.dev` + - 镜像名称: `x1-webapi-dev` + - 容器名称: `x1-webapi-dev-container` + - 环境变量: `ASPNETCORE_ENVIRONMENT=Development` + +#### 3. 智能构建逻辑 +- **生产环境**:使用 `docker build -t x1-webapi:latest .` +- **开发环境**:使用 `docker build -f Dockerfile.dev -t x1-webapi-dev:latest .` + +#### 4. 环境特定功能 +- **文件检查**:根据环境检查对应的Dockerfile是否存在 +- **权限设置**:为对应的Dockerfile设置正确的权限 +- **容器管理**:使用环境特定的容器名称进行管理 +- **调试信息**:开发环境显示额外的调试命令 + +### 技术特性 + +#### 参数解析 +- 使用 `parse_arguments()` 函数解析命令行参数 +- 支持 `--dev`、`--help`、`-h` 参数 +- 提供详细的帮助信息和使用说明 + +#### 环境隔离 +- 不同环境使用不同的镜像和容器名称 +- 避免生产环境和开发环境的冲突 +- 支持同时运行多个环境 + +#### 智能检测 +- 自动检测Dockerfile是否存在 +- 根据环境提供相应的错误提示 +- 动态调整构建和运行参数 + +### 使用方法 + +#### 生产环境部署 +```bash +# 标准生产环境部署 +./deploy.sh + +# 输出示例 +========================================== +X1.WebAPI Docker 部署脚本 +开始时间: 2025-01-16 15:30:00 +========================================== +部署环境: production +使用Dockerfile: Dockerfile +镜像名称: x1-webapi +容器名称: x1-webapi-container +========================================== +``` + +#### 开发环境部署 +```bash +# 开发环境部署 +./deploy.sh --dev + +# 输出示例 +========================================== +X1.WebAPI Docker 部署脚本 +开始时间: 2025-01-16 15:30:00 +========================================== +部署环境: development +使用Dockerfile: Dockerfile.dev +镜像名称: x1-webapi-dev +容器名称: x1-webapi-dev-container +========================================== +``` + +#### 帮助信息 +```bash +# 显示帮助 +./deploy.sh --help + +# 输出示例 +X1.WebAPI Docker 部署脚本 + +使用方法: + ./deploy.sh # 生产环境部署 + ./deploy.sh --dev # 开发环境部署 + ./deploy.sh --help # 显示帮助信息 + +环境说明: + 生产环境: 使用 Dockerfile,包含基本调试工具 + 开发环境: 使用 Dockerfile.dev,包含完整调试工具集 + +开发环境包含的额外工具: + - 网络诊断: ping, telnet, net-tools, curl, wget + - 系统监控: htop, procps, ps + - 文件编辑: vim, nano + - 基本工具: bash, procps +``` + +### 部署信息增强 + +#### 生产环境信息 +```bash +容器管理命令: + 查看状态: docker ps | grep x1-webapi-container + 查看日志: docker logs x1-webapi-container + 重启容器: docker restart x1-webapi-container + 停止容器: docker stop x1-webapi-container +``` + +#### 开发环境信息 +```bash +容器管理命令: + 查看状态: docker ps | grep x1-webapi-dev-container + 查看日志: docker logs x1-webapi-dev-container + 重启容器: docker restart x1-webapi-dev-container + 停止容器: docker stop x1-webapi-dev-container + +开发环境调试命令: + 进入容器: docker exec -it x1-webapi-dev-container /bin/bash + 系统监控: docker exec -it x1-webapi-dev-container htop + 网络测试: docker exec -it x1-webapi-dev-container ping google.com + 端口检查: docker exec -it x1-webapi-dev-container netstat -tulpn + 查看进程: docker exec -it x1-webapi-dev-container ps aux +``` + +### 优势 + +#### 环境隔离 +- 生产环境和开发环境完全隔离 +- 避免环境间的相互影响 +- 支持并行部署和测试 + +#### 灵活部署 +- 一键切换部署环境 +- 统一的部署流程 +- 环境特定的配置和工具 + +#### 调试便利 +- 开发环境提供完整的调试工具 +- 详细的调试命令提示 +- 环境特定的日志和监控 + +#### 运维友好 +- 清晰的帮助信息 +- 详细的部署状态反馈 +- 环境特定的管理命令 + +### 注意事项 +- 确保 `Dockerfile.dev` 文件存在(开发环境部署时) +- 不同环境的容器名称不同,避免冲突 +- 开发环境镜像包含更多工具,体积较大 +- 生产环境建议使用标准Dockerfile + +#### 修改时间: +2025-01-16 + +#### 修改原因: +为deploy.sh脚本添加开发环境部署支持,提供灵活的环境选择功能,满足不同场景的部署需求,提高开发和运维效率。 + +--- + +## 2025-01-16 - deploy.sh端口冲突修复 + +### 修改文件 +**X1.WebAPI/deploy.sh** - 修复生产环境和开发环境端口冲突问题 + +### 问题描述 +生产环境和开发环境都使用相同的端口12789,导致同时部署时出现端口冲突错误: +``` +docker: Error response from daemon: failed to set up container networking: +driver failed programming external connectivity on endpoint x1-webapi-dev-container: +Bind for 0.0.0.0:12789 failed: port is already allocated +``` + +### 解决方案 +为不同环境配置不同的端口,避免端口冲突: + +#### 端口配置 +- **生产环境**:端口 12789 +- **开发环境**:端口 12790 + +#### 修改内容 +1. **添加端口变量**: + ```bash + # 默认配置 + ENVIRONMENT="production" + DOCKERFILE="Dockerfile" + IMAGE_NAME="x1-webapi" + CONTAINER_NAME="x1-webapi-container" + PORT="12789" + ``` + +2. **开发环境端口配置**: + ```bash + --dev) + ENVIRONMENT="development" + DOCKERFILE="Dockerfile.dev" + IMAGE_NAME="x1-webapi-dev" + CONTAINER_NAME="x1-webapi-dev-container" + PORT="12790" + shift + ;; + ``` + +3. **动态端口映射**: + ```bash + # 使用变量进行端口映射 + -p "$PORT:12789" + ``` + +4. **更新所有端口引用**: + - 健康检查:`http://localhost:$PORT/health` + - 应用地址:`http://localhost:$PORT` + - Swagger文档:`http://localhost:$PORT/swagger` + - 端口监听检查:`netstat -tlnp | grep "$PORT"` + +### 技术特性 + +#### 环境隔离 +- **生产环境**:12789端口,容器名 `x1-webapi-container` +- **开发环境**:12790端口,容器名 `x1-webapi-dev-container` +- 完全隔离,可同时运行 + +#### 动态配置 +- 使用变量管理端口配置 +- 支持未来扩展更多环境 +- 统一的端口管理逻辑 + +#### 部署信息 +- 显示当前使用的端口 +- 提供正确的访问地址 +- 环境特定的管理命令 + +### 使用方法 + +#### 生产环境部署 +```bash +./deploy.sh +# 使用端口 12789 +# 访问地址: http://localhost:12789 +``` + +#### 开发环境部署 +```bash +./deploy.sh --dev +# 使用端口 12790 +# 访问地址: http://localhost:12790 +``` + +#### 同时运行两个环境 +```bash +# 先部署生产环境 +./deploy.sh + +# 再部署开发环境(不会冲突) +./deploy.sh --dev + +# 现在可以同时访问: +# 生产环境: http://localhost:12789 +# 开发环境: http://localhost:12790 +``` + +### 部署信息示例 + +#### 生产环境 +``` +========================================== +部署完成! +========================================== +部署环境: production +应用地址: http://localhost:12789 +健康检查: http://localhost:12789/health +Swagger文档: http://localhost:12789/swagger +``` + +#### 开发环境 +``` +========================================== +部署完成! +========================================== +部署环境: development +应用地址: http://localhost:12790 +健康检查: http://localhost:12790/health +Swagger文档: http://localhost:12790/swagger + +开发环境调试命令: + 进入容器: docker exec -it x1-webapi-dev-container /bin/bash + 系统监控: docker exec -it x1-webapi-dev-container htop + 网络测试: docker exec -it x1-webapi-dev-container ping google.com + 端口检查: docker exec -it x1-webapi-dev-container netstat -tulpn + 查看进程: docker exec -it x1-webapi-dev-container ps aux +``` + +### 优势 + +#### 环境隔离 +- 生产环境和开发环境完全隔离 +- 避免端口冲突和资源竞争 +- 支持并行开发和测试 + +#### 灵活部署 +- 可以同时运行多个环境 +- 支持A/B测试和灰度发布 +- 便于环境切换和回滚 + +#### 运维便利 +- 清晰的端口分配 +- 环境特定的管理命令 +- 统一的部署流程 + +### 注意事项 +- 确保端口12789和12790未被其他服务占用 +- 防火墙需要开放对应端口 +- 负载均衡器需要配置正确的端口转发 + +#### 修改时间: +2025-01-16 + +#### 修改原因: +修复生产环境和开发环境的端口冲突问题,为不同环境分配不同的端口,支持同时运行多个环境,提高开发和测试效率。 + +--- + +## 2025-01-16 - deploy.sh功能增强:添加删除功能 + +### 修改文件 +**X1.WebAPI/deploy.sh** - 添加容器和镜像删除功能 + +### 功能增强 +为deploy.sh脚本添加了删除功能,支持删除指定环境的容器和镜像,释放系统资源。 + +### 新增功能 + +#### 1. 删除模式支持 +```bash +# 删除生产环境 +./deploy.sh --remove + +# 删除开发环境 +./deploy.sh --dev --remove + +# 显示帮助信息 +./deploy.sh --help +``` + +#### 2. 删除功能特性 +- **容器删除**:停止并删除指定环境的容器 +- **镜像删除**:删除对应的Docker镜像 +- **悬空镜像清理**:自动清理无用的悬空镜像 +- **安全检查**:删除前检查容器和镜像是否存在 + +#### 3. 操作模式显示 +脚本会显示当前的操作模式: +``` +操作模式: 删除模式 +操作模式: 部署模式 +``` + +### 技术实现 + +#### 参数解析增强 +```bash +# 添加删除模式参数 +--remove) + REMOVE_MODE=true + shift + ;; +``` + +#### 删除函数实现 +```bash +remove_container_and_image() { + # 删除容器 + if docker ps -a --format "table {{.Names}}" | grep -q "$CONTAINER_NAME"; then + docker stop "$CONTAINER_NAME" 2>/dev/null || true + docker rm "$CONTAINER_NAME" 2>/dev/null || true + fi + + # 删除镜像 + if docker images --format "table {{.Repository}}:{{.Tag}}" | grep -q "$IMAGE_NAME:latest"; then + docker rmi "$IMAGE_NAME:latest" 2>/dev/null || true + fi + + # 清理悬空镜像 + docker image prune -f 2>/dev/null || true +} +``` + +#### 主函数逻辑优化 +```bash +main() { + # 检查Docker环境 + check_docker + check_docker_service + + # 如果是删除模式 + if [ "$REMOVE_MODE" = true ]; then + remove_container_and_image + return + fi + + # 部署模式 + # ... 执行部署步骤 +} +``` + +### 使用方法 + +#### 删除生产环境 +```bash +./deploy.sh --remove + +# 输出示例 +========================================== +X1.WebAPI Docker 部署脚本 +开始时间: 2025-01-16 15:30:00 +========================================== +部署环境: production +使用Dockerfile: Dockerfile +镜像名称: x1-webapi +容器名称: x1-webapi-container +端口: 12789 +操作模式: 删除模式 +========================================== +[INFO] 执行删除操作... +[INFO] 发现容器,正在停止并删除... +[SUCCESS] 容器已删除 +[INFO] 发现镜像,正在删除... +[SUCCESS] 镜像已删除 +[INFO] 清理悬空镜像... +[SUCCESS] 悬空镜像清理完成 +[SUCCESS] 删除完成! +``` + +#### 删除开发环境 +```bash +./deploy.sh --dev --remove + +# 输出示例 +========================================== +X1.WebAPI Docker 部署脚本 +开始时间: 2025-01-16 15:30:00 +========================================== +部署环境: development +使用Dockerfile: Dockerfile.dev +镜像名称: x1-webapi-dev +容器名称: x1-webapi-dev-container +端口: 12790 +操作模式: 删除模式 +========================================== +[INFO] 执行删除操作... +[INFO] 发现容器,正在停止并删除... +[SUCCESS] 容器已删除 +[INFO] 发现镜像,正在删除... +[SUCCESS] 镜像已删除 +[INFO] 清理悬空镜像... +[SUCCESS] 悬空镜像清理完成 +[SUCCESS] 删除完成! +``` + +### 帮助信息更新 + +```bash +./deploy.sh --help + +# 输出示例 +X1.WebAPI Docker 部署脚本 + +使用方法: + ./deploy.sh # 生产环境部署 + ./deploy.sh --dev # 开发环境部署 + ./deploy.sh --remove # 删除当前环境容器和镜像 + ./deploy.sh --dev --remove # 删除开发环境容器和镜像 + ./deploy.sh --help # 显示帮助信息 + +环境说明: + 生产环境: 使用 Dockerfile,包含基本调试工具 + 开发环境: 使用 Dockerfile.dev,包含完整调试工具集 + +开发环境包含的额外工具: + - 网络诊断: ping, telnet, net-tools, curl, wget + - 系统监控: htop, procps, ps + - 文件编辑: vim, nano + - 基本工具: bash, procps + +删除功能: + --remove: 删除指定环境的容器和镜像,释放资源 +``` + +### 优势 + +#### 资源管理 +- **磁盘空间**:删除不需要的容器和镜像,释放磁盘空间 +- **内存清理**:清理悬空镜像,优化系统性能 +- **环境清理**:快速清理测试环境,准备新的部署 + +#### 运维便利 +- **一键清理**:一个命令完成容器和镜像的清理 +- **环境隔离**:可以单独清理生产环境或开发环境 +- **安全检查**:删除前检查资源是否存在,避免错误 + +#### 开发效率 +- **快速重置**:删除旧环境,重新部署新版本 +- **环境切换**:在不同环境间快速切换 +- **测试清理**:清理测试环境,保持系统整洁 + +### 使用场景 + +#### 开发阶段 +```bash +# 清理开发环境,重新部署 +./deploy.sh --dev --remove +./deploy.sh --dev +``` + +#### 测试阶段 +```bash +# 清理测试环境,部署新版本 +./deploy.sh --remove +./deploy.sh +``` + +#### 生产维护 +```bash +# 清理旧版本,部署新版本 +./deploy.sh --remove +./deploy.sh +``` + +### 注意事项 +- **数据备份**:删除前确保重要数据已备份 +- **服务中断**:删除操作会停止相关服务 +- **权限要求**:删除操作需要Docker权限 +- **依赖检查**:确保没有其他服务依赖被删除的容器 + +#### 修改时间: +2025-01-16 + +#### 修改原因: +为deploy.sh脚本添加删除功能,支持快速清理容器和镜像,释放系统资源,提高开发和运维效率,满足不同场景的资源管理需求。 + +--- + +## 2025-01-16 - Dockerfile.dev端口配置修正 + +### 修改文件 +**X1.WebAPI/Dockerfile.dev** - 修正端口配置与deploy.sh脚本保持一致 + +### 问题描述 +Dockerfile.dev中的端口配置与deploy.sh脚本中的端口分配不一致: +- deploy.sh脚本中开发环境使用端口12790 +- Dockerfile.dev中仍使用端口12789 + +### 修正内容 + +#### 1. 环境变量修正 +```dockerfile +# 修改前 +ENV ASPNETCORE_URLS=http://+:12789 + +# 修改后 +ENV ASPNETCORE_URLS=http://+:12790 +``` + +#### 2. 端口暴露修正 +```dockerfile +# 修改前 +EXPOSE 12789 + +# 修改后 +EXPOSE 12790 +``` + +#### 3. 启动脚本端口显示修正 +```dockerfile +# 修改前 +echo "端口: 12789" + +# 修改后 +echo "端口: 12790" +``` + +### 端口分配策略 + +#### 生产环境 +- **容器内端口**: 12789 +- **主机端口**: 12789 +- **Dockerfile**: Dockerfile +- **镜像名称**: x1-webapi +- **容器名称**: x1-webapi-container + +#### 开发环境 +- **容器内端口**: 12790 +- **主机端口**: 12790 +- **Dockerfile**: Dockerfile.dev +- **镜像名称**: x1-webapi-dev +- **容器名称**: x1-webapi-dev-container + +### 修正后的配置一致性 + +#### deploy.sh脚本配置 +```bash +# 生产环境 +PORT="12789" + +# 开发环境 +--dev) + PORT="12790" + ;; +``` + +#### Dockerfile.dev配置 +```dockerfile +# 环境变量 +ENV ASPNETCORE_URLS=http://+:12790 + +# 端口暴露 +EXPOSE 12790 + +# 启动脚本显示 +echo "端口: 12790" +``` + +### 验证方法 + +#### 1. 构建开发环境镜像 +```bash +./deploy.sh --dev +``` + +#### 2. 检查容器端口映射 +```bash +docker ps +# 应该显示: 0.0.0.0:12790->12790/tcp +``` + +#### 3. 测试应用访问 +```bash +curl http://localhost:12790/health +``` + +### 优势 + +#### 配置一致性 +- **端口统一**: 容器内外端口配置完全一致 +- **脚本同步**: deploy.sh和Dockerfile.dev配置同步 +- **环境隔离**: 生产环境和开发环境使用不同端口 + +#### 运维便利 +- **无冲突**: 生产环境和开发环境可以同时运行 +- **清晰标识**: 端口号明确区分环境类型 +- **易于管理**: 端口分配逻辑清晰明确 + +#### 修改时间: +2025-01-16 + +#### 修改原因: +修正Dockerfile.dev中的端口配置,确保与deploy.sh脚本中的端口分配策略保持一致,避免配置不一致导致的部署问题,提高配置的准确性和可维护性。 + +--- + +## 2025-01-16 - deploy.sh脚本函数定义顺序修复 + +### 修改文件 +**X1.WebAPI/deploy.sh** - 修复函数定义顺序问题 + +### 问题描述 +deploy.sh脚本中出现`log_error: command not found`错误,原因是日志函数定义在脚本后面,但在`parse_arguments`函数中就被调用了,导致函数未定义错误。 + +### 错误信息 +```bash +./deploy.sh: line 40: log_error: command not found +``` + +### 问题分析 +脚本结构问题: +- `parse_arguments`函数在第40行调用了`log_error`函数 +- 但`log_error`函数定义在脚本的后面部分(约第100行之后) +- 导致函数调用时还未定义 + +### 修复方案 + +#### 1. 重新组织脚本结构 +将日志函数定义移到脚本前面,确保在使用前已定义: + +```bash +#!/bin/bash + +set -e # 遇到错误立即退出 + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# 日志函数 +log_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +log_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +log_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# 默认配置 +ENVIRONMENT="production" +DOCKERFILE="Dockerfile" +IMAGE_NAME="x1-webapi" +CONTAINER_NAME="x1-webapi-container" +PORT="12789" +REMOVE_MODE=false + +# 解析命令行参数 +parse_arguments() { + # ... 函数内容 +} +``` + +#### 2. 删除重复定义 +移除脚本后面重复的日志函数定义,避免代码重复。 + +### 修复后的脚本结构 + +#### 正确的函数定义顺序 +1. **颜色定义** - 定义颜色变量 +2. **日志函数** - 定义所有日志输出函数 +3. **配置变量** - 定义默认配置 +4. **功能函数** - 定义业务逻辑函数 +5. **主函数** - 定义主执行流程 + +#### 函数依赖关系 +``` +parse_arguments() + ├── log_error() ✓ (已定义) + └── show_help() ✓ (已定义) + +check_docker() + └── log_error() ✓ (已定义) + +check_docker_service() + ├── log_warning() ✓ (已定义) + └── log_success() ✓ (已定义) +``` + +### 验证方法 + +#### 1. 测试脚本语法 +```bash +bash -n deploy.sh +# 应该无输出,表示语法正确 +``` + +#### 2. 测试帮助功能 +```bash +./deploy.sh --help +# 应该正常显示帮助信息 +``` + +#### 3. 测试错误参数 +```bash +./deploy.sh --invalid-param +# 应该显示错误信息而不是函数未定义错误 +``` + +### 修复效果 + +#### 修复前 +```bash +./deploy.sh --invalid +./deploy.sh: line 40: log_error: command not found +``` + +#### 修复后 +```bash +./deploy.sh --invalid +[ERROR] 未知参数: --invalid +X1.WebAPI Docker 部署脚本 + +使用方法: + ./deploy.sh # 生产环境部署 + ./deploy.sh --dev # 开发环境部署 + ./deploy.sh --remove # 删除当前环境容器和镜像 + ./deploy.sh --dev --remove # 删除开发环境容器和镜像 + ./deploy.sh --help # 显示帮助信息 +``` + +### 最佳实践 + +#### 脚本结构规范 +1. **Shebang和设置** - 脚本开头 +2. **常量定义** - 颜色、配置等 +3. **函数定义** - 所有函数在使用前定义 +4. **主逻辑** - 脚本的主要执行流程 + +#### 函数定义顺序 +```bash +# 1. 工具函数(日志、颜色等) +log_info() { ... } +log_error() { ... } + +# 2. 配置函数 +parse_arguments() { ... } +show_help() { ... } + +# 3. 检查函数 +check_docker() { ... } +check_files() { ... } + +# 4. 业务函数 +build_image() { ... } +run_container() { ... } + +# 5. 主函数 +main() { ... } +``` + +### 优势 + +#### 代码质量 +- **结构清晰**:函数定义顺序合理 +- **依赖明确**:函数调用关系清晰 +- **易于维护**:代码组织规范 + +#### 错误处理 +- **语法检查**:脚本语法正确 +- **函数可用**:所有函数在使用前已定义 +- **错误提示**:提供清晰的错误信息 + +#### 修改时间: +2025-01-16 + +#### 修改原因: +修复deploy.sh脚本中函数定义顺序问题,确保日志函数在使用前已定义,解决`log_error: command not found`错误,提高脚本的可靠性和可维护性。 + +--- + +## 2025-01-16 - deploy.sh参数兼容性改进 + +### 修改文件 +**X1.WebAPI/deploy.sh** - 改进参数解析的兼容性 + +### 问题描述 +用户输入`./deploy.sh -help`时出现错误: +```bash +[ERROR] 未知参数: -help +``` + +原因是脚本只支持`--help`格式,不支持`-help`格式,导致用户体验不佳。 + +### 问题分析 +脚本参数解析只支持: +- `--help` (完整格式) +- `-h` (简写格式) + +但不支持: +- `-help` (用户习惯的格式) + +### 修复方案 + +#### 1. 扩展帮助参数支持 +```bash +# 修改前 +--help|-h) + +# 修改后 +--help|-h|-help) +``` + +#### 2. 更新帮助信息显示 +在帮助信息中明确显示所有支持的参数格式: + +```bash +echo " ./deploy.sh --help # 显示帮助信息" +echo " ./deploy.sh -h # 显示帮助信息(简写)" +echo " ./deploy.sh -help # 显示帮助信息(简写)" +echo "" +echo "参数说明:" +echo " --dev : 使用开发环境配置(Dockerfile.dev,端口12790)" +echo " --remove : 删除模式,删除容器和镜像" +echo " --help : 显示帮助信息" +echo " -h : 显示帮助信息(简写)" +echo " -help : 显示帮助信息(简写)" +``` + +### 修复效果 + +#### 修复前 +```bash +./deploy.sh -help +[ERROR] 未知参数: -help +``` + +#### 修复后 +```bash +./deploy.sh -help +X1.WebAPI Docker 部署脚本 + +使用方法: + ./deploy.sh # 生产环境部署 + ./deploy.sh --dev # 开发环境部署 + ./deploy.sh --remove # 删除当前环境容器和镜像 + ./deploy.sh --dev --remove # 删除开发环境容器和镜像 + ./deploy.sh --help # 显示帮助信息 + ./deploy.sh -h # 显示帮助信息(简写) + ./deploy.sh -help # 显示帮助信息(简写) + +参数说明: + --dev : 使用开发环境配置(Dockerfile.dev,端口12790) + --remove : 删除模式,删除容器和镜像 + --help : 显示帮助信息 + -h : 显示帮助信息(简写) + -help : 显示帮助信息(简写) +``` + +### 支持的参数格式 + +#### 帮助参数 +| 格式 | 说明 | 示例 | +|------|------|------| +| `--help` | 完整格式 | `./deploy.sh --help` | +| `-h` | 标准简写 | `./deploy.sh -h` | +| `-help` | 用户习惯 | `./deploy.sh -help` | + +#### 环境参数 +| 格式 | 说明 | 示例 | +|------|------|------| +| `--dev` | 开发环境 | `./deploy.sh --dev` | + +#### 删除参数 +| 格式 | 说明 | 示例 | +|------|------|------| +| `--remove` | 删除模式 | `./deploy.sh --remove` | + +### 参数组合示例 + +#### 开发环境操作 +```bash +# 部署开发环境 +./deploy.sh --dev + +# 删除开发环境 +./deploy.sh --dev --remove + +# 查看帮助 +./deploy.sh --dev --help +./deploy.sh --dev -h +./deploy.sh --dev -help +``` + +#### 生产环境操作 +```bash +# 部署生产环境 +./deploy.sh + +# 删除生产环境 +./deploy.sh --remove + +# 查看帮助 +./deploy.sh --help +./deploy.sh -h +./deploy.sh -help +``` + +### 优势 + +#### 用户体验 +- **兼容性强**:支持多种参数格式 +- **习惯友好**:支持用户常见的`-help`格式 +- **清晰说明**:帮助信息详细说明所有参数 + +#### 开发便利 +- **灵活使用**:开发者可以根据习惯选择参数格式 +- **错误减少**:减少因参数格式错误导致的失败 +- **学习成本低**:符合常见的命令行工具习惯 + +#### 维护性 +- **扩展性好**:易于添加新的参数格式 +- **文档完整**:帮助信息包含所有支持的格式 +- **测试友好**:多种格式便于测试验证 + +### 最佳实践 + +#### 参数设计原则 +1. **标准格式**:优先支持`--long-format` +2. **简写格式**:提供`-s`标准简写 +3. **习惯格式**:支持用户常见的`-word`格式 +4. **文档完整**:在帮助信息中说明所有格式 + +#### 参数解析模式 +```bash +case $1 in + --help|-h|-help) + show_help + exit 0 + ;; + --dev) + # 开发环境配置 + ;; + --remove) + # 删除模式配置 + ;; + *) + log_error "未知参数: $1" + show_help + exit 1 + ;; +esac +``` + +#### 修改时间: +2025-01-16 + +#### 修改原因: +改进deploy.sh脚本的参数兼容性,支持`-help`格式,提高用户体验,减少因参数格式错误导致的失败,使脚本更符合用户的使用习惯。 + +--- + +## 2025-01-16 - deploy.sh端口映射修复 + +### 修改文件 +**X1.WebAPI/deploy.sh** - 修复开发环境容器端口映射配置 + +### 问题描述 +开发环境容器启动后状态为"Created"而不是"Up",容器创建成功但启动失败。 + +### 问题分析 +通过分析发现,`run_container`函数中的端口映射配置有错误: +- 开发环境容器内端口应该是12790 +- 但脚本中配置的是12789 +- 导致端口映射不匹配,容器无法正常启动 + +### 错误配置 +```bash +# 错误的端口映射(开发环境) +-p "$PORT:12789" # 容器内端口应该是12790 +``` + +### 修复方案 + +#### 端口映射修正 +```bash +# 修改前 +if [ "$ENVIRONMENT" = "development" ]; then + docker run -d \ + --name "$CONTAINER_NAME" \ + --restart unless-stopped \ + -p "$PORT:12789" \ # 错误:容器内端口 + -e ASPNETCORE_ENVIRONMENT=Development \ + "$IMAGE_NAME:latest" +fi + +# 修改后 +if [ "$ENVIRONMENT" = "development" ]; then + docker run -d \ + --name "$CONTAINER_NAME" \ + --restart unless-stopped \ + -p "$PORT:12790" \ # 正确:容器内端口 + -e ASPNETCORE_ENVIRONMENT=Development \ + "$IMAGE_NAME:latest" +fi +``` + +### 端口配置一致性 + +#### 完整的端口配置 +| 环境 | 主机端口 | 容器内端口 | Dockerfile配置 | 容器启动配置 | +|------|----------|------------|----------------|--------------| +| **生产环境** | 12789 | 12789 | `EXPOSE 12789` | `-p 12789:12789` | +| **开发环境** | 12790 | 12790 | `EXPOSE 12790` | `-p 12790:12790` | + +#### 配置文件对应关系 +1. **Dockerfile.dev** + ```dockerfile + ENV ASPNETCORE_URLS=http://+:12790 + EXPOSE 12790 + ``` + +2. **deploy.sh脚本** + ```bash + # 开发环境端口配置 + PORT="12790" + -p "$PORT:12790" # 主机端口:容器内端口 + ``` + +### 修复效果 + +#### 修复前 +```bash +# 容器状态 +926fd1b1a9f8 x1-webapi-dev:latest "./start-dev.sh" 9 minutes ago Created + +# 端口映射不匹配 +主机端口: 12790 +容器内端口: 12789 (错误) +``` + +#### 修复后 +```bash +# 容器状态 +926fd1b1a9f8 x1-webapi-dev:latest "./start-dev.sh" 2 minutes ago Up + +# 端口映射正确 +主机端口: 12790 +容器内端口: 12790 (正确) +``` + +### 验证方法 + +#### 1. 重新部署开发环境 +```bash +# 删除旧容器 +./deploy.sh --dev --remove + +# 重新部署 +./deploy.sh --dev +``` + +#### 2. 检查容器状态 +```bash +docker ps | grep x1-webapi-dev-container +# 应该显示: Up 状态 +``` + +#### 3. 检查端口映射 +```bash +docker port x1-webapi-dev-container +# 应该显示: 0.0.0.0:12790->12790/tcp +``` + +#### 4. 测试应用访问 +```bash +curl http://localhost:12790/health +# 应该返回健康检查响应 +``` + +### 问题根因分析 + +#### 配置不一致的原因 +1. **Dockerfile.dev** 中配置了容器内端口12790 +2. **deploy.sh脚本** 中端口映射配置错误 +3. **端口不匹配** 导致容器无法正常启动 + +#### 影响范围 +- **开发环境**:容器启动失败 +- **生产环境**:不受影响(配置正确) +- **用户体验**:开发环境无法正常使用 + +### 预防措施 + +#### 配置验证 +1. **端口一致性检查**:确保Dockerfile和deploy.sh端口配置一致 +2. **环境隔离**:不同环境使用不同端口,避免冲突 +3. **测试验证**:部署后验证容器状态和应用访问 + +#### 最佳实践 +1. **配置集中化**:将端口配置集中管理 +2. **文档同步**:保持配置文档与实际代码同步 +3. **自动化测试**:添加部署后的自动化验证 + +### 优势 + +#### 配置一致性 +- **端口匹配**:主机端口与容器内端口完全匹配 +- **环境隔离**:生产环境和开发环境使用不同端口 +- **配置同步**:所有配置文件保持一致 + +#### 运维便利 +- **快速部署**:开发环境可以正常启动 +- **问题定位**:端口配置问题得到解决 +- **环境管理**:不同环境可以同时运行 + +#### 修改时间: +2025-01-16 + +#### 修改原因: +修复deploy.sh脚本中开发环境容器端口映射配置错误,确保主机端口与容器内端口匹配,解决开发环境容器启动失败的问题,提高部署的可靠性。 + +--- + +## 2025-01-16 - Dockerfile.dev增强:添加完整开发工具集 + +### 修改文件 +**X1.WebAPI/Dockerfile.dev** - 增强开发环境工具集 + +### 问题描述 +用户反馈生产环境Dockerfile和开发环境Dockerfile差异不够明显,开发环境需要更多实用的调试和开发工具。 + +### 解决方案 +为开发环境Dockerfile添加完整的开发工具集,包括网络诊断、系统监控、文件操作等工具。 + +### 新增工具 + +#### 1. 网络诊断工具 +- **tcpdump**:网络数据包分析 +- **nmap**:网络扫描和端口检测 +- **traceroute**:路由追踪 +- **dig**:DNS查询工具 +- **nslookup**:域名解析工具 +- **whois**:域名信息查询 + +#### 2. 系统监控工具 +- **lsof**:列出打开的文件和进程 +- **strace**:系统调用跟踪 +- **less**:文件查看器(支持分页) + +#### 3. 文件操作工具 +- **git**:版本控制工具 +- **tree**:目录树显示 +- **jq**:JSON处理工具 +- **unzip/zip**:压缩文件处理 + +#### 4. 开发环境特性 +- **启动脚本**:创建专门的开发环境启动脚本 +- **环境信息**:启动时显示可用的调试工具 +- **开发目录**:创建 `/opt/dev-tools` 目录 + +### 修改内容 + +#### 工具安装 +```dockerfile +RUN apt-get update && apt-get install -y \ + bash \ + curl \ + wget \ + vim \ + nano \ + htop \ + procps \ + net-tools \ + iputils-ping \ + telnet \ + git \ + tree \ + jq \ + less \ + lsof \ + strace \ + tcpdump \ + nmap \ + traceroute \ + dig \ + nslookup \ + whois \ + unzip \ + zip \ + && rm -rf /var/lib/apt/lists/* +``` + +#### 开发环境启动脚本 +```bash +#!/bin/bash +echo "==========================================" +echo "X1.WebAPI 开发环境启动" +echo "==========================================" +echo "环境: Development" +echo "端口: 12789" +echo "调试工具已安装:" +echo " - 网络工具: ping, telnet, netstat, tcpdump, nmap" +echo " - 系统工具: htop, ps, lsof, strace" +echo " - 文件工具: vim, nano, tree, git" +echo " - 网络诊断: dig, nslookup, traceroute" +echo "==========================================" +exec ./X1.WebAPI +``` + +### 工具使用示例 + +#### 网络诊断 +```bash +# 进入开发容器 +docker exec -it x1-webapi-dev-container /bin/bash + +# 网络扫描 +nmap localhost + +# 数据包分析 +tcpdump -i any -n + +# DNS查询 +dig google.com + +# 路由追踪 +traceroute google.com +``` + +#### 系统监控 +```bash +# 查看打开的文件 +lsof -i :12789 + +# 系统调用跟踪 +strace -p + +# 进程监控 +htop + +# 网络连接 +netstat -tulpn +``` + +#### 文件操作 +```bash +# 显示目录树 +tree /app + +# JSON处理 +echo '{"name":"test"}' | jq . + +# 文件查看 +less /app/logs/app-$(date +%Y-%m-%d).log +``` + +### 环境差异对比 + +| 特性 | 生产环境 | 开发环境 | +|------|----------|----------| +| 基础镜像 | `aspnet:8.0-jammy` | `aspnet:8.0-jammy` | +| 调试工具 | 基本工具(bash等) | 完整工具集(20+工具) | +| 启动方式 | 直接启动应用 | 显示工具信息后启动 | +| 环境变量 | Production | Development | +| 镜像大小 | 较小 | 较大(增加约200MB) | +| 安全风险 | 低 | 中等(更多工具) | + +### 开发环境优势 + +#### 调试能力 +- **网络问题**:tcpdump、nmap、traceroute +- **系统问题**:strace、lsof、htop +- **文件问题**:tree、git、jq +- **DNS问题**:dig、nslookup、whois + +#### 开发便利性 +- **启动信息**:清楚显示可用工具 +- **工具丰富**:覆盖大部分调试场景 +- **环境隔离**:与生产环境完全分离 + +#### 运维支持 +- **问题排查**:提供多种诊断工具 +- **性能分析**:htop、strace等性能工具 +- **网络分析**:完整的网络诊断套件 + +### 注意事项 +- **镜像大小**:开发环境镜像比生产环境大约增加200MB +- **安全考虑**:包含更多工具,安全风险相对较高 +- **使用场景**:仅用于开发和测试环境,不建议生产使用 +- **工具权限**:某些工具可能需要特殊权限(如tcpdump) + +### 部署建议 +- **开发阶段**:使用开发环境进行调试和测试 +- **测试阶段**:使用生产环境验证部署 +- **生产部署**:使用生产环境确保安全性和性能 + +#### 修改时间: +2025-01-16 + +#### 修改原因: +增强开发环境Dockerfile,添加完整的开发工具集,提供强大的调试和诊断能力,让开发环境和生产环境的差异更加明显,满足开发人员的调试需求。 \ No newline at end of file