# 开源项目门户(VitePress)构建镜像 # # 构建参数: # SITE_BASE —— 站点资源前缀,同时决定容器内 nginx 的形态: # /www/ 子路径形态:挂在已有网关的 /www/ 路径下 # / 独立域名形态:站点独占域名根路径 # BASE_REGISTRY —— 基础镜像来源,默认官方 docker.io 的 library 命名空间。 # 部分内网机器拉不动 docker.io(实测 192.168.101.164 直连 # registry-1.docker.io 超时),换代理源即可: # docker build --build-arg BASE_REGISTRY=docker.m.daocloud.io/library ... # 形如 /<命名空间段>,需包含镜像自身的命名空间 # (如 docker.io/library、docker.m.daocloud.io/library)。 # # 用法(仓库根目录): # docker build -t snowgoat-open-portal:dev \ # --build-arg SITE_BASE=/ \ # --build-arg BASE_REGISTRY=docker.m.daocloud.io/library . ARG BASE_REGISTRY=docker.io/library # 统一补上结尾斜杠,调用方传 "docker.m.daocloud.io/library" 或带斜杠都能拼对 FROM ${BASE_REGISTRY%/}/node:22-alpine AS builder ARG SITE_BASE=/www/ ARG BASE_REGISTRY RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ && apk add --no-cache git WORKDIR /app COPY package*.json .npmrc ./ RUN npm ci COPY . . RUN SITE_BASE=${SITE_BASE} npm run build FROM ${BASE_REGISTRY%/}/nginx:1.27-alpine ARG SITE_BASE=/www/ ARG BASE_REGISTRY COPY --from=builder /app/.vitepress/dist /usr/share/nginx/html COPY docker/nginx.root.conf /etc/nginx/conf.d/default.conf COPY docker/nginx.prefix.conf /tmp/nginx.prefix.conf RUN set -eu; \ base="${SITE_BASE%/}"; \ if [ "$base" = "" ]; then \ echo "门户形态:独立域名(根路径)"; \ else \ sed -e "s|__SITE_BASE__|${SITE_BASE}|g" -e "s|__SITE_BASE_NO_SLASH__|${base}|g" \ /tmp/nginx.prefix.conf > /etc/nginx/conf.d/default.conf; \ echo "门户形态:子路径 ${SITE_BASE}"; \ fi EXPOSE 80