本文目录导读:

我来介绍几种用脚本自动配置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()
使用建议
-
权限设置:给脚本添加执行权限
chmod +x script.sh
-
版本控制:将脚本添加到Git仓库
git add script.sh git commit -m "添加自动部署脚本"
-
定时任务:配合crontab实现自动部署
# 每天凌晨2点执行 0 2 * * * /path/to/deploy.sh production
这些脚本可以根据你的具体需求进行定制和扩展。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播