SvelteKit项目Docker化失败:build目录未找到求助
问题
本地运行正常的小型空SvelteKit模板项目,Docker化时提示找不到build目录,相关文件及错误日志如下:
Dockerfile
FROM node:lts-slim AS deps WORKDIR /app COPY package.json pnpm-lock.yaml ./ RUN npx pnpm i --frozen-lockfile FROM node:lts-slim AS builder WORKDIR /app COPY . . COPY --from=deps /app/node_modules ./node_modules RUN npx pnpm run build FROM node:lts-slim AS runner WORKDIR /app ENV NODE_ENV production RUN useradd -u 1001 -s /usr/sbin/nologin -m -d /home/sveltekit sveltekit RUN groupadd nodejs && usermod -aG nodejs sveltekit COPY --from=builder --chown=sveltekit:nodejs /app/build ./build COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package.json ./package.json USER sveltekit EXPOSE 3000 CMD ["node", "./build"]
package.json
{ "name": "sveltekit-docker", "version": "0.0.1", "private": true, "scripts": { "dev": "vite dev", "build": "vite build", "preview": "vite preview", "lint": "prettier --check . && eslint .", "format": "prettier --write ." }, "devDependencies": { "@sveltejs/adapter-auto": "^3.0.0", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0", "@types/eslint": "^8.56.0", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-svelte": "^2.35.1", "prettier": "^3.1.1", "prettier-plugin-svelte": "^3.1.2", "svelte": "^4.2.7", "vite": "^5.0.3" }, "type": "module" }
错误日志
bob ~/code/sveltekit_docker [main] $ docker build -t sd --no-cache . [+] Building 8.9s (15/17) docker:desktop-linux => [internal] load build definition from Dockerfile 0.0s ... lines without errors omitted.... => [deps 4/4] RUN npx pnpm i --frozen-lockfile 4.1s => [builder 4/5] COPY --from=deps /app/node_modules ./node_modules 0.3s => [builder 5/5] RUN npx pnpm run build 3.1s => ERROR [runner 5/7] COPY --from=builder --chown=sveltekit:nodejs /app/ 0.0s ------ [runner 5/7] COPY --from=builder --chown=sveltekit:nodejs /app/build ./build: ------ Dockerfile:18 -------------------- 16 | RUN useradd -u 1001 -s /usr/sbin/nologin -m -d /home/sveltekit sveltekit 17 | RUN groupadd nodejs && usermod -aG nodejs sveltekit 18 | >>> COPY --from=builder --chown=sveltekit:nodejs /app/build ./build 19 | COPY --from=builder /app/node_modules ./node_modules 20 | COPY --from=builder /app/package.json ./package.json -------------------- ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref 7b0a430b-35d6-4fc8-a6dd-db95ac242422::eeh419kyu0c4wj7k9gabjqe4w: "/app/build": not found
解决方案
问题核心在于两点:
SvelteKit默认构建输出目录不是
build
使用@sveltejs/adapter-auto时,默认构建产物会输出到.svelte-kit/output目录,而非Dockerfile中期望的/app/build。适配器依赖位置错误
@sveltejs/adapter-auto被放在devDependencies中,生产镜像构建时会被忽略,导致无法生成可运行的产物目录。
修复步骤:
步骤1:配置构建输出目录
在项目根目录创建svelte.config.js,指定构建输出为build目录:
// svelte.config.js import adapter from '@sveltejs/adapter-auto'; import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; /** @type {import('@sveltejs/kit').Config} */ const config = { preprocess: vitePreprocess(), kit: { adapter: adapter({ out: 'build' }) } }; export default config;
同时修改package.json,将@sveltejs/adapter-auto移到dependencies中:
{ // ...其他内容 "dependencies": { "@sveltejs/adapter-auto": "^3.0.0" }, "devDependencies": { // ...其他依赖,移除@svletejs/adapter-auto } }
步骤2:修正Dockerfile
调整构建和运行阶段的逻辑,适配正确的产物目录和启动方式:
FROM node:lts-slim AS deps WORKDIR /app COPY package.json pnpm-lock.yaml ./ RUN npx pnpm i --frozen-lockfile FROM node:lts-slim AS builder WORKDIR /app COPY . . COPY --from=deps /app/node_modules ./node_modules RUN npx pnpm run build FROM node:lts-slim AS runner WORKDIR /app ENV NODE_ENV production RUN useradd -u 1001 -s /usr/sbin/nologin -m -d /home/sveltekit sveltekit RUN groupadd nodejs && usermod -aG nodejs sveltekit # 复制构建产物和package.json COPY --from=builder --chown=sveltekit:nodejs /app/build ./build COPY --from=builder --chown=sveltekit:nodejs /app/package.json ./package.json # 安装生产依赖 RUN npx pnpm i --prod --frozen-lockfile USER sveltekit EXPOSE 3000 # 启动SvelteKit产物 CMD ["node", "./build/index.js"]
步骤3:验证构建
重新执行Docker构建:
docker build -t sd --no-cache .
构建完成后运行容器测试:
docker run -p 3000:3000 sd
内容的提问来源于stack exchange,提问作者Robert Alexander
相关产品推荐
相关产品推荐

