185 lines
4.0 KiB
Markdown
185 lines
4.0 KiB
Markdown
|
|
# 后端启动配置问题修复
|
|||
|
|
|
|||
|
|
## 问题描述
|
|||
|
|
|
|||
|
|
后端启动时报错:
|
|||
|
|
```
|
|||
|
|
Could not resolve placeholder 'spring.datasource.druid.initialSize'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 原因分析
|
|||
|
|
|
|||
|
|
若依项目使用了 Druid 数据源,配置在 `application-druid.yml` 中。环境变量无法直接覆盖 Druid 的嵌套配置属性。
|
|||
|
|
|
|||
|
|
## 解决方案
|
|||
|
|
|
|||
|
|
### 1. 创建启动脚本
|
|||
|
|
|
|||
|
|
已创建 [entrypoint.sh](backend/entrypoint.sh),使用 Java 系统属性覆盖配置:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
#!/bin/sh
|
|||
|
|
|
|||
|
|
exec java \
|
|||
|
|
-Dspring.profiles.active=prod \
|
|||
|
|
-Dspring.datasource.druid.master.url="${SPRING_DATASOURCE_URL}" \
|
|||
|
|
-Dspring.datasource.druid.master.username="${SPRING_DATASOURCE_USERNAME}" \
|
|||
|
|
-Dspring.datasource.druid.master.password="${SPRING_DATASOURCE_PASSWORD}" \
|
|||
|
|
-Dspring.redis.host="${SPRING_REDIS_HOST}" \
|
|||
|
|
-Dspring.redis.port="${SPRING_REDIS_PORT}" \
|
|||
|
|
-jar app.jar
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 修改 Dockerfile
|
|||
|
|
|
|||
|
|
已修改 [backend/Dockerfile](backend/Dockerfile),使用启动脚本:
|
|||
|
|
|
|||
|
|
```dockerfile
|
|||
|
|
# 复制启动脚本
|
|||
|
|
COPY entrypoint.sh /entrypoint.sh
|
|||
|
|
RUN chmod +x /entrypoint.sh
|
|||
|
|
|
|||
|
|
# 启动应用
|
|||
|
|
ENTRYPOINT ["/entrypoint.sh"]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 重新部署
|
|||
|
|
|
|||
|
|
### 1. 停止并删除旧容器
|
|||
|
|
```bash
|
|||
|
|
docker stop wecom-backend
|
|||
|
|
docker rm wecom-backend
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 重新构建并启动
|
|||
|
|
```bash
|
|||
|
|
cd deploy
|
|||
|
|
docker compose up -d --build backend
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 查看日志
|
|||
|
|
```bash
|
|||
|
|
docker compose logs -f backend
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 验证启动成功
|
|||
|
|
|
|||
|
|
查看日志中是否有以下内容:
|
|||
|
|
```
|
|||
|
|
Started RuoYiApplication in X seconds
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 其他可能的问题
|
|||
|
|
|
|||
|
|
### 1. 数据库连接失败
|
|||
|
|
|
|||
|
|
检查 MySQL 容器是否允许远程连接:
|
|||
|
|
```bash
|
|||
|
|
docker exec -it mysql-jijin-test mysql -uroot -p
|
|||
|
|
|
|||
|
|
# 授权远程访问
|
|||
|
|
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'jiong1114';
|
|||
|
|
FLUSH PRIVILEGES;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 数据库不存在
|
|||
|
|
|
|||
|
|
创建数据库:
|
|||
|
|
```bash
|
|||
|
|
docker exec -it mysql-jijin-test mysql -uroot -pjiong1114
|
|||
|
|
|
|||
|
|
CREATE DATABASE IF NOT EXISTS `ry-vue` DEFAULT CHARACTER SET utf8mb4;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. Redis 连接失败
|
|||
|
|
|
|||
|
|
检查 Redis 是否允许远程连接:
|
|||
|
|
```bash
|
|||
|
|
docker exec -it redis redis-cli CONFIG GET bind
|
|||
|
|
|
|||
|
|
# 如果绑定了 127.0.0.1,需要修改
|
|||
|
|
docker exec -it redis redis-cli CONFIG SET bind "0.0.0.0"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 端口配置不匹配
|
|||
|
|
|
|||
|
|
注意 docker-compose.yml 中配置的是 8888 端口:
|
|||
|
|
```yaml
|
|||
|
|
ports:
|
|||
|
|
- "8888:8888" # 宿主机:容器
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
但 Dockerfile 暴露的是 8080 端口。需要修改其中一个保持一致。
|
|||
|
|
|
|||
|
|
#### 方案 A: 修改 docker-compose.yml(推荐)
|
|||
|
|
```yaml
|
|||
|
|
ports:
|
|||
|
|
- "8888:8080" # 宿主机 8888 映射到容器 8080
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 方案 B: 修改应用端口
|
|||
|
|
在 docker-compose.yml 中添加环境变量:
|
|||
|
|
```yaml
|
|||
|
|
environment:
|
|||
|
|
- SERVER_PORT=8888
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 完整的 docker-compose.yml 配置
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
version: '3.8'
|
|||
|
|
|
|||
|
|
services:
|
|||
|
|
backend:
|
|||
|
|
build:
|
|||
|
|
context: ./backend
|
|||
|
|
dockerfile: Dockerfile
|
|||
|
|
container_name: wecom-backend
|
|||
|
|
restart: always
|
|||
|
|
ports:
|
|||
|
|
- "8888:8080" # 宿主机 8888 映射到容器 8080
|
|||
|
|
volumes:
|
|||
|
|
- upload_data:/home/ruoyi/uploadPath
|
|||
|
|
environment:
|
|||
|
|
- SPRING_PROFILES_ACTIVE=prod
|
|||
|
|
- TZ=Asia/Shanghai
|
|||
|
|
- SPRING_DATASOURCE_URL=jdbc:mysql://host.docker.internal:3316/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
|||
|
|
- SPRING_DATASOURCE_USERNAME=root
|
|||
|
|
- SPRING_DATASOURCE_PASSWORD=jiong1114
|
|||
|
|
- SPRING_REDIS_HOST=host.docker.internal
|
|||
|
|
- SPRING_REDIS_PORT=6379
|
|||
|
|
- SPRING_REDIS_PASSWORD=
|
|||
|
|
extra_hosts:
|
|||
|
|
- "host.docker.internal:host-gateway"
|
|||
|
|
networks:
|
|||
|
|
- wecom-network
|
|||
|
|
healthcheck:
|
|||
|
|
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/"]
|
|||
|
|
interval: 30s
|
|||
|
|
timeout: 10s
|
|||
|
|
retries: 3
|
|||
|
|
|
|||
|
|
frontend:
|
|||
|
|
build:
|
|||
|
|
context: ./frontend
|
|||
|
|
dockerfile: Dockerfile
|
|||
|
|
container_name: wecom-frontend
|
|||
|
|
restart: always
|
|||
|
|
ports:
|
|||
|
|
- "8889:80"
|
|||
|
|
depends_on:
|
|||
|
|
- backend
|
|||
|
|
networks:
|
|||
|
|
- wecom-network
|
|||
|
|
|
|||
|
|
volumes:
|
|||
|
|
upload_data:
|
|||
|
|
driver: local
|
|||
|
|
|
|||
|
|
networks:
|
|||
|
|
wecom-network:
|
|||
|
|
driver: bridge
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
注意 healthcheck 中使用的是容器内部端口 8080。
|