This commit is contained in:
2025-11-01 15:24:04 +08:00
parent 68d434e3c4
commit fb590926e7
10 changed files with 365 additions and 13 deletions

View File

@@ -4,6 +4,9 @@ target/test-classes/
target/maven-archiver/ target/maven-archiver/
target/maven-status/ target/maven-status/
# settings.xml需要复制到构建容器中所以不忽略
# settings.xml
# IDE文件 # IDE文件
.idea/ .idea/
.vscode/ .vscode/

View File

@@ -5,17 +5,22 @@ FROM maven:3.8.4-openjdk-8-slim AS builder
# 设置工作目录 # 设置工作目录
WORKDIR /build WORKDIR /build
# 复制pom.xml文件 # 复制settings.xml和pom.xml文件
COPY settings.xml /root/.m2/
COPY pom.xml . COPY pom.xml .
# 下载依赖利用Docker缓存层 # 设置Maven仓库权限
RUN mvn dependency:go-offline -B RUN mkdir -p /root/.m2/repository && \
chown -R root:root /root/.m2
# 下载依赖利用Docker缓存层和国内镜像
RUN mvn dependency:go-offline -B -s /root/.m2/settings.xml
# 复制源代码 # 复制源代码
COPY src ./src COPY src ./src
# 构建应用 # 构建应用(使用国内镜像加速)
RUN mvn clean package -DskipTests -B RUN mvn clean package -DskipTests -B -s /root/.m2/settings.xml
# ===== 运行阶段 ===== # ===== 运行阶段 =====
# 使用OpenJDK 8作为基础镜像 # 使用OpenJDK 8作为基础镜像

93
Dockerfile.optimized Normal file
View File

