如何从 Sveltekit 应用程序构建 Docker 映像

Pre*_*cks 5 docker sveltekit

我正在尝试从我在 Sveltekit 中创建的示例应用程序构建 docker 映像。

我正在使用 @sveltejs/adapter-auto 并在我的路由文件夹中包含了用于 API 调用的 .js 文件和 .svelte 文件。

这是我的 Dockerfile(构建得很好,但可能不正确)

FROM node:14.15.0 as build

# install dependencies
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci

# Copy all local files into the image.
COPY . .

RUN npm run build

###
# Only copy over the Node pieces we need
# ~> Saves 35MB
###
FROM node:14.15.0

WORKDIR /app
COPY --from=build /app/.svelte-kit/build/. .


EXPOSE 3000
CMD ["node", "./app.js"]
Run Code Online (Sandbox Code Playgroud)

当我尝试从 docker 映像运行容器时,收到错误输出

(node:1) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/app/app.js:1
import { respond } from '@sveltejs/kit/ssr';
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:979:16)
    at Module._compile (internal/modules/cjs/loader.js:1027:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47
Run Code Online (Sandbox Code Playgroud)

我的 package.json 确实包含"type": "module"

{
  "name": "backendtest",
  "version": "0.0.1",
  "scripts": {
    "dev": "svelte-kit dev",
    "build": "svelte-kit build",
    "package": "svelte-kit package",
    "preview": "svelte-kit preview",
    "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. .",
    "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. ."
  },
  "devDependencies": {
    "@sveltejs/adapter-auto": "next",
    "@sveltejs/kit": "next",
    "prettier": "^2.4.1",
    "prettier-plugin-svelte": "^2.4.0",
    "svelte": "^3.44.0"
  },
  "type": "module",
  "dependencies": {
    "dotenv": "^10.0.0",
    "mongodb": "^4.2.1"
  }
}

Run Code Online (Sandbox Code Playgroud)

当我尝试npm run build在本地构建环境中运行时,我收到了消息。

Using @sveltejs/adapter-auto
  Could not detect a supported production environment. See https://kit.svelte.dev/docs#adapters to learn how to configure your app to run on the platform of your choosing
Run Code Online (Sandbox Code Playgroud)

由于我是 svelte 的新手,不确定这是否正确。

如果我尝试使用节点适配器,则会收到错误

config.kit.adapter should be an object with an "adapt" method. See https://kit.svelte.dev/docs#adapters
Error: config.kit.adapter should be an object with an "adapt" method. See https://kit.svelte.dev/docs#adapters
    at file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:391:12
    at file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:599:43
    at file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:585:18
    at file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:585:18
    at validate_config (file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:739:9)
    at load_config (file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:704:20)
    at async get_config (file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:774:10)
    at async file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:884:18
Run Code Online (Sandbox Code Playgroud)

这是我的 svelte.config.js 内容

import adapter from '@sveltejs/adapter-node';

/** @type {import('@sveltejs/kit').Config} */
const config = {
    kit: {
        adapter: adapter(),

        // hydrate the <div id="svelte"> element in src/app.html
        target: '#svelte'
    }
};

export default config;

Run Code Online (Sandbox Code Playgroud)

我还按照 github 文档尝试了以下 svelte.config.js,但得到了相同的“adapt”错误

import adapter from '@sveltejs/adapter-node';

/** @type {import('@sveltejs/kit').Config} */
const config = {
  kit: {
    adapter: adapter({
      // default options are shown
      out: 'build',
      precompress: false,
      env: {
        host: 'HOST',
        port: 'PORT',
      },
    }),
  },
};

export default config;
Run Code Online (Sandbox Code Playgroud)

Que*_*ino 6

您应该将您的包含package.json在最终的 Docker 映像中。

编辑:另外,我不确定您应该使用 .svelte-kit/build 因为这是 sveltekit 内部使用的中间结果。运行构建任务后,您应该有一个构建文件夹,但我不确定,因为我从未使用过自动适配器,我通常使用节点适配器。

我的基本上是这样的:

COPY --from=build /app/package.json /app/build /.
CMD ["node", "index.js"]
Run Code Online (Sandbox Code Playgroud)

  • 您安装了下一版本的适配器节点吗?`npm i -D @sveltejs/adapter-node@next` (2认同)