# 后端启动配置问题修复 ## 问题描述 后端启动时报错: ``` 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。