怎样用脚本自动配置Docker Compose?

wen 实用脚本 2

本文目录导读:

怎样用脚本自动配置Docker Compose?

  1. Bash脚本自动生成docker-compose.yml
  2. 交互式配置脚本
  3. 多环境配置脚本
  4. 自动化部署脚本
  5. 使用Python脚本进行高级配置
  6. 使用建议

我来介绍几种用脚本自动配置Docker Compose的方法:

Bash脚本自动生成docker-compose.yml

#!/bin/bash
# 配置参数
PROJECT_NAME="myapp"
MYSQL_ROOT_PASSWORD="root123"
REDIS_PASSWORD="redis123"
# 生成docker-compose.yml
cat > docker-compose.yml << EOF
version: '3.8'
services:
  # Web应用
  app:
    image: nginx:latest
    container_name: ${PROJECT_NAME}-web
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./www:/usr/share/nginx/html
      - ./nginx/conf.d:/etc/nginx/conf.d
    networks:
      - app-network
    restart: always
  # MySQL数据库
  mysql:
    image: mysql:8.0
    container_name: ${PROJECT_NAME}-mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${PROJECT_NAME}
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network
    restart: always
  # Redis缓存
  redis:
    image: redis:7-alpine
    container_name: ${PROJECT_NAME}-redis
    command: redis-server --requirepass ${REDIS_PASSWORD}
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    networks:
      - app-network
    restart: always
networks:
  app-network:
    driver: bridge
volumes:
  mysql-data:
  redis-data:
EOF
# 创建必要的目录
mkdir -p ./www ./nginx/conf.d
# 启动服务
docker-compose up -d
echo "✅ Docker Compose 配置完成!"
echo "Web: http://localhost"
echo "MySQL: 端口 3306, 密码: ${MYSQL_ROOT_PASSWORD}"
echo "Redis: 端口 6379, 密码: ${REDIS_PASSWORD}"

交互式配置脚本

#!/bin/bash
# 颜色输出
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
echo -e "${GREEN}Docker Compose 自动配置脚本${NC}"
echo "--------------------------------"
# 交互式配置
read -p "请输入项目名称 [myapp]: " PROJECT_NAME
PROJECT_NAME=${PROJECT_NAME:-myapp}
read -p "请输入Web端口 [80]: " WEB_PORT
WEB_PORT=${WEB_PORT:-80}
read -p "是否启用MySQL (y/n) [y]: " ENABLE_MYSQL
ENABLE_MYSQL=${ENABLE_MYSQL:-y}
if [ "$ENABLE_MYSQL" = "y" ]; then
    read -p "MySQL端口 [3306]: " MYSQL_PORT
    MYSQL_PORT=${MYSQL_PORT:-3306}
    read -s -p "MySQL密码 [root123]: " MYSQL_PASSWORD
    MYSQL_PASSWORD=${MYSQL_PASSWORD:-root123}
    echo ""
    read -p "MySQL数据库名 [${PROJECT_NAME}]: " MYSQL_DB
    MYSQL_DB=${MYSQL_DB:-$PROJECT_NAME}
fi
read -p "是否启用Redis (y/n) [y]: " ENABLE_REDIS
ENABLE_REDIS=${ENABLE_REDIS:-y}
if [ "$ENABLE_REDIS" = "y" ]; then
    read -p "Redis端口 [6379]: " REDIS_PORT
    REDIS_PORT=${REDIS_PORT:-6379}
    read -s -p "Redis密码 [redis123]: " REDIS_PASSWORD
    REDIS_PASSWORD=${REDIS_PASSWORD:-redis123}
    echo ""
fi
# 生成配置文件
generate_compose() {
    cat > docker-compose.yml << EOF
version: '3.8'
services:
  # Web应用
  app:
    image: nginx:latest
    container_name: ${PROJECT_NAME}-web
    ports:
      - "${WEB_PORT}:80"
    volumes:
      - ./www:/usr/share/nginx/html
      - ./nginx/conf.d:/etc/nginx/conf.d
    networks:
      - app-network
    restart: always
EOF
    # MySQL配置
    if [ "$ENABLE_MYSQL" = "y" ]; then
        cat >> docker-compose.yml << EOF
  # MySQL数据库
  mysql:
    image: mysql:8.0
    container_name: ${PROJECT_NAME}-mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DB}
    ports:
      - "${MYSQL_PORT}:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network
    restart: always