@@ -0,0 +1,93 @@
# ===== 构建阶段 =====
# 使用更轻量的Maven镜像
FROM maven:3.8.4-openjdk-8-alpine AS builder
# 安装必要的工具
RUN apk add --no-cache curl bash
# 设置工作目录
WORKDIR /build
# 复制settings.xml和pom.xml文件
COPY settings.xml /root/.m2/
COPY pom.xml .
# 设置Maven仓库权限
RUN mkdir -p /root/.m2/repository && \
chown -R root:root /root/.m2
# 创建Maven配置目录
RUN mkdir -p /root/.m2
# 配置Maven wrapper如果项目有使用
# COPY .mvn/wrapper/maven-wrapper.jar /root/.m2/wrapper/
# COPY .mvn/wrapper/maven-wrapper.properties /root/.m2/wrapper/
# 下载依赖利用Docker缓存层和国内镜像
RUN mvn dependency:go-offline -B -s /root/.m2/settings.xml
# 复制源代码
COPY src ./src
# 构建应用(使用国内镜像加速)
RUN mvn clean package -DskipTests -B -s /root/.m2/settings.xml
# ===== 运行阶段 =====
# 使用OpenJDK 8作为基础镜像
FROM openjdk:8-jre-alpine AS runtime
# 设置维护者信息
LABEL maintainer="digital-archive-team"
# 安装必要的系统依赖和Tesseract OCR
RUN apk add --no-cache \
tesseract \
tesseract-data-chi_sim \
tesseract-data-chi_tra \
tesseract-data-eng \
tesseract-ocr \
tini \
curl \
bash \
&& rm -rf /var/cache/apk/*
# 设置环境变量
ENV JAVA_OPTS="-Xmx2g -Xms1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
ENV SPRING_PROFILES_ACTIVE=prod
# 创建应用用户和目录
RUN addgroup -g 1001 app \
&& adduser -D -s /bin/sh -u 1001 -G app app \
&& mkdir -p /app/data/upload \
&& mkdir -p /app/data/temp \
&& mkdir -p /app/data/unzip \
&& mkdir -p /app/data/images \
&& mkdir -p /app/data/reports \
&& mkdir -p /app/data/elasticsearch \
&& mkdir -p /app/logs \
&& chown -R app:app /app
# 设置工作目录
WORKDIR /app
# 从构建阶段复制jar文件
COPY --from=builder /build/target/point-strategy-*.jar app.jar
# 复制配置文件(如果需要覆盖默认配置)
# COPY application-prod.yml application-prod.yml
# 切换到非root用户
USER app
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f http://localhost:9081/point-strategy/actuator/health || exit 1
# 暴露端口
EXPOSE 9081
# 使用tini作为init进程
ENTRYPOINT ["/sbin/tini", "--"]
# 启动应用
CMD ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

View File

@@ -73,6 +73,22 @@ else
echo -e "${YELLOW}请确保Redis容器已连接到 ${NETWORK_NAME} 网络${NC}" echo -e "${YELLOW}请确保Redis容器已连接到 ${NETWORK_NAME} 网络${NC}"
fi fi
# 检查Elasticsearch容器是否在proxy网络中
echo -e "${YELLOW}检查Elasticsearch容器...${NC}"
ES_CONTAINERS=$(docker network inspect ${NETWORK_NAME} --format '{{range .Containers}}{{.Name}} {{end}}' | tr ' ' '\n' | grep -i elasticsearch || true)
if [ ! -z "$ES_CONTAINERS" ]; then
echo -e "${GREEN}找到Elasticsearch容器:${NC}"
echo "$ES_CONTAINERS" | while read container; do
if [ ! -z "$container" ]; then
echo -e "${GREEN} - ${container}${NC}"
fi
done
else
echo -e "${RED}未找到Elasticsearch容器${NC}"
echo -e "${YELLOW}请确保Elasticsearch容器已连接到 ${NETWORK_NAME} 网络${NC}"
fi
# 测试网络连通性 # 测试网络连通性
echo -e "${YELLOW}测试网络连通性...${NC}" echo -e "${YELLOW}测试网络连通性...${NC}"
if docker run --rm --network ${NETWORK_NAME} alpine ping -c 1 mysql &> /dev/null; then if docker run --rm --network ${NETWORK_NAME} alpine ping -c 1 mysql &> /dev/null; then
@@ -87,4 +103,10 @@ else
echo -e "${RED}无法ping通redis容器${NC}" echo -e "${RED}无法ping通redis容器${NC}"
fi fi
if docker run --rm --network ${NETWORK_NAME} alpine ping -c 1 elasticsearch &> /dev/null; then
echo -e "${GREEN}可以ping通elasticsearch容器${NC}"
else
echo -e "${RED}无法ping通elasticsearch容器${NC}"
fi
echo -e "${GREEN}网络检查完成!${NC}" echo -e "${GREEN}网络检查完成!${NC}"

View File

@@ -53,7 +53,7 @@ fi
# 创建必要的目录 # 创建必要的目录
echo -e "${YELLOW}创建部署目录...${NC}" echo -e "${YELLOW}创建部署目录...${NC}"
mkdir -p ${DEPLOY_DIR}/{data/{upload,temp,unzip,images,reports},logs,nginx} mkdir -p ${DEPLOY_DIR}/{data/{upload,temp,unzip,images,reports,elasticsearch},logs,nginx}
# 复制配置文件 # 复制配置文件
echo -e "${YELLOW}复制配置文件...${NC}" echo -e "${YELLOW}复制配置文件...${NC}"
@@ -81,6 +81,9 @@ REDIS_HOST=redis
REDIS_PORT=6379 REDIS_PORT=6379
REDIS_PASSWORD=Abc123456 REDIS_PASSWORD=Abc123456
# Elasticsearch配置
ELASTICSEARCH_URIS=http://elasticsearch:9200
# OCR配置 # OCR配置
TESS_PATH=/usr/bin/tesseract TESS_PATH=/usr/bin/tesseract
@@ -219,6 +222,8 @@ services:
- ./logs:/app/logs - ./logs:/app/logs
env_file: env_file:
- .env - .env
depends_on:
- elasticsearch
networks: networks:
- proxy - proxy
restart: unless-stopped restart: unless-stopped
@@ -229,6 +234,28 @@ services:
retries: 3 retries: 3
start_period: 60s start_period: 60s
elasticsearch:
image: elasticsearch:7.17.0
container_name: digital-archive-elasticsearch
ports:
- "9200:9200"
- "9300:9300"
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.enabled=false
volumes:
- ./data/elasticsearch:/usr/share/elasticsearch/data
networks:
- proxy
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
networks: networks:
proxy: proxy:
external: true external: true

View File

@@ -44,6 +44,23 @@ services:
retries: 3 retries: 3
start_period: 60s start_period: 60s
# Elasticsearch服务
elasticsearch:
image: elasticsearch:7.17.0
container_name: digital-archive-elasticsearch
ports:
- "9200:9200"
- "9300:9300"
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.enabled=false
volumes:
- ./data/elasticsearch:/usr/share/elasticsearch/data
networks:
- proxy
restart: unless-stopped
networks: networks:
proxy: proxy:
external: true external: true

View File

@@ -68,8 +68,18 @@ if [ -z "$REDIS_CONTAINER" ]; then
fi fi
echo -e "${GREEN}找到Redis容器: ${REDIS_CONTAINER}${NC}" echo -e "${GREEN}找到Redis容器: ${REDIS_CONTAINER}${NC}"
# 6. 检查镜像 # 6. 检查Elasticsearch容器
echo -e "${YELLOW}6. 检查应用镜像...${NC}" echo -e "${YELLOW}6. 检查Elasticsearch容器...${NC}"
ES_CONTAINER=$(docker network inspect proxy --format '{{range .Containers}}{{.Name}} {{end}}' | tr ' ' '\n' | grep -i elasticsearch | head -1 || true)
if [ -z "$ES_CONTAINER" ]; then
echo -e "${RED}错误: proxy网络中未找到Elasticsearch容器${NC}"
echo -e "${YELLOW}请确保Elasticsearch容器已启动并连接到proxy网络${NC}"
exit 1
fi
echo -e "${GREEN}找到Elasticsearch容器: ${ES_CONTAINER}${NC}"
# 7. 检查镜像
echo -e "${YELLOW}7. 检查应用镜像...${NC}"
if ! docker images | grep -q digital-archive; then if ! docker images | grep -q digital-archive; then
echo -e "${RED}错误: digital-archive镜像不存在${NC}" echo -e "${RED}错误: digital-archive镜像不存在${NC}"
echo -e "${YELLOW}请先运行: ./build.sh${NC}" echo -e "${YELLOW}请先运行: ./build.sh${NC}"
@@ -77,8 +87,8 @@ if ! docker images | grep -q digital-archive; then
fi fi
echo -e "${GREEN}digital-archive镜像存在${NC}" echo -e "${GREEN}digital-archive镜像存在${NC}"
# 7. 检查部署目录 # 8. 检查部署目录
echo -e "${YELLOW}7. 检查部署目录...${NC}" echo -e "${YELLOW}8. 检查部署目录...${NC}"
if [ -d "$DEPLOY_DIR" ]; then if [ -d "$DEPLOY_DIR" ]; then
echo -e "${YELLOW}部署目录已存在: ${DEPLOY_DIR}${NC}" echo -e "${YELLOW}部署目录已存在: ${DEPLOY_DIR}${NC}"
read -p "是否继续部署到现有目录? (y/N): " -n 1 -r read -p "是否继续部署到现有目录? (y/N): " -n 1 -r
@@ -91,8 +101,8 @@ else
echo -e "${GREEN}创建新部署目录: ${DEPLOY_DIR}${NC}" echo -e "${GREEN}创建新部署目录: ${DEPLOY_DIR}${NC}"
fi fi
# 8. 测试网络连通性 # 9. 测试网络连通性
echo -e "${YELLOW}8. 测试网络连通性...${NC}" echo -e "${YELLOW}9. 测试网络连通性...${NC}"
if docker run --rm --network proxy alpine ping -c 1 mysql &> /dev/null; then if docker run --rm --network proxy alpine ping -c 1 mysql &> /dev/null; then
echo -e "${GREEN}可以连接MySQL容器${NC}" echo -e "${GREEN}可以连接MySQL容器${NC}"
else else
@@ -107,11 +117,19 @@ else
exit 1 exit 1
fi fi
# 9. 显示部署信息 if docker run --rm --network proxy alpine ping -c 1 elasticsearch &> /dev/null; then
echo -e "${GREEN}可以连接Elasticsearch容器${NC}"
else
echo -e "${RED}无法连接Elasticsearch容器${NC}"
exit 1
fi
# 10. 显示部署信息
echo -e "${GREEN}=== 部署信息 ===${NC}" echo -e "${GREEN}=== 部署信息 ===${NC}"
echo -e "${YELLOW}部署目录: ${DEPLOY_DIR}${NC}" echo -e "${YELLOW}部署目录: ${DEPLOY_DIR}${NC}"
echo -e "${YELLOW}MySQL容器: ${MYSQL_CONTAINER}${NC}" echo -e "${YELLOW}MySQL容器: ${MYSQL_CONTAINER}${NC}"
echo -e "${YELLOW}Redis容器: ${REDIS_CONTAINER}${NC}" echo -e "${YELLOW}Redis容器: ${REDIS_CONTAINER}${NC}"
echo -e "${YELLOW}Elasticsearch容器: ${ES_CONTAINER}${NC}"
echo -e "${YELLOW}网络: proxy${NC}" echo -e "${YELLOW}网络: proxy${NC}"
echo -e "${YELLOW}Docker Compose: ${COMPOSE_CMD}${NC}" echo -e "${YELLOW}Docker Compose: ${COMPOSE_CMD}${NC}"

157
settings.xml Normal file
View File

@@ -0,0 +1,157 @@
<?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">
<!-- 本地仓库位置 -->
<localRepository>/root/.m2/repository</localRepository>
<!-- 代理配置 -->
<proxies>
<!-- 如果需要HTTP代理取消注释并配置 -->
<!--
<proxy>
<id>optional-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>proxy.host.com</host>
<port>8080</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
-->
</proxies>
<!-- 镜像配置 -->
<mirrors>
<!-- 阿里云Maven镜像 -->
<mirror>
<id>aliyun-maven</id>
<mirrorOf>central</mirrorOf>
<name>Aliyun Maven Mirror</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<!-- 华为云Maven镜像 -->
<mirror>
<id>huaweicloud-maven</id>
<mirrorOf>central</mirrorOf>
<name>HuaweiCloud Maven Mirror</name>
<url>https://repo.huaweicloud.com/repository/maven/</url>
</mirror>
<!-- 腾讯云Maven镜像 -->
<mirror>
<id>tencentyun-maven</id>
<mirrorOf>central</mirrorOf>
<name>TencentCloud Maven Mirror</name>
<url>https://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
</mirror>
<!-- 网易云Maven镜像 -->
<mirror>
<id>netease-maven</id>
<mirrorOf>central</mirrorOf>
<name>Netease Maven Mirror</name>
<url>https://mirrors.163.com/maven/repository/maven-public/</url>
</mirror>
<!-- JBoss镜像 -->
<mirror>
<id>jboss-public-repository-group</id>
<mirrorOf>central</mirrorOf>
<name>JBoss Public Repository Group</name>
<url>https://repository.jboss.org/nexus/content/groups/public/</url>
</mirror>
</mirrors>
<!-- 服务器认证配置 -->
<servers>
<!-- 如果需要私有仓库认证,在这里配置 -->
<!--
<server>
<id>private-repo</id>
<username>your-username</username>
<password>your-password</password>
</server>
-->
</servers>
<!-- 配置文件 -->
<profiles>
<!-- 默认配置 -->
<profile>
<id>default</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<!-- 阿里云仓库 -->
<repository>
<id>aliyun-central</id>
<url>https://maven.aliyun.com/repository/central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<!-- 阿里云公共仓库 -->
<repository>
<id>aliyun-public</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<!-- Spring仓库 -->
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!-- 阿里云插件仓库 -->
<pluginRepository>
<id>aliyun-plugin</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<!-- Spring插件仓库 -->
<pluginRepository>
<id>spring-plugins</id>
<name>Spring Plugins</name>
<url>https://repo.spring.io/plugins-release</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<!-- 激活的配置 -->
<activeProfiles>
<activeProfile>default</activeProfile>
</activeProfiles>
</settings>

View File

@@ -36,6 +36,11 @@ spring:
max-file-size: -1 max-file-size: -1
max-request-size: -1 max-request-size: -1
# Elasticsearch配置
elasticsearch:
rest:
uris: http://127.0.0.1:9200
# MyBatis配置 # MyBatis配置
mybatis: mybatis:
mapper-locations: classpath:mapper/*.xml mapper-locations: classpath:mapper/*.xml

View File

@@ -36,6 +36,11 @@ spring:
max-file-size: ${MAX_FILE_SIZE:-1} max-file-size: ${MAX_FILE_SIZE:-1}
max-request-size: ${MAX_REQUEST_SIZE:-1} max-request-size: ${MAX_REQUEST_SIZE:-1}
# Elasticsearch配置
elasticsearch:
rest:
uris: ${ELASTICSEARCH_URIS:http://127.0.0.1:9200}
# MyBatis配置 # MyBatis配置
mybatis: mybatis:
mapper-locations: classpath:mapper/*.xml mapper-locations: classpath:mapper/*.xml