Skip to content

Commit 5b02fbd

Browse files
committed
fix: 修复Docker部署问题
- 修复JVM参数格式错误,移除有问题的日志格式配置 - 创建docker-build目录解决.dockerignore排除问题 - 更新健康检查端点为/api/v1/status - 添加Docker部署脚本(deploy-docker.sh) - 创建简单的docker-compose配置 - 清理.env.docker文件,移除JVM参数 - 添加Dockerfile.simple作为备用方案
1 parent fe66952 commit 5b02fbd

File tree

9 files changed

+397
-66
lines changed

9 files changed

+397
-66
lines changed

.env.docker

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,9 @@
1-
# Docker部署环境变量配置
2-
# 复制此文件为.env并在部署前修改
3-
4-
# ========== 应用配置 ==========
5-
# 主机端口映射
6-
HOST_PORT=8080
7-
8-
# AI服务配置
9-
AI_API_KEY=your_deepseek_api_key_here
10-
AI_MODEL=deepseek-chat
1+
# Docker环境配置
2+
AI_API_KEY=sk-1899062c03f640f090129c4692ccc26f
113
AI_BASE_URL=https://api.deepseek.com
12-
AI_TIMEOUT=30000
4+
AI_MODEL=deepseek-chat
135
AI_MAX_TOKENS=1000
14-
AI_ENABLED=true
15-
16-
# ========== 数据库配置(可选) ==========
17-
DB_PASSWORD=ai_password
18-
DB_PORT=5432
19-
20-
# ========== Redis配置(可选) ==========
21-
REDIS_PORT=6379
22-
23-
# ========== 监控配置(可选) ==========
24-
GRAFANA_PASSWORD=admin
25-
26-
# ========== 高级配置 ==========
27-
# JVM参数
28-
JAVA_OPTS=-Xmx512m -Xms256m -XX:+UseG1GC
29-
30-
# 时区
31-
TZ=Asia/Shanghai
6+
AI_TIMEOUT=30000
327

33-
# 日志级别
34-
LOGGING_LEVEL_ROOT=INFO
8+
SERVER_PORT=8080
9+
SPRING_PROFILES_ACTIVE=docker

.env.docker.clean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Docker环境配置
2+
AI_API_KEY=sk-1899062c03f640f090129c4692ccc26f
3+
AI_BASE_URL=https://api.deepseek.com
4+
AI_MODEL=deepseek-chat
5+
AI_MAX_TOKENS=1000
6+
AI_TIMEOUT=30000
7+
8+
SERVER_PORT=8080
9+
SPRING_PROFILES_ACTIVE=docker

Dockerfile

Lines changed: 8 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,4 @@
1-
# Java AI Starter - Dockerfile
2-
# 多阶段构建,优化镜像大小
3-
4-
# 第一阶段:构建阶段
5-
FROM maven:3.8.4-openjdk-17-slim AS builder
6-
7-
WORKDIR /app
8-
9-
# 复制Maven配置文件
10-
COPY pom.xml .
11-
COPY .mvn .mvn
12-
COPY mvnw .
13-
14-
# 下载依赖(利用Docker缓存)
15-
RUN mvn dependency:go-offline -B
16-
17-
# 复制源代码
18-
COPY src src
19-
20-
# 构建应用
21-
RUN mvn clean package -DskipTests
22-
23-
# 第二阶段:运行阶段
1+
# 简单的Dockerfile - 使用现有jar文件
242
FROM eclipse-temurin:17-jre
253

264
# 设置时区
@@ -32,8 +10,12 @@ RUN groupadd -r appuser && useradd -r -g appuser appuser
3210

3311
WORKDIR /app
3412

35-
# 从构建阶段复制jar文件
36-
COPY --from=builder /app/target/java-ai-starter-*.jar app.jar
13+
# 复制jar文件
14+
COPY ./target/java-ai-starter-*.jar app.jar
15+
16+
# 复制启动脚本
17+
COPY docker-entrypoint.sh /usr/local/bin/
18+
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
3719

3820
# 创建必要的目录
3921
RUN mkdir -p /app/logs /app/config && \
@@ -44,19 +26,11 @@ USER appuser
4426

4527
# 健康检查
4628
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
47-
CMD curl -f http://localhost:8080/api/health || exit 1
29+
CMD curl -f http://localhost:8080/api/v1/status || exit 1
4830

4931
# 暴露端口
5032
EXPOSE 8080
5133

52-
# 设置环境变量
53-
ENV JAVA_OPTS="-Xmx512m -Xms256m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
54-
ENV SPRING_PROFILES_ACTIVE="docker"
55-
56-
# 入口点脚本
57-
COPY docker-entrypoint.sh /usr/local/bin/
58-
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
59-
6034
# 入口点
6135
ENTRYPOINT ["docker-entrypoint.sh"]
6236