EOF
    fi
    # Redis配置
    if [ "$ENABLE_REDIS" = "y" ]; then
        cat >> docker-compose.yml << EOF
  # Redis缓存
  redis:
    image: redis:7-alpine
    container_name: ${PROJECT_NAME}-redis
    command: redis-server --requirepass ${REDIS_PASSWORD}
    ports:
      - "${REDIS_PORT}:6379"
    volumes:
      - redis-data:/data
    networks:
      - app-network
    restart: always
EOF
    fi
    # 网络和卷配置
    cat >> docker-compose.yml << EOF
networks:
  app-network:
    driver: bridge
volumes:
EOF
    if [ "$ENABLE_MYSQL" = "y" ]; then
        echo "  mysql-data:" >> docker-compose.yml
    fi
    if [ "$ENABLE_REDIS" = "y" ]; then
        echo "  redis-data:" >> docker-compose.yml
    fi
}
# 执行配置
generate_compose
# 创建目录
mkdir -p ./www ./nginx/conf.d
echo -e "\n${GREEN}✅ 配置生成完成!${NC}"
echo "配置文件: docker-compose.yml"
echo "项目目录: $(pwd)"
echo ""
echo -e "${YELLOW}执行以下命令启动:${NC}"
echo "docker-compose up -d"

多环境配置脚本

#!/bin/bash
# 环境变量配置
ENV=${1:-dev}
case $ENV in
  dev)
    # 开发环境配置
    cat > .env << EOF
COMPOSE_PROJECT_NAME=myapp-dev
APP_ENV=development
APP_PORT=8080
MYSQL_PORT=3307
REDIS_PORT=6380
MYSQL_PASSWORD=dev123
REDIS_PASSWORD=dev123
EOF
    ;;
  staging)
    # 预发布环境配置
    cat > .env << EOF
COMPOSE_PROJECT_NAME=myapp-staging
APP_ENV=staging
APP_PORT=8088
MYSQL_PORT=3308
REDIS_PORT=6381
MYSQL_PASSWORD=staging123
REDIS_PASSWORD=staging123
EOF
    ;;
  production)
    # 生产环境配置
    read -s -p "请输入MySQL密码: " MYSQL_PASSWORD
    echo ""
    read -s -p "请输入Redis密码: " REDIS_PASSWORD
    echo ""
    cat > .env << EOF
COMPOSE_PROJECT_NAME=myapp-prod
APP_ENV=production
APP_PORT=80
MYSQL_PORT=3306
REDIS_PORT=6379
MYSQL_PASSWORD=${MYSQL_PASSWORD}
REDIS_PASSWORD=${REDIS_PASSWORD}
EOF
    ;;
  *)
    echo "用法: $0 {dev|staging|production}"
    exit 1
    ;;
esac
echo "✅ 环境 '${ENV}' 配置完成!"

自动化部署脚本

