diff --git a/Dockerfile b/Dockerfile index c5ff9c2..9d68f4a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,28 +1,28 @@ -# Ver: 1.10 by Endial Fang (endial@126.com) +# Ver: 1.11 by Endial Fang (endial@126.com) # # 系统默认变量 ==================================================================== # 该部分变量为系统根据编译命令默认设置 -# `TARGETPLATFORM`:构建后的目标平台信息。如 `linux/amd64`,`linux/arm/v7`,`windows/amd64` +# `TARGETPLATFORM`:构建后的目标平台信息。如 `linux/amd64`,`linux/arm/v7`,`windows/amd64` # `TARGETOS`:目标平台信息(TARGETPLATFORM)中的操作系统部分,如:`linux`、`windows` # `TARGETARCH`:目标平台信息(TARGETPLATFORM)中的平台架构部分,如:`amd64`、`arm` # `TARGETVARIANT`:目标平台信息(TARGETPLATFORM)中的版本变体部分,如:`v7` # `BUILDPLATFORM`:用于构建的节点平台信息 # `BUILDOS`:用于构建的节点平台信息(BUILDPLATFORM)中的操作系统部分 -# `BUILDARCH`用于构建的节点平台信息(BUILDPLATFORM)中的平台架构部分 -# `BUILDVARIANT`用于构建的节点平台信息(BUILDPLATFORM)中的版本变体部分 +# `BUILDARCH`:用于构建的节点平台信息(BUILDPLATFORM)中的平台架构部分 +# `BUILDVARIANT`:用于构建的节点平台信息(BUILDPLATFORM)中的版本变体部分 # 可变参数 ======================================================================== # 该部分变量,在编译命令中通过 `--build-arg` 传入;如果未设置,则使用下面对应的默认值 -ARG APP_NAME=alpine # 设置当前应用名称 -ARG APP_VER=3.18 # 设置当前应用版本 -ARG REGISTRY_URL="docker.colovu.com/" # 设置默认仓库地址,默认为本地仓库;定义时需要包含末尾的`/` -ARG APT_SOURCE=ustc # 设置 apt-get 源:default / ustc / aliyun; 当前 Alpine 3.18 阿里云缺少部分软件包 -ARG LOCAL_URL="http://local.colovu.com/dist" # 编译镜像时指定用于加速的本地软件包存储服务器地址 +ARG APP_NAME=alpine +ARG APP_VER=3.18 +ARG REGISTRY_URL="registry.colovu.com/docker-proxy/" +ARG APT_SOURCE=ustc +ARG LOCAL_URL="http://pkgs.colovu.com/dist" # 1. 生成镜像 ===================================================================== -FROM --platform=${TARGETPLATFORM:-linux/amd64} ${REGISTRY_URL}library/alpine:${APP_VER} +FROM --platform=${TARGETPLATFORM:-linux/amd64} ${REGISTRY_URL}alpine:${APP_VER} # 声明需要使用的全局可变参数(ARG声明的变量仅编译打包阶段有效) ARG APP_NAME @@ -32,7 +32,7 @@ ARG APT_SOURCE LABEL \ "Version"="v${APP_VER}" \ "Description"="Docker image for Alpine." \ - "Github"="https://github.com/colovu/docker-${APP_NAME}" \ + "Github"="https://gitee.com/colovu/docker-${APP_NAME}" \ "Vendor"="Endial Fang (endial@126.com)" # 拷贝默认的通用脚本文件 diff --git a/Makefile b/Makefile index 2ef31f2..9e20b22 100644 --- a/Makefile +++ b/Makefile @@ -3,10 +3,10 @@ # 当前 Docker 镜像的编译脚本 # 定义镜像名称 -image_name :=colovu/alpine +image_name :=alpine # 定义默认镜像仓库地址 -REGISTRY_URL :=docker.colovu.com +REGISTRY_URL :=registry.colovu.com/docker-proxy/ # 定义系统默认使用的源服务器,包含:default / ustc / aliyun # 当前 Alpine 3.18 阿里云缺少部分软件包 @@ -24,30 +24,45 @@ build-arg+=--build-arg APT_SOURCE=$(APT_SOURCE) # 设置本地下载服务器路径,加速调试时的本地编译速度 local_ip:=`echo "en0 eth0" | xargs -n1 ip addr show 2>/dev/null | grep inet | grep -v 127.0.0.1 | grep -v inet6 | tr "/" " " | awk '{print $$2}'` -build-arg+=--build-arg LOCAL_URL=http://local.colovu.com/dist +build-arg+=--build-arg LOCAL_URL=http://pkgs.colovu.com/dist -.PHONY: build clean clearclean upgrade +.PHONY: build clean clearclean upgrade push build: @echo "Build $(image_name):$(image_tag)" - @docker buildx build --progress plain --force-rm $(build-arg) -t $(image_name):$(image_tag) . + @podman build --progress plain --force-rm $(build-arg) -t $(image_name):$(image_tag) . @echo "Add tag: $(image_name):latest" - @docker tag $(image_name):$(image_tag) $(image_name):latest + @podman tag $(image_name):$(image_tag) $(image_name):latest @echo "Build complete" # 清理悬空的镜像(无TAG)及停止的容器 clearclean: clean @echo "Clean untaged images and stoped containers..." - @docker ps -a | grep "Exited" | awk '{print $$1}' | sort -u | xargs -L 1 docker rm - @docker images | grep '' | awk '{print $$3}' | sort -u | xargs -L 1 docker rmi -f + @podman ps -a | grep "Exited" | awk '{print $$1}' | sort -u | xargs -L 1 podman rm + @podman images | grep '' | awk '{print $$3}' | sort -u | xargs -L 1 podman rmi -f # 为了防止删除前缀名相同的镜像,在过滤条件中加入一个空格进行过滤 clean: @echo "Clean all images for current application..." - @docker images | grep "$(image_name) " | awk '{print $$3}' | sort -u | xargs -L 1 docker rmi -f + @podman images | grep "$(image_name) " | awk '{print $$3}' | sort -u | xargs -L 1 podman rmi -f # 更新所有 colovu 仓库的镜像 upgrade: @echo "Upgrade all images..." - @docker images | grep 'colovu' | grep -v '' | grep -v "latest-" | awk '{print $$1":"$$2}' | sort -u | xargs -L 1 docker pull + @podman images | grep 'colovu' | grep -v '' | grep -v "latest-" | awk '{print $$1":"$$2}' | sort -u | xargs -L 1 podman pull +# 推送镜像至华为云 SWR 的 colovu 空间及 registry.colovu.com 的默认空间 +push: + @echo "Push $(image_name):$(image_tag) to Huawei Cloud SWR colovu space" + @podman tag $(image_name):$(image_tag) swr.cn-north-4.myhuaweicloud.com/colovu/$(image_name):$(image_tag) + @podman push swr.cn-north-4.myhuaweicloud.com/colovu/$(image_name):$(image_tag) + @echo "Push $(image_name):$(image_tag) to registry.colovu.com" + @podman tag $(image_name):$(image_tag) registry.colovu.com/$(image_name):$(image_tag) + @podman push registry.colovu.com/$(image_name):$(image_tag) + @echo "Push $(image_name):latest to Huawei Cloud SWR colovu space" + @podman tag $(image_name):latest swr.cn-north-4.myhuaweicloud.com/colovu/$(image_name):latest + @podman push swr.cn-north-4.myhuaweicloud.com/colovu/$(image_name):latest + @echo "Push $(image_name):latest to registry.colovu.com" + @podman tag $(image_name):latest registry.colovu.com/$(image_name):latest + @podman push registry.colovu.com/$(image_name):latest + @echo "Push complete" diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..6c10d3d --- /dev/null +++ b/build.sh @@ -0,0 +1,110 @@ +#!/bin/bash +# Ver: 1.0 by Endial Fang (endial@126.com) +# +# Docker 镜像构建脚本 (仅linux/amd64) + +IMAGE_NAME="alpine" +REGISTRY_URL="registry.colovu.com/docker-proxy/" +APT_SOURCE="ustc" + +# 获取发布版本标签 +get_release_tag() { + if ! git rev-parse --git-dir >/dev/null 2>&1; then + echo "unknown" + elif [ -n "$(git status --porcelain)" ]; then + echo "latest" + else + # 尝试获取最近的git标签 + local tag=$(git describe --tags --abbrev=0 2>/dev/null) + if [ -n "$tag" ]; then + echo "$tag" + else + local branch=$(git rev-parse --abbrev-ref HEAD) + case "$branch" in + master|main) echo "latest" ;; + *) echo "$branch" ;; + esac + fi + fi +} + +# 获取镜像完整TAG +get_image_tag() { + local CURRENT_SUBVERSION + if git rev-parse --git-dir >/dev/null 2>&1; then + if [ -z "$(git status --porcelain)" ]; then + CURRENT_SUBVERSION=$(git rev-parse --short=12 HEAD) + else + CURRENT_SUBVERSION=$(date +%Y%m%d-%H%M%S) + fi + local branch=$(git rev-parse --abbrev-ref HEAD) + branch=$(echo "$branch" | sed -e 's/master/latest/' -e 's/main/latest/') + echo "${branch}-${CURRENT_SUBVERSION}" + else + CURRENT_SUBVERSION=$(date +%Y%m%d-%H%M%S) + echo "latest-${CURRENT_SUBVERSION}" + fi +} + +# 构建amd64架构镜像 +build() { + local TAG=${1:-$(get_image_tag)} + echo "Building image ${IMAGE_NAME}:${TAG} (linux/amd64)" + + podman build --platform linux/amd64 \ + --progress plain --force-rm \ + --build-arg REGISTRY_URL=${REGISTRY_URL} \ + --build-arg APT_SOURCE=${APT_SOURCE} \ + --build-arg LOCAL_URL=http://pkgs.colovu.com/dist \ + -t ${IMAGE_NAME}:${TAG} \ + -t ${IMAGE_NAME}:latest \ + . + + echo "Build complete" +} + +# 推送镜像到colovu仓库 +push_colovu() { + local TAG=${1:-$(get_image_tag)} + echo "Pushing ${IMAGE_NAME}:${TAG} to registry.colovu.com" + + podman tag "${IMAGE_NAME}:${TAG}" "registry.colovu.com/library/${IMAGE_NAME}:${TAG}" + podman push "registry.colovu.com/library/${IMAGE_NAME}:${TAG}" + + podman tag "${IMAGE_NAME}:latest" "registry.colovu.com/library/${IMAGE_NAME}:latest" + podman push "registry.colovu.com/library/${IMAGE_NAME}:latest" +} + +# 推送镜像到华为云仓库 +push_huawei() { + local TAG=${1:-$(get_release_tag)} + echo "Pushing ${IMAGE_NAME}:${TAG} to swr.cn-north-4.myhuaweicloud.com" + + podman tag "${IMAGE_NAME}:${TAG}" "swr.cn-north-4.myhuaweicloud.com/colovu/${IMAGE_NAME}:${TAG}" + podman push "swr.cn-north-4.myhuaweicloud.com/colovu/${IMAGE_NAME}:${TAG}" + + podman tag "${IMAGE_NAME}:latest" "swr.cn-north-4.myhuaweicloud.com/colovu/${IMAGE_NAME}:latest" + podman push "swr.cn-north-4.myhuaweicloud.com/colovu/${IMAGE_NAME}:latest" +} + +# 清理工作空间 +clean() { + echo "Cleaning workspace..." + podman images | grep "${IMAGE_NAME} " | awk '{print $3}' | xargs -L 1 podman rmi -f + podman ps -a | grep "Exited" | awk '{print $1}' | xargs -L 1 podman rm + podman images | grep '' | awk '{print $3}' | xargs -L 1 podman rmi -f +} + +# 主函数中更新使用说明 +main() { + case "$1" in + build) build "$2" ;; # 传递第二个参数作为标签 + clean) clean ;; + push-cv) push_colovu "$2" ;; + push-hw) push_huawei "$2" ;; + push) push_colovu "$2"; push_huawei "$2" ;; + *) echo "Usage: $0 {build [tag]|clean|push-cv [tag]|push-hw [tag]|push [tag]}"; exit 1 ;; + esac +} + +main "$@" \ No newline at end of file