Dockerfile.simple

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# 简单的Dockerfile - 使用现有jar文件
2+
FROM eclipse-temurin:17-jre
3+
4+
# 设置时区
5+
ENV TZ=Asia/Shanghai
6+
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
7+
8+
# 创建非root用户
9+
RUN groupadd -r appuser && useradd -r -g appuser appuser
10+
11+
WORKDIR /app
12+
13+
# 复制jar文件
14+
COPY target/java-ai-starter-*.jar app.jar
15+
16+
# 复制启动脚本
17+
COPY docker-entrypoint.sh /usr/local/bin/
18+
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
19+
20+
# 创建必要的目录
21+
RUN mkdir -p /app/logs /app/config && \
22+
chown -R appuser:appuser /app
23+
24+
# 切换到非root用户
25+
USER appuser
26+
27+
# 健康检查
28+
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
29+
CMD curl -f http://localhost:8080/api/v1/status || exit 1
30+
31+
# 暴露端口
32+
EXPOSE 8080
33+
34+
# 入口点
35+
ENTRYPOINT ["docker-entrypoint.sh"]
36+
37+
# 默认命令
38+
CMD ["java", "-jar", "app.jar"]

deploy-docker.sh

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
#!/bin/bash
2+
# Docker部署脚本
3+
4+
set -e
5+
6+
echo "🚀 Java AI Starter Docker部署"
7+
echo "=============================="
8+
9+
# 颜色定义
10+
RED='\033[0;31m'
11+
GREEN='\033[0;32m'
12+
YELLOW='\033[1;33m'
13+
BLUE='\033[0;34m'
14+
NC='\033[0m' # No Color
15+
16+
# 检查Docker
17+
check_docker() {
18+
if ! command -v docker &> /dev/null; then
19+
echo -e "${RED}❌ Docker未安装${NC}"
20+
exit 1
21+
fi
22+
echo -e "${GREEN}✅ Docker已安装${NC}"
23+
}
24+
25+
# 检查环境文件
26+
check_env() {
27+
if [ ! -f ".env.docker" ]; then
28+
echo -e "${YELLOW}⚠️ 未找到.env.docker文件${NC}"
29+
echo "创建默认环境文件..."
30+
cat > .env.docker << EOF
31+
# Docker环境配置
32+
AI_API_KEY=sk-1899062c03f640f090129c4692ccc26f
33+
AI_BASE_URL=https://api.deepseek.com
34+
AI_MODEL=deepseek-chat
35+
AI_MAX_TOKENS=1000
36+
AI_TIMEOUT=30000
37+
38+
SERVER_PORT=8080
39+
SPRING_PROFILES_ACTIVE=docker
40+
41+
# 数据库配置(可选)
42+
# DB_HOST=postgres
43+
# DB_PORT=5432
44+
# DB_PASSWORD=ai_password
45+
46+
# Redis配置(可选)
47+
# REDIS_HOST=redis
48+
# REDIS_PORT=6379
49+
EOF
50+
echo -e "${GREEN}✅ 已创建.env.docker文件${NC}"
51+
fi
52+
53+
# 加载环境变量(排除包含特殊字符的行)
54+
if [ -f ".env.docker" ]; then
55+
echo "加载环境变量..."
56+
# 只加载简单的KEY=VALUE行,排除包含JVM参数的行
57+
while IFS= read -r line; do
58+
# 跳过注释和空行
59+
[[ "$line" =~ ^#.*$ ]] && continue
60+
[[ -z "$line" ]] && continue
61+
# 跳过包含JVM参数的行
62+
[[ "$line" =~ .*=.*-Xmx.* ]] && continue
63+
[[ "$line" =~ .*=.*-Xms.* ]] && continue
64+
[[ "$line" =~ .*=.*-XX:.* ]] && continue
65+
66+
# 导出有效的环境变量
67+
export "$line" 2>/dev/null || echo "跳过: $line"
68+
done < .env.docker
69+
fi
70+
}
71+
72+
# 构建Docker镜像
73+
build_image() {
74+
echo -e "${BLUE}🔨 构建Docker镜像...${NC}"
75+
docker build -t java-ai-starter:latest .
76+
77+
if [ $? -eq 0 ]; then
78+
echo -e "${GREEN}✅ Docker镜像构建成功${NC}"
79+
else
80+
echo -e "${RED}❌ Docker镜像构建失败${NC}"
81+
exit 1
82+
fi
83+
}
84+
85+
# 运行Docker容器
86+
run_container() {
87+
echo -e "${BLUE}🐳 启动Docker容器...${NC}"
88+
89+
# 停止并删除现有容器
90+
if docker ps -a | grep -q "java-ai-starter"; then
91+
echo "停止现有容器..."
92+
docker stop java-ai-starter 2>/dev/null || true
93+
docker rm java-ai-starter 2>/dev/null || true
94+
fi
95+
96+
# 运行新容器
97+
docker run -d \
98+
--name java-ai-starter \
99+
--restart unless-stopped \
100+
-p ${SERVER_PORT:-8080}:8080 \
101+
-e AI_API_KEY="${AI_API_KEY}" \
102+
-e AI_BASE_URL="${AI_BASE_URL:-https://api.deepseek.com}" \
103+
-e AI_MODEL="${AI_MODEL:-deepseek-chat}" \
104+
-e AI_MAX_TOKENS="${AI_MAX_TOKENS:-1000}" \
105+
-e AI_TIMEOUT="${AI_TIMEOUT:-30000}" \
106+
-e SPRING_PROFILES_ACTIVE="${SPRING_PROFILES_ACTIVE:-docker}" \
107+
-e SERVER_PORT=8080 \
108+
-v $(pwd)/logs:/app/logs \
109+
-v $(pwd)/config:/app/config \
110+
java-ai-starter:latest
111+
112+
if [ $? -eq 0 ]; then
113+
echo -e "${GREEN}✅ Docker容器启动成功${NC}"
114+
else
115+
echo -e "${RED}❌ Docker容器启动失败${NC}"
116+
exit 1
117+
fi
118+
}
119+
120+
# 检查容器状态
121+
check_status() {
122+
echo -e "${BLUE}🔍 检查容器状态...${NC}"
123+
124+
sleep 3
125+
126+
# 检查容器是否运行
127+
if docker ps | grep -q "java-ai-starter"; then
128+
echo -e "${GREEN}✅ 容器正在运行${NC}"
129+
else
130+
echo -e "${RED}❌ 容器未运行${NC}"
131+
docker logs java-ai-starter --tail 20
132+
exit 1
133+
fi
134+
135+
# 检查健康状态
136+
echo "等待应用启动..."
137+
sleep 5
138+
139+
# 测试API
140+
local max_attempts=10
141+
local attempt=1
142+
143+
while [ $attempt -le $max_attempts ]; do
144+
echo "尝试 $attempt/$max_attempts..."
145+
if curl -s http://localhost:${SERVER_PORT:-8080}/api/v1/ping > /dev/null 2>&1; then
146+
echo -e "${GREEN}✅ API响应正常${NC}"
147+
break
148+
fi
149+
150+
if [ $attempt -eq $max_attempts ]; then
151+
echo -e "${RED}❌ API未响应${NC}"
152+
docker logs java-ai-starter --tail 30
153+
exit 1
154+
fi
155+
156+
sleep 5
157+
((attempt++))
158+
done
159+
}
160+
161+
# 显示部署信息
162+
show_info() {
163+
local port=${SERVER_PORT:-8080}
164+
165+
echo ""
166+
echo -e "${GREEN}🎉 部署完成!${NC}"
167+
echo "========================"
168+
echo "📊 部署信息:"
169+
echo " - 容器名称: java-ai-starter"
170+
echo " - 主机端口: $port"
171+
echo " - 容器端口: 8080"
172+
echo " - 镜像标签: java-ai-starter:latest"
173+
echo ""
174+
echo "🌐 访问地址:"
175+
echo " - http://localhost:$port"
176+
echo ""
177+
echo "📋 测试命令:"
178+
echo " curl http://localhost:$port/api/v1/ping"
179+
echo " curl -X POST http://localhost:$port/api/v1/chat/text \\"
180+
echo " -H \"Content-Type: application/json\" \\"
181+
echo " -d '{\"message\":\"你好\"}'"
182+
echo ""
183+
echo "🔧 管理命令:"
184+
echo " # 查看日志"
185+
echo " docker logs -f java-ai-starter"
186+
echo ""
187+
echo " # 进入容器"
188+
echo " docker exec -it java-ai-starter sh"
189+
echo ""
190+
echo " # 停止容器"
191+
echo " docker stop java-ai-starter"
192+
echo ""
193+
echo " # 删除容器"
194+
echo " docker rm java-ai-starter"
195+
echo ""
196+
echo " # 删除镜像"
197+
echo " docker rmi java-ai-starter:latest"
198+
}
199+
200+
# 主函数
201+
main() {
202+
check_docker
203+
check_env
204+
build_image
205+
run_container
206+
check_status
207+
show_info
208+
}
209+
210+
# 执行主函数
211+
main "$@"

0 commit comments

Comments
 (0)