#!/bin/bash
# 完整的自动化部署脚本
set -e
echo "🚀 开始自动部署..."
# 1. 检查依赖
check_dependencies() {
    echo "检查依赖..."
    if ! command -v docker &> /dev/null; then
        echo "❌ Docker 未安装"
        exit 1
    fi
    if ! command -v docker-compose &> /dev/null; then
        echo "❌ Docker Compose 未安装"
        exit 1
    fi
}
# 2. 拉取最新代码
pull_latest_code() {
    echo "拉取最新代码..."
    if [ -d ".git" ]; then
        git pull origin main
    else
        echo "⚠️ 不是Git仓库,跳过代码更新"
    fi
}
# 3. 生成配置文件
generate_config() {
    echo "生成配置文件..."
    # 备份旧的配置文件
    if [ -f "docker-compose.yml" ]; then
        cp docker-compose.yml docker-compose.yml.bak
        echo "备份旧的配置文件: docker-compose.yml.bak"
    fi
    # 使用环境变量生成新配置
    envsubst < docker-compose.template.yml > docker-compose.yml
}
# 4. 清理旧容器和镜像
clean_old_containers() {
    echo "清理旧容器..."
    # 停止并删除旧容器
    docker-compose down --remove-orphans
    # 删除未被使用的镜像
    docker image prune -f
    # 删除未被使用的卷
    docker volume prune -f
}
# 5. 构建和启动新服务
build_and_start() {
    echo "构建新服务..."
    # 构建镜像
    docker-compose build --no-cache
    # 启动服务
    docker-compose up -d --remove-orphans
}
# 6. 健康检查
health_check() {
    echo "执行健康检查..."
    sleep 10
    # 检查容器状态
    docker-compose ps
    # 检查服务是否正常运行
    if docker-compose ps | grep -q "Up"; then
        echo "✅ 服务启动成功!"
    else
        echo "❌ 服务启动失败,请检查日志"
        docker-compose logs
        exit 1
    fi
}
# 7. 输出信息
show_info() {
    echo ""
    echo "========================================="
    echo "  📋 部署信息"
    echo "========================================="
    echo "  部署时间: $(date)"
    echo "  项目版本: $(git rev-parse --short HEAD 2>/dev/null || echo 'N/A')"
    echo "  运行容器:"
    docker-compose ps --services
    echo "========================================="
}
# 主函数
main() {
    check_dependencies
    pull_latest_code
    generate_config
    clean_old_containers
    build_and_start
    health_check
    show_info
    echo ""
    echo "🎉 部署完成!"
}
# 执行部署
main

使用Python脚本进行高级配置

#!/usr/bin/env python3
import os
import json
import yaml
from pathlib import Path
class DockerComposeGenerator:
    def __init__(self):
        self.config = {
            'version': '3.8',
            'services': {},
            'networks': {
                'app-network': {
                    'driver': 'bridge'
                }
            },
            'volumes': {}
        }
    def add_web_service(self, name='app', port=80, image='nginx:latest'):
        self.config['services'][name] = {
            'image': image,
            'container_name': f'{name}-web',
            'ports': [f'{port}:80'],
            'volumes': [
                './www:/usr/share/nginx/html',
                './nginx/conf.d:/etc/nginx/conf.d'
            ],
            'networks': ['app-network'],
            'restart': 'always'
        }
    def add_mysql_service(self, name='mysql', port=3306, password='root123', db='myapp'):
        self.config['services'][name] = {
            'image': 'mysql:8.0',
            'container_name': f'{name}-mysql',
            'environment': {
                'MYSQL_ROOT_PASSWORD': password,
                'MYSQL_DATABASE': db
            },
            'ports': [f'{port}:3306'],
            'volumes': ['mysql-data:/var/lib/mysql'],
            'networks': ['app-network'],
            'restart': 'always'
        }
        self.config['volumes']['mysql-data'] = {}
    def add_redis_service(self, name='redis', port=6379, password='redis123'):
        self.config['services'][name] = {
            'image': 'redis:7-alpine',
            'container_name': f'{name}-redis',
            'command': f'redis-server --requirepass {password}',
            'ports': [f'{port}:6379'],
            'volumes': ['redis-data:/data'],
            'networks': ['app-network'],
            'restart': 'always'
        }
        self.config['volumes']['redis-data'] = {}
    def generate(self, filename='docker-compose.yml'):
        with open(filename, 'w') as f:
            yaml.dump(self.config, f, default_flow_style=False)
        print(f'✅ 配置文件已生成: {filename}')
    def deploy(self):
        os.system('docker-compose up -d')
        print('✅ 服务已启动')
# 使用示例
if __name__ == '__main__':
    generator = DockerComposeGenerator()
    # 添加服务
    generator.add_web_service(port=8080)
    generator.add_mysql_service(password='myapp123')
    generator.add_redis_service(password='redis123')
    # 生成配置并部署
    generator.generate()
    generator.deploy()

使用建议

  1. 权限设置:给脚本添加执行权限

    chmod +x script.sh
  2. 版本控制:将脚本添加到Git仓库

    git add script.sh
    git commit -m "添加自动部署脚本"
  3. 定时任务:配合crontab实现自动部署

    # 每天凌晨2点执行
    0 2 * * * /path/to/deploy.sh production

这些脚本可以根据你的具体需求进行定制和扩展。

抱歉,评论功能暂时关闭!