教程

github地址:https://github.com/tech-shrimp/docker_image_pusher

附推送脚本

核心推送脚本(docker-push.sh)(最好只存在一份)

#!/bin/sh
load(){
	local SCRIPT_DIR=${SCRIPT_DIR:-"$1"}
	# 加载 .env 配置
    if [ -f "$SCRIPT_DIR/.env" ]; then
        . "$SCRIPT_DIR/.env"  # 使用脚本所在目录的 .env
    else
        echo "[main] ❌ .env 文件不存在"
        exit 1
    fi
}

push() {
	local name="$1"
	local version="$2"

	local image="${REGISTRY}/${NAME_SPACE}/${name}:1.8.0"
	local imageId=$(docker images --format "{{.ID}}" --filter "reference=${name}:1.8.0" | head -n 1)
	echo "[main] imageId==> ${imageId}"
	local login="docker login -u ${ALIYUN_USER} -p ${ALIYUN_PASSWORD} ${REGISTRY}"
	local tag="docker tag ${imageId} ${image}"
	local push="docker push ${image}"
 # 如果镜像 ID 不为空,则给镜像打标签并推送
    if [ -n "$imageId" ]; then
		#echo "login ==> ${login}"
        echo "[main] 登录 Aliyun ACR..."
		eval "$login"
		echo "[main] tag ==> ${tag}"
        echo "[main] 给镜像打标签..."
		eval "$tag"
		echo "[main] push ==> ${push}"
        echo "[main] 推送镜像..."
		eval "$push"
		echo "[main] 推送镜像${name}:1.8.0完成"
		echo "==> ${image} <=="
	else
        echo "[main] ❌ 没有找到本地镜像,请先构建镜像。"
        clear
        exit 1
    fi
}

clear(){
	echo "[main] clear ... "
	#sed -i "s/^IMAGE_NAME.*/IMAGE_NAME=/" $SCRIPT_DIR/.env
	#sed -i "s/^VERSION.*/VERSION=/" $SCRIPT_DIR/.env
	# 使用合成的 sed 命令修改 .env 文件中的 IMAGE_NAME 和 VERSION
	sed -i -e "s#^IMAGE_NAME.*#IMAGE_NAME=#" -e "s#^VERSION.*#VERSION=#" $SCRIPT_DIR/.env

	echo "[main] ✅ clear ok"
}

build(){
	# 该方法等同于客户端
	local IMAGE_NAME="$1"
   	local VERSION="$2"
   	if [ -n "$SCRIPT_MAIN_DIR" ]; then
	   	# 获取脚本所在目录路径 SCRIPT_DIR 本执行文件目录
		SCRIPT_DIR="$(dirname "$0")"
	    # 加载 .env 配置
	    if [ -f "$SCRIPT_DIR/.env" ]; then
	        . "$SCRIPT_DIR/.env"  # 使用脚本所在目录的 .env
	    else
	        echo "[build] ❌ .env 文件不存在"
	        exit 1
	    fi
   	fi

	local SCRIPT_MAIN_DIR=${SCRIPT_MAIN_DIR:-"$3"}

    #SCRIPT_MAIN_DIR核心执行文件目录 ==> docker-push.sh
    if [ -n "$SCRIPT_MAIN_DIR" ]; then
    	echo "[build] build ... "
		#sed -i "s/^IMAGE_NAME.*/IMAGE_NAME=${IMAGE_NAME}/" $SCRIPT_MAIN_DIR/.env
		#sed -i "s/^VERSION.*/VERSION=${VERSION}/" $SCRIPT_MAIN_DIR/.env
		# 使用合成的 sed 命令修改 .env 文件中的 IMAGE_NAME 和 VERSION
		sed -i -e "s#^IMAGE_NAME.*#IMAGE_NAME=${IMAGE_NAME}#" -e "s#^VERSION.*#VERSION=${VERSION}#" $SCRIPT_MAIN_DIR/.env
		echo "[build] ✅ build ok"
		eval "bash ${SCRIPT_MAIN_DIR}/docker-push.sh"
    fi
}

loadClient(){
	local SCRIPT_MAIN_DIR=${SCRIPT_MAIN_DIR:-"$1"}
	# 加载 .env 配置
    if [ -f "$SCRIPT_MAIN_DIR/.env" ]; then
        . "$SCRIPT_MAIN_DIR/.env"  # 使用脚本所在目录的 .env
   		if [ -n "$IMAGE_NAME" ] && [ -n "$VERSION" ]; then
   			echo "[build] ❌ 存在其他镜像正在推送"
      		exit 1
      	fi
    else
        echo "[build] ❌ .env 文件不存在"
        exit 1
    fi
}

