Files
server/Dockerfile-server
2025-11-10 22:40:09 +08:00

111 lines
3.8 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Use Eclipse Temurin for both build and runtime stages
FROM eclipse-temurin:21-jdk AS builder
# 添加构建参数,默认使用标准模型
ARG VOSK_MODEL_SIZE=standard
# ===== 新增:替换为国内镜像源 =====
RUN sed -i 's@archive.ubuntu.com@mirrors.aliyun.com@g' /etc/apt/sources.list.d/ubuntu.sources 2>/dev/null || \
sed -i 's@archive.ubuntu.com@mirrors.aliyun.com@g' /etc/apt/sources.list 2>/dev/null || \
true
# 安装必要的构建工具
RUN apt-get update && apt-get install -y --no-install-recommends \
maven \
wget \
unzip \
curl \
&& rm -rf /var/lib/apt/lists/*
# ===== 新增:配置 Maven 使用阿里云镜像 =====
RUN mkdir -p /root/.m2 && \
cat > /root/.m2/settings.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>aliyun-maven</id>
<mirrorOf>central</mirrorOf>
<name>Aliyun Maven</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
</settings>
EOF
WORKDIR /build
# 复制源代码
COPY ./src ./src
COPY ./db ./db
COPY pom.xml ./
# 构建应用
RUN mvn -Dmaven.repo.local=/root/.m2/repository package -DskipTests
# 正确提取项目版本号 - 使用更精确的grep模式匹配项目版本而非父项目版本
RUN APP_VERSION=$(grep -A1 "<artifactId>xiaozhi.server</artifactId>" pom.xml | grep "<version>" | sed -e 's/<version>//' -e 's/<\/version>//' -e 's/[[:space:]]//g') && \
echo "APP_VERSION=${APP_VERSION}" > /build/app_version.env && \
cat /build/app_version.env
# 确保模型目录存在
RUN mkdir -p /build/models
# 复制模型文件
COPY ./models/silero_vad.onnx /build/models/silero_vad.onnx
# 下载并准备Vosk模型
RUN mkdir -p /vosk_cache && \
if [ "$VOSK_MODEL_SIZE" = "small" ]; then \
if [ ! -d "/vosk_cache/vosk-model-small-cn-0.22" ]; then \
echo "Downloading small Vosk model..." && \
cd /vosk_cache && \
wget https://alphacephei.com/vosk/models/vosk-model-small-cn-0.22.zip && \
unzip vosk-model-small-cn-0.22.zip && \
rm vosk-model-small-cn-0.22.zip; \
else \
echo "Using cached small Vosk model"; \
fi && \
cp -r /vosk_cache/vosk-model-small-cn-0.22 /build/models/vosk-model; \
else \
if [ ! -d "/vosk_cache/vosk-model-cn-0.22" ]; then \
echo "Downloading standard Vosk model..." && \
cd /vosk_cache && \
wget https://alphacephei.com/vosk/models/vosk-model-cn-0.22.zip && \
unzip vosk-model-cn-0.22.zip && \
rm vosk-model-cn-0.22.zip; \
else \
echo "Using cached standard Vosk model"; \
fi && \
cp -r /vosk_cache/vosk-model-cn-0.22 /build/models/vosk-model; \
fi
# 使用更小的JRE镜像作为运行时环境
FROM eclipse-temurin:21-jre
# 安装必要的运行时依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
ffmpeg \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# 复制构建阶段的JAR文件和版本信息
COPY --from=builder /build/target/xiaozhi.server-*.jar /app/
COPY --from=builder /build/app_version.env /app/
# 复制模型文件夹
COPY --from=builder /build/models /app/models
# 设置启动脚本 - 使用 . 代替 source并确保使用 bash
RUN echo '#!/bin/bash\n\
if [ -f /app/app_version.env ]; then\n\
. /app/app_version.env\n\
fi\n\
echo "Starting application version: ${APP_VERSION}"\n\
java -Xms512m -Xmx1024m -jar /app/xiaozhi.server-${APP_VERSION}.jar\n\
' > /app/start.sh && chmod +x /app/start.sh
# 使用 bash 执行启动脚本
CMD ["/bin/bash", "/app/start.sh"]