76 lines
2.1 KiB
Bash
Executable File
76 lines
2.1 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Docker 镜像构建和推送脚本
|
||
# 使用方法: ./build_and_push.sh [推送标志] [镜像标签]
|
||
|
||
set -e # 遇到错误立即退出
|
||
|
||
# 配置变量
|
||
IMAGE_NAME="shokku"
|
||
REGISTRY="ccr.ccs.tencentyun.com" # 替换为您的仓库地址
|
||
NAMESPACE="miaogai" # 替换为您的命名空间
|
||
DOCKERFILE="Dockerfile"
|
||
BUILD_CONTEXT="."
|
||
|
||
# 参数处理
|
||
PUSH=${1:-"false"}
|
||
TAG=${2:-"latest"}
|
||
|
||
# 完整的镜像地址
|
||
FULL_IMAGE_NAME="${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:${TAG}"
|
||
|
||
echo "=== Docker 镜像构建和推送 ==="
|
||
echo "镜像名称: ${FULL_IMAGE_NAME}"
|
||
echo "Dockerfile: ${DOCKERFILE}"
|
||
echo "构建上下文: ${BUILD_CONTEXT}"
|
||
|
||
# 检查 Docker 是否安装
|
||
if ! command -v docker &> /dev/null; then
|
||
echo "错误: 未找到 Docker,请先安装 Docker"
|
||
exit 1
|
||
fi
|
||
|
||
# 构建镜像
|
||
echo "开始构建镜像..."
|
||
docker build -t ${IMAGE_NAME}:${TAG} -f ${DOCKERFILE} ${BUILD_CONTEXT}
|
||
|
||
# 标记镜像
|
||
echo "标记镜像..."
|
||
docker tag ${IMAGE_NAME}:${TAG} ${FULL_IMAGE_NAME}
|
||
|
||
# 如果需要推送
|
||
if [ "$PUSH" = "true" ]; then
|
||
echo "登录到镜像仓库..."
|
||
|
||
# 检查是否已经登录到目标仓库
|
||
if ! docker info 2>/dev/null | grep -q "${REGISTRY}"; then
|
||
echo "需要登录到镜像仓库: ${REGISTRY}"
|
||
|
||
# 从环境变量获取凭据,如果存在的话
|
||
if [ -n "$DOCKER_REGISTRY_USER" ] && [ -n "$DOCKER_REGISTRY_PASSWORD" ]; then
|
||
echo "使用环境变量中的凭据进行登录..."
|
||
echo "$DOCKER_REGISTRY_PASSWORD" | docker login ${REGISTRY} --username "$DOCKER_REGISTRY_USER" --password-stdin
|
||
else
|
||
# 交互式登录
|
||
echo "请输入镜像仓库凭据:"
|
||
docker login ${REGISTRY}
|
||
fi
|
||
|
||
# 检查登录是否成功
|
||
if [ $? -ne 0 ]; then
|
||
echo "错误: 镜像仓库登录失败"
|
||
exit 1
|
||
fi
|
||
else
|
||
echo "已登录到镜像仓库 ${REGISTRY}"
|
||
fi
|
||
|
||
echo "推送镜像到仓库..."
|
||
docker push ${FULL_IMAGE_NAME}
|
||
|
||
echo "✅ 镜像推送完成: ${FULL_IMAGE_NAME}"
|
||
else
|
||
echo "ℹ️ 镜像构建完成,未推送 (使用 'true' 作为第1个参数来推送)"
|
||
fi
|
||
|
||
echo "=== 完成 ===" |