From aba37293351674a7f3809d4c021fb68844061086 Mon Sep 17 00:00:00 2001 From: R2m1liA <15258427350@163.com> Date: Thu, 6 Nov 2025 17:45:02 +0800 Subject: [PATCH] =?UTF-8?q?build:=20doker=E9=95=9C=E5=83=8F=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E6=97=B6=E8=AE=B0=E5=BD=95=E6=9E=84=E5=BB=BA=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=B8=8Egitcommit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 镜像构建时会向项目目录内的version.json写入构建时间与commit-sha,并在镜像启动时输出日志 - 添加用于获取版本号的server api --- Dockerfile | 12 ++++++++- docker-build.sh | 63 +++++++++++++++++++++++++++++++++++++++++++ entrypoint.sh | 9 +++++++ server/api/version.ts | 16 +++++++++++ 4 files changed, 99 insertions(+), 1 deletion(-) create mode 100755 docker-build.sh create mode 100644 entrypoint.sh create mode 100644 server/api/version.ts diff --git a/Dockerfile b/Dockerfile index 4ead711..08c78d5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -32,10 +32,20 @@ WORKDIR /app # COPY .output folder COPY --from=build /app/.output ./ + +ARG BUILD_TIME +ARG GIT_COMMIT + +RUN echo "{\"buildTime\":\"$BUILD_TIME\",\"gitCommit\":\"$GIT_COMMIT\"}" > /app/version.json + + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + ENV PORT=3000 ENV NITRO_PRESET=node-server ENV HOST=0.0.0.0 EXPOSE 3000 - +ENTRYPOINT ["/entrypoint.sh"] CMD ["node", "/app/server/index.mjs"] diff --git a/docker-build.sh b/docker-build.sh new file mode 100755 index 0000000..5ce0250 --- /dev/null +++ b/docker-build.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ========== 脚本配置 ========== +# +IMAGE_NAME="git.jinshen.cn/remilia/jinshen-website" # 含仓库前缀的镜像名称 +DOCKERFILE="Dockerfile" # Dockerfile 文件路径 +BUILD_CONTEXT="." # 构建上下文路径 +PUSH_IMAGE=true # 是否推送镜像到远程仓库 +DOCKER_LOGIN=false # 是否需要登录 Docker 仓库 +REGISTRY_USER="" #Docker 仓库用户名 +REGISTRY_PASSWORD="" #Docker 仓库密码 + +# ============================== + +# 生成时间戳TAG +TIMESTAMP_TAG=$(date +'%Y%m%d%H%M%S') +BUILD_TIME=$(date +"%Y-%m-%d %H:%M:%S") +GIT_COMMIT=$(git rev-parse --short HEAD || echo "unknown") + +echo "📦 构建镜像: ${IMAGE_NAME}" +echo "⏱️ 时间戳标签: ${TIMESTAMP_TAG}" +echo "🔖 Git 提交: ${GIT_COMMIT}" +echo "⭐ 同时构建 latest 标签" + +# docker login(如果启用) +if [ "$DOCKER_LOGIN" = true ]; then + if [ -z "$REGISTRY_PASSWORD" ]; then + echo "❌ 登录失败:启用了 DOCKER_LOGIN,但 REGISTRY_PASSWORD 为空" + exit 1 + fi + echo "🔐 正在登录 Docker Registry..." + echo "$REGISTRY_PASSWORD" | docker login "$(echo "$IMAGE_NAME" | cut -d'/' -f1)" \ + --username "$REGISTRY_USER" --password-stdin +fi + +# 根据是否推送决定 buildx 参数 +if [ "$PUSH_IMAGE" = true ]; then + BUILDX_MODE="--push" + echo "🚀 将构建并推送镜像到仓库" +else + BUILDX_MODE="--load" + echo "🛠️ 仅本地构建镜像(不推送)" +fi + +# 构建镜像(带 version metadata) +docker buildx build \ + -t "${IMAGE_NAME}:${TIMESTAMP_TAG}" \ + -t "${IMAGE_NAME}:latest" \ + --build-arg BUILD_TIME="$BUILD_TIME" \ + --build-arg GIT_COMMIT="$GIT_COMMIT" \ + -f "$DOCKERFILE" "$BUILD_CONTEXT" \ + $BUILDX_MODE + + +echo "🎉 镜像构建完成!" +echo "📌 可用镜像:" +echo " - ${IMAGE_NAME}:${TIMESTAMP_TAG}" +echo " - ${IMAGE_NAME}:latest" + +if [ "$PUSH_IMAGE" = false ]; then + echo "⚠️ 镜像未推送(PUSH_IMAGE=false)" +fi diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..cd8c90f --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,9 @@ +#!/bin/sh +echo "Starting Nuxt App..." +if [ -f "/app/version.json" ]; then + echo "Version info:" + cat /app/version.json +else + echo "⚠️ version.json not found!" +fi +exec "$@" diff --git a/server/api/version.ts b/server/api/version.ts new file mode 100644 index 0000000..b308568 --- /dev/null +++ b/server/api/version.ts @@ -0,0 +1,16 @@ +import { existsSync, readFileSync } from 'fs'; +import { execSync } from 'child_process'; + +export default defineEventHandler(() => { + const path = process.cwd() + '/version.json'; + + if (existsSync(path)) { + return JSON.parse(readFileSync(path, 'utf-8')); + } + + return { + buildTime: new Date().toISOString(), + gitCommit: execSync('git rev-parse --short HEAD').toString().trim(), + generated: true, + }; +}); -- 2.49.0