教程
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文件配置环境变量(可选)
请自行创建