client(){
	SCRIPT_MAIN_DIR="/docker-compose/docker"
   	loadClient
	local IMAGE_NAME="redis"
   	local VERSION="7.4.2"

	build "${IMAGE_NAME}" "${VERSION}" "${SCRIPT_MAIN_DIR}"
}

main() {
	# 该方法等同于服务端
	# 获取脚本所在目录路径
	SCRIPT_DIR="$(dirname "$0")"
    # 加载 .env 配置
	load

   	local IMAGE_NAME=${IMAGE_NAME} #"redis"
   	local VERSION=${VERSION} #"7.4.2"
    #假设IMAGE_NAME,VERSION 从 .env中读取
    echo "[main] [init]::IMAGE_NAME=${IMAGE_NAME}\nVERSION=${VERSION}<=="
    if [ -n "$IMAGE_NAME" ] && [ -n "$VERSION" ]; then
	    echo "[main] ✅ 已加载环境变量: ==>REGISTRY=${REGISTRY}\nNAME_SPACE=${NAME_SPACE}\n<=="
		push "${IMAGE_NAME}" "${VERSION}"
    else
        echo "[main] ❌ 请配置IMAGE_NAME,VERSION"
        exit 1
	fi
	clear
	load
	echo "[main] [end]::IMAGE_NAME=${IMAGE_NAME}\nVERSION=${VERSION}<=="
}  

main

对应.env文件配置环境变量(必须)

REGISTRY=阿里云对应仓库
NAME_SPACE=命名空间
ALIYUN_USER=你的用户名
ALIYUN_PASSWORD=密码
#====
IMAGE_NAME=
VERSION=

辅助推送脚本(可存在多份)

#!/bin/sh
build(){
	# 该方法等同于客户端
	local IMAGE_NAME="$1"
   	local VERSION="$2"
   	if [ -n "$SCRIPT_MAIN_DIR" ]; then
	   	# 获取脚本所在目录路径 SCRIPT_DIR 本执行文件目录
		SCRIPT_DIR="$(dirname "$0")"
	    # 加载 .env 配置
	    if [ -f "$SCRIPT_DIR/.env" ]; then
	        . "$SCRIPT_DIR/.env"  # 使用脚本所在目录的 .env
	    else
	        echo "[build] ❌ .env 文件不存在"
	        exit 1
	    fi
   	fi

	local SCRIPT_MAIN_DIR=${SCRIPT_MAIN_DIR:-"$3"}

    #SCRIPT_MAIN_DIR核心执行文件目录 ==> docker-push.sh
    if [ -n "$SCRIPT_MAIN_DIR" ]; then
    	echo "[build] build ... "
		#sed -i "s/^IMAGE_NAME.*/IMAGE_NAME=${IMAGE_NAME}/" $SCRIPT_MAIN_DIR/.env
		#sed -i "s/^VERSION.*/VERSION=${VERSION}/" $SCRIPT_MAIN_DIR/.env
		# 使用合成的 sed 命令修改 .env 文件中的 IMAGE_NAME 和 VERSION
		sed -i -e "s#^IMAGE_NAME.*#IMAGE_NAME=${IMAGE_NAME}#" -e "s#^VERSION.*#VERSION=${VERSION}#" $SCRIPT_MAIN_DIR/.env
		echo "[build] ✅ build ok"
		eval "bash ${SCRIPT_MAIN_DIR}/docker-push.sh"
    fi
}

loadClient(){
	local SCRIPT_MAIN_DIR=${SCRIPT_MAIN_DIR:-"$1"}
	# 加载 .env 配置
    if [ -f "$SCRIPT_MAIN_DIR/.env" ]; then
        . "$SCRIPT_MAIN_DIR/.env"  # 使用脚本所在目录的 .env
   		if [ -n "$IMAGE_NAME" ] && [ -n "$VERSION" ]; then
   			echo "[build] ❌ 存在其他镜像正在推送"
      		exit 1
      	fi
    else
        echo "[build] ❌ .env 文件不存在"
        exit 1
    fi
}

client(){
    #核心推送脚本所在目录
	SCRIPT_MAIN_DIR="/docker-compose/docker"
   	loadClient
   
	local IMAGE_NAME="redis"
   	local VERSION="7.4.2"
	build "${IMAGE_NAME}" "${VERSION}" "${SCRIPT_MAIN_DIR}"
}
client

对应.env文件配置环境变量(可选)

请自行创建