Docker
Vite+ publica una imagen oficial de Docker con la CLI vp preinstalada:
ghcr.io/voidzero-dev/vite-plusÚsala para compilaciones, CI y devcontainers. No está pensada como una imagen de ejecución (runtime) para producción.
vp resuelve la versión de Node.js a partir de tu proyecto (.node-version, devEngines.runtime o engines.node) y descarga esa versión exacta durante la instalación/compilación. Esto significa que la imagen no necesita etiquetas específicas para la versión de Node.
Para producción, utiliza una compilación multi-etapa (multi-stage): compila la aplicación con la imagen de Vite+, luego copia solo el binario de Node.js resuelto, el resultado de la compilación y las dependencias de producción en una imagen de ejecución más pequeña.
Etiquetas de imagen (Image tags)
Las etiquetas rastrean la versión de vp:
| Etiqueta | Significado |
|---|---|
ghcr.io/voidzero-dev/vite-plus:latest | Última versión |
ghcr.io/voidzero-dev/vite-plus:<major> | Última versión mayor |
ghcr.io/voidzero-dev/vite-plus:<major>.<minor> | Última versión menor |
ghcr.io/voidzero-dev/vite-plus:<major>.<minor>.<patch> | Versión exacta |
Los ejemplos utilizan :latest para rastrear la versión más reciente; fija una etiqueta exacta o un digest si necesitas compilaciones reproducibles. La imagen se publica para linux/amd64 y linux/arm64 y se ejecuta como un usuario no root por defecto.
Explora todas las versiones y digests publicados en la página del paquete de GitHub.
Producción: SSR / Aplicación de servidor Node.js
Para aplicaciones que ejecutan Node.js en producción (SvelteKit, Nuxt, un servidor SSR personalizado de Vite, etc.), compila con la imagen del toolchain y copia el Node.js resuelto y la aplicación compilada en una etapa de ejecución slim:
# syntax=docker/dockerfile:1
# --- build stage: la imagen oficial del toolchain de Vite+ ---
FROM ghcr.io/voidzero-dev/vite-plus:latest AS build
WORKDIR /app
# Instala primero las dependencias para que esta capa se almacene en caché tras cambios en el código fuente.
COPY --chown=vp:vp package.json pnpm-lock.yaml pnpm-workspace.yaml .node-version* ./
RUN vp install --frozen-lockfile
# Compila. vp lee .node-version y aprovisiona ese Node.js exacto automáticamente.
COPY --chown=vp:vp . .
RUN vp build
# Exporta el binario exacto de Node.js resuelto para la etapa de ejecución.
RUN cp "$(vp env which node | head -1)" /tmp/node
# --- deps stage: dependencias solo de producción ---
# Una instalación fresh y separada con `--prod` para excluir las devDependencies (incluyendo el toolchain
# de vite-plus). Ejecutar `--prod` sobre la instalación completa anterior no purgaría las devDependencies
# ya instaladas.
FROM ghcr.io/voidzero-dev/vite-plus:latest AS deps
WORKDIR /app
COPY --chown=vp:vp package.json pnpm-lock.yaml pnpm-workspace.yaml .node-version* ./
RUN vp install --frozen-lockfile --prod
# --- runtime stage: pequeña, glibc, sin vp ---
FROM debian:bookworm-slim AS runtime
WORKDIR /app
ENV NODE_ENV=production
# El Node.js exacto de .node-version (compilación oficial con firma verificada).
COPY --from=build /tmp/node /usr/local/bin/node
COPY --from=build /app/dist ./dist
COPY --from=deps /app/node_modules ./node_modules
COPY --from=build /app/package.json ./
USER nobody
EXPOSE 3000
CMD ["node", "dist/server.js"]La imagen desplegada contiene únicamente Node.js junto con tu aplicación y las dependencias de producción, coincidiendo exactamente con el archivo .node-version. Es mucho más pequeña que la imagen predeterminada node:*; consulta el consejo de distroless a continuación para obtener el resultado más pequeño.
Purga las dependencias de producción en una etapa separada
Instala las dependencias de producción en su propia etapa deps como se muestra. Ejecutar vp install --prod después de un vp install completo en la misma etapa no elimina las devDependencies ya instaladas, por lo que el toolchain de vite-plus se copiaría a la imagen de ejecución. Si el bundle de tu servidor es completamente autocontenido (sin dependencias de ejecución no empaquetadas), puedes omitir por completo la copia de node_modules.
Aún más pequeño
Para un entorno de ejecución sin shell y con un mínimo de vulnerabilidades (CVEs), cambia la base de ejecución por distroless (gcr.io/distroless/cc) y mantén un ENTRYPOINT en forma de vector. Está basado en glibc, por lo que el binario de Node.js copiado sigue siendo compatible.
Producción: SPA estático / SSG
Un sitio estático no necesita Node.js en tiempo de ejecución; sirve la salida de la compilación con cualquier servidor estático:
FROM ghcr.io/voidzero-dev/vite-plus:latest AS build
WORKDIR /app
COPY --chown=vp:vp package.json pnpm-lock.yaml pnpm-workspace.yaml .node-version* ./
RUN vp install --frozen-lockfile
COPY --chown=vp:vp . .
RUN vp build
FROM nginx:alpine AS runtime
COPY --from=build /app/dist /usr/share/nginx/htmlIntegración continua
Usa la imagen directamente en entornos de CI basados en contenedores (GitLab CI, Buildkite, CircleCI, Jenkins, entre otros):
build:
image: ghcr.io/voidzero-dev/vite-plus:latest
script:
- vp install --frozen-lockfile
- vp check
- vp test
- vp buildEn GitHub Actions, prefiere setup-vp en lugar de la imagen.
Devcontainers
Usa la imagen como un contenedor de desarrollo listo para usar con el toolchain preinstalado:
{
"image": "ghcr.io/voidzero-dev/vite-plus:latest",
}Uso ad-hoc
Ejecuta cualquier comando vp en un proyecto sin necesidad de instalar vp en tu máquina:
docker run --rm -it -v "$PWD:/app" -w /app ghcr.io/voidzero-dev/vite-plus vp buildNotas
- Versión de Node.js: se aprovisiona desde
.node-version,engines.nodeodevEngines.runtimeen tiempo de compilación, por lo que no existe una etiqueta de imagen específica para Node. La instrucciónCOPYde dependencias utiliza el patrón.node-version*para que el archivo sea opcional: los proyectos que fijan la versión medianteengines.node/devEngines.runtimeno necesitan un.node-version, y los que lo usan lo tienen disponible en todas las etapas. - Usuario no root: la imagen se ejecuta como el usuario no root
vp, así que copia los archivos fuente usandoCOPY --chown=vp:vp ...como se muestra. Sin esto,COPYescribe archivos propiedad de root quevp installno podrá actualizar (permiso denegado). - Complementos nativos (native addons): la imagen incluye un toolchain de compilación C/C++ (
build-essential,python3), por lo que las dependencias nativas comobetter-sqlite3se compilan durantevp install. - glibc: la imagen está basada en glibc, por lo que utiliza las compilaciones oficiales y con firma verificada de Node.js.
- Imagen base personalizada: para agregar
vpa tu propia imagen base, ejecuta el instalador:curl -fsSL https://vite.plus | bash(estableceVP_VERSIONpara fijar una versión).