Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3b93429caa | |||
| e4c5882f45 | |||
| 3f7299ad4f | |||
| 542d7e12dc | |||
| 930e52e826 | |||
| 580a506a6b |
+1
-1
Submodule .ci/common updated: c73f76f877...99f494f83f
+4
-6
@@ -20,12 +20,12 @@
|
||||
|
||||
ARG APP_NAME=go
|
||||
ARG APP_VER=1.23.12
|
||||
ARG REGISTRY_URL="docker.io/colovu/"
|
||||
ARG REGISTRY_URL="swr.cn-north-4.myhuaweicloud.com/colovu/"
|
||||
ARG APT_SOURCE=aliyun
|
||||
ARG LOCAL_URL=""
|
||||
|
||||
# 0. 预处理 ======================================================================
|
||||
FROM --platform=${TARGETPLATFORM:-linux/amd64} ${REGISTRY_URL}debian-builder:13 as builder
|
||||
FROM ${REGISTRY_URL}debian-builder:13 as builder
|
||||
|
||||
# 声明需要使用的全局可变参数
|
||||
ARG APP_NAME
|
||||
@@ -53,7 +53,7 @@ RUN set -eux; \
|
||||
mv "/tmp/go" /usr/local/${APP_NAME};
|
||||
|
||||
# 1. 生成镜像 =====================================================================
|
||||
FROM --platform=${TARGETPLATFORM:-linux/amd64} ${REGISTRY_URL}debian:13
|
||||
FROM ${REGISTRY_URL}debian:13
|
||||
|
||||
# 声明需要使用的全局可变参数(ARG声明的变量仅编译打包阶段有效)
|
||||
ARG APP_NAME
|
||||
@@ -70,7 +70,7 @@ ENV APP_NAME=${APP_NAME} \
|
||||
# 镜像元数据标签 - 符合OCI镜像规范
|
||||
LABEL org.opencontainers.image.title="${APP_NAME}" \
|
||||
org.opencontainers.image.version="${APP_VER}" \
|
||||
org.opencontainers.image.description="Docker image for Alpine." \
|
||||
org.opencontainers.image.description="Docker image for Golang." \
|
||||
org.opencontainers.image.authors="Endial Fang <endial@126.com>" \
|
||||
org.opencontainers.image.url="https://gitee.com/colovu/docker-${APP_NAME}" \
|
||||
org.opencontainers.image.vendor="Endial Fang (colovu)" \
|
||||
@@ -84,10 +84,8 @@ COPY --from=builder /usr/local/${APP_NAME} /usr/local/${APP_NAME}
|
||||
|
||||
RUN set -eux; \
|
||||
\
|
||||
# 创建对应的用户及数据存储目录
|
||||
mkdir -p /srv/${APP_NAME}; \
|
||||
\
|
||||
# 验证安装的应用
|
||||
${APP_NAME} version;
|
||||
|
||||
# 配置容器的数据卷、工作目录
|
||||
|
||||
@@ -1,175 +1,22 @@
|
||||
#!/bin/bash
|
||||
# Ver: 2.0 by Endial Fang (endial@126.com)
|
||||
# Ver: 3.0 by Endial Fang (endial@126.com)
|
||||
#
|
||||
# Docker 镜像构建脚本 (仅linux/amd64)
|
||||
# Docker 镜像构建脚本 - 主入口
|
||||
|
||||
# 编译后镜像名称
|
||||
IMAGE_NAME="golang"
|
||||
export IMAGE_NAME="golang"
|
||||
# 依赖镜像的仓库地址
|
||||
REGISTRY_URL="swr.cn-north-4.myhuaweicloud.com/colovu/"
|
||||
export REGISTRY_URL="swr.cn-north-4.myhuaweicloud.com/colovu/"
|
||||
# 源仓库地址(本地编译时,使用阿里云源仓库)
|
||||
APT_SOURCE="aliyun"
|
||||
APP_VER="1.23.12"
|
||||
LOCAL_URL="http://pkgs.colovu.com/dist"
|
||||
export APT_SOURCE="aliyun"
|
||||
# 针对无法直接下载到软件包,本地变异时,使用缓存的软件包
|
||||
export LOCAL_URL="http://pkgs.colovu.com/dist"
|
||||
|
||||
# 获取发布版本标签
|
||||
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
|
||||
}
|
||||
|
||||
# 根据当前系统架构构建镜像
|
||||
build() {
|
||||
local TAG=${1:-$(get_image_tag)}
|
||||
|
||||
# 获取当前系统的架构
|
||||
local ARCH=$(uname -m)
|
||||
local PLATFORM=""
|
||||
case "$ARCH" in
|
||||
x86_64)
|
||||
PLATFORM="linux/amd64"
|
||||
;;
|
||||
aarch64|arm64)
|
||||
PLATFORM="linux/arm64"
|
||||
;;
|
||||
armv7l)
|
||||
PLATFORM="linux/arm/v7"
|
||||
;;
|
||||
*)
|
||||
PLATFORM="linux/amd64" # 默认为 amd64
|
||||
;;
|
||||
esac
|
||||
|
||||
# 如果在命令中指定了TAG,则使用相同的TAG作为APP_VER
|
||||
if [ -n "$1" ]; then
|
||||
APP_VER="$1"
|
||||
else
|
||||
# 获取当前分支名并判断是否为主分支
|
||||
local branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
|
||||
if [ "$branch" != "master" ] && [ "$branch" != "main" ]; then
|
||||
# 如果不是主分支,则使用分支名或标签名
|
||||
local tag=$(git describe --tags --abbrev=0 2>/dev/null)
|
||||
if [ -n "$tag" ] && [ "$(git rev-list -n 1 $tag 2>/dev/null)" = "$(git rev-parse HEAD)" ]; then
|
||||
# 如果当前提交正好是标签,则使用标签名
|
||||
APP_VER="$tag"
|
||||
else
|
||||
# 否则使用分支名
|
||||
APP_VER="$branch"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# 去除APP_VER中的v前缀,仅保留数字分段部分
|
||||
APP_VER=$(echo "$APP_VER" | sed 's/^v//')
|
||||
|
||||
echo "Building image ${IMAGE_NAME}:${TAG} (${PLATFORM}) with APP_VER=${APP_VER}"
|
||||
|
||||
podman build --platform ${PLATFORM} \
|
||||
--progress plain --force-rm \
|
||||
--build-arg REGISTRY_URL=${REGISTRY_URL} \
|
||||
--build-arg APT_SOURCE=${APT_SOURCE} \
|
||||
--build-arg APP_VER=${APP_VER} \
|
||||
--build-arg LOCAL_URL=${LOCAL_URL:-} \
|
||||
-t ${IMAGE_NAME}:${TAG} \
|
||||
-t ${IMAGE_NAME}:latest \
|
||||
.
|
||||
|
||||
echo "Build complete"
|
||||
}
|
||||
|
||||
# 清理工作空间
|
||||
clean() {
|
||||
echo "Cleaning workspace..."
|
||||
# 删除所有与 IMAGE_NAME 相关的镜像标签(包括带 localhost 前缀的)
|
||||
podman images --format "{{.Repository}}:{{.Tag}}" | grep -E "^(${IMAGE_NAME}|localhost/${IMAGE_NAME}):" | xargs -r podman rmi -f
|
||||
# 删除所有已退出的容器
|
||||
podman ps -a --format "{{.ID}}" --filter status=exited | xargs -r podman rm
|
||||
# 删除所有悬空镜像(dangling images)
|
||||
podman images --filter "dangling=true" -q | xargs -r podman rmi -f
|
||||
# 清理构建缓存
|
||||
podman system prune -f
|
||||
}
|
||||
|
||||
# 显示使用帮助信息
|
||||
show_help() {
|
||||
cat << EOF
|
||||
Usage: $0 [COMMAND] [TAG]
|
||||
|
||||
Docker 镜像构建和清理脚本
|
||||
|
||||
COMMANDS:
|
||||
build [tag] 构建镜像,可选择性指定标签,如未指定则自动生成
|
||||
clean 清理工作空间,删除相关镜像和无用容器
|
||||
help 显示此帮助信息
|
||||
|
||||
EXAMPLES:
|
||||
$0 build # 构建镜像,使用自动生成的标签
|
||||
$0 build mytag # 构建镜像,使用指定标签
|
||||
$0 clean # 清理工作空间
|
||||
$0 help # 显示帮助信息
|
||||
|
||||
DESCRIPTION:
|
||||
该脚本用于构建 alpine 镜像,支持自动生成标签,包含清理功能。
|
||||
构建的镜像名称为 ${IMAGE_NAME},默认会同时生成 latest 标签。
|
||||
脚本会根据当前系统架构自动构建对应架构的镜像,并设置 APP_VER 参数(自动去除v前缀):
|
||||
- 根据当前系统架构自动选择平台(linux/amd64, linux/arm64, linux/arm/v7 等)
|
||||
- 当在命令中指定TAG时,APP_VER使用相同的TAG值(去除v前缀)
|
||||
- 主分支(master/main)时使用 latest
|
||||
- 其他分支时使用分支名
|
||||
- 标签提交时使用标签名(去除v前缀)
|
||||
EOF
|
||||
}
|
||||
|
||||
# 主函数
|
||||
main() {
|
||||
case "$1" in
|
||||
build) build "$2" ;; # 传递第二个参数作为标签
|
||||
clean) clean ;;
|
||||
help|-h|--help) show_help ;;
|
||||
*)
|
||||
if [ -z "$1" ]; then
|
||||
show_help
|
||||
else
|
||||
echo "Error: Unknown command '$1'"
|
||||
echo ""
|
||||
show_help
|
||||
# 引入本地构建脚本
|
||||
if [ -f ".ci/common/build_local.sh" ]; then
|
||||
# 执行本地构建脚本并传递参数
|
||||
exec ".ci/common/build_local.sh" "$@"
|
||||
else
|
||||
echo "Error: .ci/common/build_local.sh script not found!"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
main "$@"
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user