|
#!/bin/bash |
|
|
|
|
|
|
|
set -e |
|
|
|
echo "🐳 Docker镜像构建脚本" |
|
echo "====================" |
|
echo |
|
|
|
|
|
if ! command -v docker &> /dev/null; then |
|
echo "❌ 错误: Docker未安装" |
|
echo "请先安装Docker: https://docs.docker.com/engine/install/" |
|
exit 1 |
|
fi |
|
|
|
|
|
if ! docker info &> /dev/null; then |
|
echo "❌ 错误: Docker服务未运行" |
|
echo "请启动Docker服务: sudo systemctl start docker" |
|
exit 1 |
|
fi |
|
|
|
echo "✅ Docker环境检查通过" |
|
echo |
|
|
|
|
|
IMAGE_TAG=${1:-latest} |
|
REGISTRY=${2:-""} |
|
|
|
if [ -n "$REGISTRY" ]; then |
|
FULL_TAG="$REGISTRY/chatapp:$IMAGE_TAG" |
|
else |
|
FULL_TAG="chatapp:$IMAGE_TAG" |
|
fi |
|
|
|
echo "📦 构建配置:" |
|
echo " 镜像标签: $FULL_TAG" |
|
echo " 构建上下文: $(pwd)" |
|
echo |
|
|
|
|
|
echo "请选择构建方式:" |
|
echo "1) 多容器构建 (推荐)" |
|
echo "2) 单容器构建" |
|
echo "3) 仅构建前端" |
|
echo "4) 仅构建后端" |
|
echo |
|
|
|
read -p "请输入选择 (1-4): " choice |
|
|
|
case $choice in |
|
1) |
|
echo "🔨 构建多容器版本..." |
|
|
|
|
|
echo "📦 构建前端镜像..." |
|
docker build -t "${FULL_TAG}-frontend" ./client |
|
|
|
|
|
echo "📦 构建后端镜像..." |
|
docker build -t "${FULL_TAG}-backend" ./server |
|
|
|
echo "✅ 多容器镜像构建完成" |
|
echo " 前端镜像: ${FULL_TAG}-frontend" |
|
echo " 后端镜像: ${FULL_TAG}-backend" |
|
;; |
|
|
|
2) |
|
echo "🔨 构建单容器版本..." |
|
docker build -t "$FULL_TAG" . |
|
echo "✅ 单容器镜像构建完成: $FULL_TAG" |
|
;; |
|
|
|
3) |
|
echo "🔨 构建前端镜像..." |
|
docker build -t "${FULL_TAG}-frontend" ./client |
|
echo "✅ 前端镜像构建完成: ${FULL_TAG}-frontend" |
|
;; |
|
|
|
4) |
|
echo "🔨 构建后端镜像..." |
|
docker build -t "${FULL_TAG}-backend" ./server |
|
echo "✅ 后端镜像构建完成: ${FULL_TAG}-backend" |
|
;; |
|
|
|
*) |
|
echo "❌ 无效选择" |
|
exit 1 |
|
;; |
|
esac |
|
|
|
echo |
|
|
|
|
|
echo "📋 构建的镜像:" |
|
docker images | grep chatapp |
|
|
|
echo |
|
|
|
|
|
if [ -n "$REGISTRY" ]; then |
|
read -p "是否推送镜像到仓库? (y/N): " push_choice |
|
if [[ $push_choice =~ ^[Yy]$ ]]; then |
|
echo "📤 推送镜像到仓库..." |
|
|
|
case $choice in |
|
1) |
|
docker push "${FULL_TAG}-frontend" |
|
docker push "${FULL_TAG}-backend" |
|
;; |
|
2) |
|
docker push "$FULL_TAG" |
|
;; |
|
3) |
|
docker push "${FULL_TAG}-frontend" |
|
;; |
|
4) |
|
docker push "${FULL_TAG}-backend" |
|
;; |
|
esac |
|
|
|
echo "✅ 镜像推送完成" |
|
fi |
|
fi |
|
|
|
|
|
read -p "是否运行容器测试? (y/N): " test_choice |
|
if [[ $test_choice =~ ^[Yy]$ ]]; then |
|
echo "🧪 运行容器测试..." |
|
|
|
case $choice in |
|
1) |
|
echo "启动多容器测试环境..." |
|
docker-compose up -d |
|
sleep 30 |
|
./test.sh |
|
docker-compose down |
|
;; |
|
2) |
|
echo "启动单容器测试环境..." |
|
docker-compose -f docker-compose.single.yml up -d |
|
sleep 30 |
|
./test.sh |
|
docker-compose -f docker-compose.single.yml down |
|
;; |
|
3|4) |
|
echo "⚠️ 单独的前端或后端镜像需要完整环境才能测试" |
|
;; |
|
esac |
|
fi |
|
|
|
echo |
|
echo "🎉 构建完成!" |
|
echo |
|
echo "💡 使用提示:" |
|
echo " - 查看镜像: docker images | grep chatapp" |
|
echo " - 运行容器: docker run -p 3000:80 $FULL_TAG" |
|
echo " - 清理镜像: docker rmi $FULL_TAG" |
|
echo |
|
echo "📚 更多命令:" |
|
echo " - make build # 使用Makefile构建" |
|
echo " - make start # 启动应用" |
|
echo " - make test # 运行测试" |
|
|