🔧 端口配置动态化修复: - 修复generate-docker-compose.sh硬编码端口问题 - 支持客户自定义MySQL、Redis、大屏端口配置 - 自动读取custom-config.env配置文件 - 镜像版本自动同步到最新标签 🐳 Docker构建系统增强: - Maven阿里云镜像源配置,解决网络连接问题 - 增加构建超时配置,提高稳定性 - 优化多阶段构建流程 📋 镜像版本更新: - ljwx-boot: 1.2.16 → 1.3.3 - ljwx-bigscreen: 1.2.16 → 1.3.3 - ljwx-admin: 1.2.16 → 1.3.3 ✅ 修复的问题: - Docker构建过程中Maven依赖下载失败 - 客户部署时端口配置无法自定义 - docker-compose-generated.yml使用硬编码配置 - 镜像版本不同步问题 📚 文档更新: - 新增客户部署配置说明章节 - Docker构建优化详细说明 - 端口配置修复前后对比示例
236 lines
7.6 KiB
Bash
Executable File
236 lines
7.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# 动态生成docker-compose配置 #智能处理首次部署和升级部署
|
|
|
|
# 加载配置文件
|
|
CONFIG_FILE=${1:-"custom-config.env"}
|
|
if [ -f "$CONFIG_FILE" ]; then
|
|
. "$CONFIG_FILE"
|
|
echo "📋 已加载配置文件: $CONFIG_FILE"
|
|
else
|
|
echo "⚠️ 警告: 配置文件 $CONFIG_FILE 不存在,使用默认值"
|
|
fi
|
|
|
|
# 设置默认值
|
|
MYSQL_HOST=${MYSQL_HOST:-mysql}
|
|
MYSQL_PORT=${MYSQL_PORT:-3306}
|
|
MYSQL_USER=${MYSQL_USER:-root}
|
|
MYSQL_PASSWORD=${MYSQL_PASSWORD:-123456}
|
|
MYSQL_DATABASE=${MYSQL_DATABASE:-lj-06}
|
|
REDIS_HOST=${REDIS_HOST:-redis}
|
|
REDIS_PORT=${REDIS_PORT:-6379}
|
|
REDIS_PASSWORD=${REDIS_PASSWORD:-123456}
|
|
APP_PORT=${APP_PORT:-8001}
|
|
BIGSCREEN_PORT=${BIGSCREEN_PORT:-8001}
|
|
VITE_BIGSCREEN_URL=${VITE_BIGSCREEN_URL:-http://localhost:8001}
|
|
VITE_APP_TITLE=${VITE_APP_TITLE:-穿戴管理演示系统}
|
|
|
|
# 从原始docker-compose.yml读取镜像版本
|
|
MYSQL_IMAGE=$(egrep '^ *image:.*ljwx-mysql:' docker-compose.yml | sed 's/.*ljwx-mysql:\([^ ]*\).*/\1/' | head -1)
|
|
REDIS_IMAGE=$(egrep '^ *image:.*ljwx-redis:' docker-compose.yml | sed 's/.*ljwx-redis:\([^ ]*\).*/\1/' | head -1)
|
|
BOOT_IMAGE=$(egrep '^ *image:.*ljwx-boot:' docker-compose.yml | sed 's/.*ljwx-boot:\([^ ]*\).*/\1/' | head -1)
|
|
BIGSCREEN_IMAGE=$(egrep '^ *image:.*ljwx-bigscreen:' docker-compose.yml | sed 's/.*ljwx-bigscreen:\([^ ]*\).*/\1/' | head -1)
|
|
ADMIN_IMAGE=$(egrep '^ *image:.*ljwx-admin:' docker-compose.yml | sed 's/.*ljwx-admin:\([^ ]*\).*/\1/' | head -1)
|
|
|
|
echo "🔧 使用镜像版本: mysql:$MYSQL_IMAGE, redis:$REDIS_IMAGE, boot:$BOOT_IMAGE, bigscreen:$BIGSCREEN_IMAGE, admin:$ADMIN_IMAGE"
|
|
echo "🔧 使用端口配置: 大屏端口:$BIGSCREEN_PORT, MySQL端口:$MYSQL_PORT, Redis端口:$REDIS_PORT"
|
|
|
|
# 检查是否为首次部署
|
|
is_first_deployment() {
|
|
for volume in mysql_data redis_data ljwx_boot_data ljwx_bigscreen_data; do
|
|
if docker volume ls -q | grep -q "^client-deployment_${volume}$"; then
|
|
return 1 #不是首次部署
|
|
fi
|
|
done
|
|
return 0 #首次部署
|
|
}
|
|
|
|
# 生成MySQL服务配置
|
|
generate_mysql_config() {
|
|
local client_data_mount=""
|
|
|
|
# 只有首次部署且client-data.sql存在时才挂载
|
|
if is_first_deployment && [ -f "client-data.sql" ] && [ -s "client-data.sql" ]; then
|
|
client_data_mount=" - ./client-data.sql:/docker-entrypoint-initdb.d/client/data.sql:ro"
|
|
echo "📦 首次部署: 启用client-data.sql挂载"
|
|
else
|
|
echo "🔄 升级部署: 跳过client-data.sql挂载"
|
|
fi
|
|
|
|
cat > docker-compose-generated.yml << EOF
|
|
services:
|
|
mysql:
|
|
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:$MYSQL_IMAGE
|
|
container_name: ljwx-mysql
|
|
restart: unless-stopped
|
|
environment:
|
|
MYSQL_ROOT_PASSWORD: $MYSQL_PASSWORD
|
|
MYSQL_DATABASE: $MYSQL_DATABASE
|
|
MYSQL_CHARACTER_SET_SERVER: utf8mb4
|
|
MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci
|
|
TZ: Asia/Shanghai
|
|
ports:
|
|
- "$MYSQL_PORT:3306"
|
|
volumes:
|
|
- mysql_data:/var/lib/mysql
|
|
- ./logs/mysql:/var/log/mysql
|
|
- ./backup/mysql:/backup/mysql
|
|
$client_data_mount
|
|
command:
|
|
- --default-authentication-plugin=mysql_native_password
|
|
- --character-set-server=utf8mb4
|
|
- --collation-server=utf8mb4_unicode_ci
|
|
- --max_connections=200
|
|
- --wait_timeout=28800
|
|
- --interactive_timeout=28800
|
|
healthcheck:
|
|
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$MYSQL_PASSWORD"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 5
|
|
start_period: 60s
|
|
networks:
|
|
- ljwx-network
|
|
|
|
redis:
|
|
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-redis:$REDIS_IMAGE
|
|
container_name: ljwx-redis
|
|
restart: unless-stopped
|
|
ports:
|
|
- "$REDIS_PORT:6379"
|
|
volumes:
|
|
- redis_data:/data
|
|
- ./logs/redis:/var/log/redis
|
|
- ./backup/redis:/backup/redis
|
|
healthcheck:
|
|
test: ["CMD", "redis-cli", "ping"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
retries: 5
|
|
start_period: 30s
|
|
networks:
|
|
- ljwx-network
|
|
|
|
ljwx-boot:
|
|
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-boot:$BOOT_IMAGE
|
|
container_name: ljwx-boot
|
|
restart: unless-stopped
|
|
env_file:
|
|
- $CONFIG_FILE
|
|
environment:
|
|
SPRING_PROFILES_ACTIVE: common
|
|
MYSQL_HOST: $MYSQL_HOST
|
|
MYSQL_PORT: $MYSQL_PORT
|
|
MYSQL_USER: $MYSQL_USER
|
|
MYSQL_PASSWORD: $MYSQL_PASSWORD
|
|
MYSQL_DATABASE: $MYSQL_DATABASE
|
|
REDIS_HOST: $REDIS_HOST
|
|
REDIS_PORT: $REDIS_PORT
|
|
REDIS_PASSWORD: $REDIS_PASSWORD
|
|
TZ: Asia/Shanghai
|
|
SPRING_DATASOURCE_URL: jdbc:mysql://$MYSQL_HOST:$MYSQL_PORT/$MYSQL_DATABASE?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
|
|
SPRING_DATASOURCE_USERNAME: $MYSQL_USER
|
|
SPRING_DATASOURCE_PASSWORD: $MYSQL_PASSWORD
|
|
SPRING_DATASOURCE_DRIVER_CLASS_NAME: com.mysql.cj.jdbc.Driver
|
|
SPRING_DATA_REDIS_HOST: $REDIS_HOST
|
|
SPRING_DATA_REDIS_PORT: $REDIS_PORT
|
|
SPRING_DATA_REDIS_PASSWORD: $REDIS_PASSWORD
|
|
ports:
|
|
- "9998:9998"
|
|
volumes:
|
|
- ./logs/ljwx-boot:/app/ljwx-boot-logs
|
|
- ljwx_boot_data:/app/data
|
|
- ./backup/ljwx-boot:/backup/ljwx-boot
|
|
command: ["sh", "-c", "sleep 30 && java -jar /app/ljwx-boot-admin.jar"]
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:9998/actuator/health"]
|
|
interval: 60s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 120s
|
|
networks:
|
|
- ljwx-network
|
|
|
|
ljwx-bigscreen:
|
|
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-bigscreen:$BIGSCREEN_IMAGE
|
|
container_name: ljwx-bigscreen
|
|
restart: unless-stopped
|
|
env_file:
|
|
- $CONFIG_FILE
|
|
environment:
|
|
MYSQL_HOST: $MYSQL_HOST
|
|
MYSQL_PORT: $MYSQL_PORT
|
|
MYSQL_USER: $MYSQL_USER
|
|
MYSQL_PASSWORD: $MYSQL_PASSWORD
|
|
MYSQL_DATABASE: $MYSQL_DATABASE
|
|
REDIS_HOST: $REDIS_HOST
|
|
REDIS_PORT: $REDIS_PORT
|
|
REDIS_PASSWORD: $REDIS_PASSWORD
|
|
IS_DOCKER: "true"
|
|
APP_PORT: $APP_PORT
|
|
TZ: Asia/Shanghai
|
|
ports:
|
|
- "$BIGSCREEN_PORT:$APP_PORT"
|
|
volumes:
|
|
- ./custom-config.py:/app/config.py:ro
|
|
- ./custom-assets:/app/static/images:ro
|
|
- ./logs/ljwx-bigscreen:/app/logs
|
|
- ljwx_bigscreen_data:/app/data
|
|
- ./backup/ljwx-bigscreen:/backup/ljwx-bigscreen
|
|
command: ["sh", "-c", "sleep 45 && python app.py"]
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:$APP_PORT/health"]
|
|
interval: 60s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 90s
|
|
networks:
|
|
- ljwx-network
|
|
|
|
ljwx-admin:
|
|
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-admin:$ADMIN_IMAGE
|
|
container_name: ljwx-admin
|
|
restart: unless-stopped
|
|
env_file:
|
|
- $CONFIG_FILE
|
|
environment:
|
|
VITE_API_URL: http://ljwx-boot:9998
|
|
VITE_BIGSCREEN_URL: $VITE_BIGSCREEN_URL
|
|
VITE_APP_TITLE: $VITE_APP_TITLE
|
|
TZ: Asia/Shanghai
|
|
ports:
|
|
- "8080:80"
|
|
volumes:
|
|
- ./logs/ljwx-admin:/var/log/nginx
|
|
- ./custom-admin-config.js:/tmp/custom-admin-config.js:ro
|
|
command: ["sh", "-c", "sleep 60 && nginx -g 'daemon off;'"]
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:80/"]
|
|
interval: 60s
|
|
timeout: 5s
|
|
retries: 3
|
|
start_period: 60s
|
|
networks:
|
|
- ljwx-network
|
|
|
|
volumes:
|
|
mysql_data:
|
|
redis_data:
|
|
ljwx_boot_data:
|
|
ljwx_bigscreen_data:
|
|
|
|
networks:
|
|
ljwx-network:
|
|
driver: bridge
|
|
EOF
|
|
|
|
echo "✅ docker-compose-generated.yml 已生成"
|
|
}
|
|
|
|
# 主函数
|
|
main() {
|
|
echo "🔧 生成动态docker-compose配置..."
|
|
generate_mysql_config
|
|
echo "✅ 配置生成完成"
|
|
}
|
|
|
|
main "$@" |