From e8d70fcef151bf74a9394420654708913e994042 Mon Sep 17 00:00:00 2001 From: Endial Fang Date: Fri, 23 Jan 2026 09:33:35 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BF=AE=E5=A4=8Dnginx=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E8=B0=83=E7=94=A8=E9=94=99=E8=AF=AF=E5=B9=B6=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E5=88=B0=E6=96=B0=E7=89=88=E6=9E=B6=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复Dockerfile中脚本调用缺少完整路径问题 - 修复customer脚本中错误的/colovu/lib/路径引用 - 升级build.sh采用新版build_local.sh架构 - 更新nginx版本从1.29.3升级到1.29.4 - 更新overrides脚本文件名匹配版本号 - 统一架构检测使用TARGETARCH变量 --- .ci/common | 2 +- Dockerfile | 18 +- TODO.md | 15 ++ build.sh | 181 ++---------------- customer/usr/local/bin/common.sh | 14 +- customer/usr/local/bin/entry.sh | 2 +- customer/usr/local/bin/run.sh | 2 +- customer/usr/local/bin/setup.sh | 6 +- ...verrides-1.24.0.sh => overrides-1.29.4.sh} | 0 9 files changed, 52 insertions(+), 188 deletions(-) create mode 100644 TODO.md rename customer/usr/local/overrides/{overrides-1.24.0.sh => overrides-1.29.4.sh} (100%) diff --git a/.ci/common b/.ci/common index 6e0b044..b0ca0dc 160000 --- a/.ci/common +++ b/.ci/common @@ -1 +1 @@ -Subproject commit 6e0b04499e56e6dfec374994a82dfbfc29230042 +Subproject commit b0ca0dc3a34e7e851197bb4825d5a79a55d4613d diff --git a/Dockerfile b/Dockerfile index 7e73c22..024e12f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,7 +19,7 @@ # 软件包本地服务器: http://pkgs.colovu.com/dist ARG APP_NAME=nginx -ARG APP_VER=1.29.3 +ARG APP_VER=1.29.4 ARG REGISTRY_URL="swr.cn-north-4.myhuaweicloud.com/colovu/" ARG APT_SOURCE=aliyun ARG LOCAL_URL="" @@ -35,10 +35,10 @@ ARG LOCAL_URL ARG TARGETARCH # 选择软件包源,加速后续软件包安装 -RUN select_source ${APT_SOURCE}; +RUN /usr/local/sbin/select_source ${APT_SOURCE}; # 安装依赖的软件包及库 -RUN install_pkg libperl-dev \ +RUN /usr/local/sbin/install_pkg libperl-dev \ libpcre2-32-0 libpcre2-16-0 libpcre2-posix3 libpcre2-dev \ zlib1g zlib1g-dev \ libxslt1.1 libxslt1-dev \ @@ -46,18 +46,18 @@ RUN install_pkg libperl-dev \ libxml2 libxml2-dev \ geoip-bin geoip-database libgeoip-dev -# 下载并解压软件包 nginx: https://nginx.org/download/nginx-1.29.3.tar.gz +# 下载并解压软件包 nginx: https://nginx.org/download/nginx-1.29.4.tar.gz RUN set -eux; \ appName="${APP_NAME}-${APP_VER}.tar.gz"; \ [ -n ${LOCAL_URL} ] && localURL=${LOCAL_URL}/${APP_NAME}; \ appUrls="${localURL:-} \ http://nginx.org/download \ "; \ - download_pkg unpack ${appName} "${appUrls}"; + /usr/local/sbin/download_pkg unpack ${appName} "${appUrls}"; # 源码编译: 编译后将配置文件模板拷贝至 /usr/local/${app_name}/share/${app_name} 中 RUN set -eux; \ - APP_ARCH=`arch` \ + APP_ARCH=${TARGETARCH:-$(dpkg --print-architecture)}; \ APP_SRC="/tmp/${APP_NAME}-${APP_VER}"; \ cd ${APP_SRC}; \ LDFLAGS="-L/usr/local/lib -L/usr/lib/${APP_ARCH}-linux-gnu" \ @@ -167,9 +167,9 @@ RUN set -eux; \ \ /bin/bash -c "ln -sf /usr/local/${APP_NAME}/etc/${APP_NAME} /etc/"; \ \ - select_source ${APT_SOURCE}; \ + /usr/local/sbin/select_source ${APT_SOURCE}; \ \ - install_pkg `cat /usr/local/${APP_NAME}/runDeps`; \ + /usr/local/sbin/install_pkg `cat /usr/local/${APP_NAME}/runDeps`; \ \ overrideShell="/usr/local/overrides/overrides-${APP_VER}.sh"; \ [ -e "${overrideShell}" ] && /bin/bash "${overrideShell}"; \ @@ -183,7 +183,7 @@ EXPOSE 80 443 #HEALTHCHECK NONE #HEALTHCHECK --interval=30s --timeout=30s --retries=3 CMD curl -fs http://localhost:8080/ || exit 1 -HEALTHCHECK --interval=10s --timeout=10s --retries=3 CMD netstat -ltun | grep 8080 +HEALTHCHECK --interval=10s --timeout=10s --retries=3 CMD netstat -ltun | grep 80 # 使用 dumb-init 启动入口 Shell,确保容器可以接收控制信号;并使用前台方式启动应用程序 ENTRYPOINT ["dumb-init", "entry.sh"] diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..381b697 --- /dev/null +++ b/TODO.md @@ -0,0 +1,15 @@ +1.28.1 +1.29.4 + + +Dynamic Modules +Main nginx package is built with all modules that do not require additional libraries to avoid extra dependencies. Since version 1.9.11, nginx supports dynamic modules and the following modules are built as dynamic and shipped as separate packages: +nginx-module-geoip +nginx-module-image-filter +nginx-module-njs +nginx-module-perl +nginx-module-xslt +Additionally, since version 1.25.3, the following module is shipped as a separate package: +nginx-module-otel +Additionally, since version 1.29.1, the following module is shipped as a separate package: +nginx-module-acme diff --git a/build.sh b/build.sh index 931fd9f..8016c2f 100755 --- a/build.sh +++ b/build.sh @@ -1,175 +1,24 @@ #!/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="nginx" # 依赖镜像的仓库地址 -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 -} +fi + -main "$@" diff --git a/customer/usr/local/bin/common.sh b/customer/usr/local/bin/common.sh index 4f333f8..afe7162 100644 --- a/customer/usr/local/bin/common.sh +++ b/customer/usr/local/bin/common.sh @@ -3,14 +3,14 @@ # # 应用通用业务处理函数 -. /colovu/lib/libcommon.sh # 通用函数库 +. /usr/local/lib/libcommon.sh # 通用函数库 -. /colovu/lib/libfile.sh -. /colovu/lib/libfs.sh -. /colovu/lib/liblog.sh -. /colovu/lib/libos.sh -. /colovu/lib/libservice.sh -. /colovu/lib/libvalidations.sh +. /usr/local/lib/libfile.sh +. /usr/local/lib/libfs.sh +. /usr/local/lib/liblog.sh +. /usr/local/lib/libos.sh +. /usr/local/lib/libservice.sh +. /usr/local/lib/libvalidations.sh # 检测应用相应的配置文件是否存在,如果不存在,则从默认配置文件目录拷贝一份 # 默认配置文件路径:/etc/${APP_NAME} diff --git a/customer/usr/local/bin/entry.sh b/customer/usr/local/bin/entry.sh index 18bbc8b..e613cd6 100755 --- a/customer/usr/local/bin/entry.sh +++ b/customer/usr/local/bin/entry.sh @@ -7,7 +7,7 @@ # -e: 命令执行错误则报错(errexit); -u: 变量未定义则报错(nounset); -x: 打印实际待执行的命令行; -o pipefail: 设置管道中命令遇到失败则报错 set -euo pipefail -. /colovu/lib/libcommon.sh # 加载通用函数库 +. /usr/local/lib/libcommon.sh # 加载通用函数库 . /usr/local/bin/environment.sh # 设置环境变量 diff --git a/customer/usr/local/bin/run.sh b/customer/usr/local/bin/run.sh index 91a0cdc..22e237f 100755 --- a/customer/usr/local/bin/run.sh +++ b/customer/usr/local/bin/run.sh @@ -7,7 +7,7 @@ # -e: 命令执行错误则报错(errexit); -u: 变量未定义则报错(nounset); -x: 打印实际待执行的命令行; -o pipefail: 设置管道中命令遇到失败则报错 set -euo pipefail -. /colovu/lib/liblog.sh # 日志输出函数库 +. /usr/local/lib/liblog.sh # 日志输出函数库 . /usr/local/bin/environment.sh # 设置环境变量 diff --git a/customer/usr/local/bin/setup.sh b/customer/usr/local/bin/setup.sh index 065da69..7f45b80 100755 --- a/customer/usr/local/bin/setup.sh +++ b/customer/usr/local/bin/setup.sh @@ -7,9 +7,9 @@ # -e: 命令执行错误则报错(errexit); -u: 变量未定义则报错(nounset); -x: 打印实际待执行的命令行; -o pipefail: 设置管道中命令遇到失败则报错 set -euo pipefail -. /colovu/lib/libcommon.sh # 加载通用函数库 -. /colovu/lib/libfs.sh # 加载文件操作函数库 -. /colovu/lib/libos.sh # 加载系统管理函数库 +. /usr/local/lib/libcommon.sh # 加载通用函数库 +. /usr/local/lib/libfs.sh # 加载文件操作函数库 +. /usr/local/lib/libos.sh # 加载系统管理函数库 . /usr/local/bin/environment.sh # 设置环境变量 . /usr/local/bin/common.sh # 应用专用函数库 diff --git a/customer/usr/local/overrides/overrides-1.24.0.sh b/customer/usr/local/overrides/overrides-1.29.4.sh similarity index 100% rename from customer/usr/local/overrides/overrides-1.24.0.sh rename to customer/usr/local/overrides/overrides-1.29.4.sh