You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
解决方案

问题核心在于两点:

  1. SvelteKit默认构建输出目录不是build
    使用@sveltejs/adapter-auto时,默认构建产物会输出到.svelte-kit/output目录,而非Dockerfile中期望的/app/build。

  2. 适配器依赖位置错误
    @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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:31:01