52 lines
2.0 KiB
Docker
52 lines
2.0 KiB
Docker
# 基础镜像走 DaoCloud(避免 docker.1ms.run 等加速站缺 node/nginx manifest)
|
||
ARG NODE_IMAGE=docker.m.daocloud.io/library/node:20-alpine
|
||
ARG NGINX_IMAGE=docker.m.daocloud.io/library/nginx:1.27-alpine
|
||
|
||
FROM ${NODE_IMAGE} AS builder
|
||
|
||
ARG NPM_REGISTRY=https://registry.npmmirror.com
|
||
ARG PNPM_VERSION=9.15.4
|
||
ARG NODE_MAX_OLD_SPACE_SIZE=4096
|
||
ENV NODE_OPTIONS="--max-old-space-size=${NODE_MAX_OLD_SPACE_SIZE}"
|
||
# 构建阶段须安装 devDependencies(vite 等);勿设 NODE_ENV=production
|
||
ENV HUSKY=0
|
||
|
||
# 国内机器勿用 registry.npmjs.org;先走镜像元数据,失败再直装 tarball
|
||
RUN set -eux; \
|
||
npm config set registry "${NPM_REGISTRY}"; \
|
||
npm config set fetch-retries 5; \
|
||
npm config set fetch-retry-mintimeout 60000; \
|
||
npm config set fetch-retry-maxtimeout 600000; \
|
||
npm config set fetch-timeout 600000; \
|
||
if ! npm install -g "pnpm@${PNPM_VERSION}"; then \
|
||
echo "npm 元数据安装 pnpm 失败,尝试 tarball: ${NPM_REGISTRY}/pnpm/-/pnpm-${PNPM_VERSION}.tgz"; \
|
||
npm install -g "${NPM_REGISTRY}/pnpm/-/pnpm-${PNPM_VERSION}.tgz"; \
|
||
fi; \
|
||
pnpm --version
|
||
|
||
WORKDIR /app
|
||
|
||
COPY web-admin/package.json web-admin/pnpm-lock.yaml ./
|
||
# BuildKit 缓存 pnpm store;提高 fetch 重试与超时,缓解 npmmirror ETIMEDOUT
|
||
RUN --mount=type=cache,id=zkxw-pnpm-store,target=/root/.local/share/pnpm/store \
|
||
pnpm config set registry "${NPM_REGISTRY}" \
|
||
&& pnpm config set fetch-retries 5 \
|
||
&& pnpm config set fetch-retry-mintimeout 60000 \
|
||
&& pnpm config set fetch-retry-maxtimeout 600000 \
|
||
&& pnpm config set network-timeout 600000 \
|
||
&& pnpm install --frozen-lockfile
|
||
|
||
COPY web-admin/ .
|
||
# docker 模式:esbuild 压缩 + 关闭 devtools/预压缩,降低构建内存(见 vite.config.ts)
|
||
RUN pnpm exec vite build --mode docker
|
||
|
||
FROM ${NGINX_IMAGE}
|
||
|
||
COPY deploy/docker/nginx/default.conf /etc/nginx/conf.d/default.conf
|
||
COPY --from=builder /app/dist /usr/share/nginx/html
|
||
|
||
EXPOSE 80
|
||
|
||
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
||
CMD wget -qO- http://127.0.0.1/ || exit 1
|